后端一次给你10万条数据,你是提刀砍后端还是提桶跑路?

246 阅读3分钟

场景 :现在页面有一个列表,后端一次返回一万个数据给你

一.直接渲染

第一种就是直接在一个页面中渲染出来, 他大约需要十几秒,足够你关电脑了,因为你的电脑会卡死.显然这种方法是不可取的

二.分页渲染

使用分页是现在非常常见的方法,如果需要分页,需要使用from和size参数。

  • from参数定义了需要跳过的hits数,默认为0;
  • size参数定义了需要返回的hits数目的最大值。
  • 每页数量limit分成总共Math.ceil(total / limit)页,然后利用setTimeout,每次渲染1页数据,这样的话,渲染出首页数据的时间大大缩减了

三.文档碎片 + requestAnimationFrame

  • 文档碎片可以先把1页的div标签先放进文档碎片中,然后一次性appendChildcontainer中,这样减少了appendChild的次数,极大提高了性能
  • 页面只会渲染文档碎片包裹着的元素,而不会渲染文档碎片

四 .懒加载

在列表尾部放一个空节点blank,然后先渲染第1页数据,向上滚动,等到blank出现在视图中,就说明到底了,这时候再加载第二页,往后以此类推。

至于怎么判断blank出现在视图上,可以使用getBoundingClientRect方法获取top属性 IntersectionObserver 性能更好

4444.jpg

五.虚拟列表

什么是虚拟列表

虚拟列表就是只对可见区域进行渲染,对非可见区域中的数据不渲染或部分渲染,以实现减少消耗,提高用户体验的技术。它是长列表的一种优化方案,性能良好。

实现思路

(1)写一个代表可视区域的div,固定其高度,通过overflow使其允许纵向 Y 轴滚动。

(2)第二步,计算区域中可以显示的数据条数。这个可以用可视区域的高度除以单条数据高度得到。

(3)监听滚动,当滚动条变化时,计算出被卷起的数据的高度。

(4)计算区域内数据的起始索引,也就是区域内的第一条数据:这个用卷起的高度除以单条数据高度可以拿到。

(5)计算区域内数据的结束索引。通过起始索引+可显示的数据的条数可以拿到。

(6)取起始索引和结束索引中间的数据,渲染到可视区域。

(7)计算起始索引对应的数据在整个列表中的偏移位置并设置到列表上。

整个步骤下来,最终的效果是:不论怎么滚动,我们改变的只是滚动条的高度和可视区的元素内容。每次只会渲染一个固定的条数,不会增加多余元素

其实说了这么多,感觉还是没有直接去和后端提刀协商来的块

image.png