无限滚动页面| 青训营笔记

113 阅读1分钟

这是我参与「第四届青训营 」笔记创作活动的第30天

1、目的

仿掘金官网底部制作无限滚动文章页面

2、原理

1、创建一个IntersectionObserver 对象,用来监听元素实现无限滚动。模拟滚动到最下方时加载新数据

observer: new IntersectionObserver(
        (entries) => {
          if (!this.busy && entries[0].intersectionRatio > 0.75) {
            this.busy = true
            const p = new Promise((resolve, reject) => {
              this.loadMore()
              resolve()
            })
            p.then(() => {
              // 执行异步操作后的内容(目前没有)
            })
          }
        },

2、初始文章信息

image.png

3、当加载的文章过多时会有明显卡顿,这种情况下只拿出一部分来渲染

if (this.essays.length <= 24) {
        return this.essays
      }

4、模拟滚动到最下方时加载新数据,监听当前列表的最下部元素,更新后,如果使得文章列表长度发生变化,则重新监听最下方的元素

if (this.$refs.essaylist.childNodes.length != this.curEssaysLength) {
      this.observer.disconnect()
      this.observer.observe(this.$refs.essaylist.lastElementChild)
      this.busy = false
    }

3、效果 基本实现无限滚动页面的功能,但如果列表项中包含图片,并且列表高度由图片撑开。在这种场景下,由于图片会发送网络请求,列表项可能已经渲染到页面中了,但是图片还没有加载出来,此时无法保证我们在获取列表项真实高度时图片是否已经加载完成,获取到的高度有无包含图片高度,从而造成计算不准确的情况。 我们使用懒加载的方式,下拉到底部获取新的内容加载进来,其实就相当于是在垂直方向上的分页叠加功能,但随着加载数据越来越多,浏览器的回流和重绘的开销将会越来越大,整个滑动也会造成卡顿,后期考虑我们考虑使用虚拟列表来解决问题

image.png