虚拟列表的实现

本文最后更新于:2021/09/23 , 星期四 , 22:02

什么是虚拟列表

只渲染可是区域的列表节点,滚动的时候进行数据的动态替换。

实现步骤

  1. 计算出当前可视区域起始数据的索引 startIndex

  2. 计算出当前可视区域结束数据的索引 endIndex

  3. 计算出当前可视区域内的数据,并渲染

  4. 滚动发生时,计算 startIndex 对应的数据,在整个列表的偏移位置 startOffset ,并且更新到列表上

结构设计

  • 真正渲染的元素 virtual-list

  • 撑开高度的元素,保证滚动 virtual-list-phantom

  • 容器元素 virtual-list-container

监听滚动

监听 virtual-list-container 的滚动事件,获取滚动条到顶部的距离 scrollTop

需要准备的数据

可视区域的高度:screenHeight

列表项的高度:itemSize

列表数据:listData

当前的滚动位置:scrollTop

得出最终想要的数据

列表总高度:listHeight = itemSize * listData.length

可显示的列表项数:showedCount = Math.ceil(screenHeight / itemSize)

数据的起始索引:startIndex = Math.floor(scrollTop / itemSize)

数据的结束索引:endIndex = startIndex + showedCount

列表显示的数据:showedData = listData.slice(startIndex,endIndex)

偏移量(列表数据的第一个数据到现在开头数据的索引的差值)startOffset = scrollTop - (scrollTop % itemSize)

最终代码

Github


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!