VirtualList 滚动加载

2019-08-20wangkailang

当一个资源数据量很大时,一次加载数据会导致浏览器页面卡顿甚至崩溃,VirtualList 支持根据鼠标滚动加载数据,同时销毁超出数据的 DOM 结构,保证页面的流畅性。

基本用法#

  • rowRenderer 对列表中每行元素进行渲染,可做到动态布局(每列不等高时重新计算并重新渲染);
  • data 指要渲染资源数据,可结合 onQueryChange 做异步加载。

代码演示#

空数组#

加载新数据#

真实场景中鼠标滚动,页面下滑过程中会加载新的数据。

重新加载#

加载完成#

异步等高#

异步不等高#

row 不等高时需要计算调整,设置 isEstimatetrue

注意事项#

rowHeight函数动态改变返回高度并不会 rerender,需要主动触发 recomputeRowHeight 方法。

估计模式与 Debug#

对于高度无法完全确定的 row(如内容高度不固定等),依然需要给出一个较准确的 rowHeight。同时设置 isEstimate={true},VirtualList会在render结束后对可视dom进行计算,并与对应的 rowHeight 比较。如果实际高度与 rowHeight 指定高度不同,则会用实际高度 rerender,直至完全一致。

由于 VirtualList 已将 dom 数量控制在可控范围之内,因此遍历计算再重新渲染的开销在可承受范围内,但对于可以确定高度的列表仍然要避免使用估计模式。

同时估计模式提供 debug 参数方便开发时确定 dom 的真实高度。同时设置 isEstimate={true}debug={true},VirtualList 会打印真实高度与 rowHeight 不同的 row 对应的信息。

API#

参数类型默认值说明
rowHeightRequiredunion(func, number)-行高
rowRendererRequiredfunc-渲染 row UI
heightunion(string, number)'100%'可见高度
dataarray[]数据
isEstimatebool-是否开启计算
onQueryChangefunc-监听 query 改变
queryobject-确定异步数据的 offset 和 limit
totalCountnumber-总数
isFetchingbool-是否在获取数据
runwayItemsnumber50行高
runwayItemsOppsitenumber20行高
loaderunion(func, node)<p className="VirtualList__loader">数据加载中</p>数据加载中时展示
placeholderunion(func, node)<p className="VirtualList__placeholder">暂无数据</p>默认展示文本
noMorebool-是否展示没有多余的数据
noMoreHintunion(func, node)<p className="VirtualList__no-more-hint">没有更多信息</p>没有需要加载的数据时展示
debugbooltrueDebug