虚拟列表

3,108 阅读2分钟

什么是虚拟列表

虚拟列表其实是按需显示的一种实现,即只对可见区域进行渲染,对非可见区域中的数据不渲染或部分渲染的技术,从而达到极高的渲染性能。

假设有1万条记录需要同时渲染,我们屏幕的可见区域的高度为500px,而列表项的高度为50px,则此时我们在屏幕中最多只能看到10个列表项,那么在首次渲染的时候,我们只需加载10条即可。

说完首次加载,再分析一下当滚动发生时,我们可以通过计算当前滚动值得知此时在屏幕可见区域应该显示的列表项。

假设滚动发生,滚动条距顶部的位置为150px,则我们可得知在可见区域内的列表项为第4项至`第13项。

实现

虚拟列表的实现,实际上就是在首屏加载的时候,只加载可视区域内需要的列表项,当滚动发生时,动态通过计算获得可视区域内的列表项,并将非可视区域内存在的列表项删除。

  • 计算当前可视区域起始数据索引(startIndex)
  • 计算当前可视区域结束数据索引(endIndex)
  • 计算当前可视区域的数据,并渲染到页面中
  • 计算startIndex对应的数据在整个列表中的偏移位置startOffset并设置到列表上

那么问题来了,虚拟列表和懒加载有什么区别呢?

懒加载和虚拟列表的区别

懒加载是什么?

懒加载也叫延迟加载,指的是在长网页中延迟加载图像,是一种很好优化网页性能的方式

用户滚动到它们之前,可视区域外的图像不会加载。这与图像预加载相反,在长网页上使用延迟加载将使网页加载更快。在某些情况下,它还可以帮助减少服务器负载。常适用图片很多,页面很长的电商网站场景中。

而他们的区别是:

(1)懒加载偏向网络请求,虚拟列表重点解决渲染性能瓶颈问题。

(2)当你滑动很多屏的时候,如果使用懒加载,容器内的DOM会越来越多,性能不是很好;而虚拟列表容器内始终就一屏的数据在渲染。

参考

# 「前端进阶」高性能渲染十万条数据(虚拟列表)