有十万条数据,要渲染到页面上去,如何保证不卡主页面的情况下渲染数据?
核心观点:页面渲染要比 JS 执行慢得多
一般有两种做法:
原理:不一次性在页面插入所有 DOM,而是只插入一部分(至少覆盖可视区域),等一段时间再插入一部分,以此类推直到插入所有 DOM
这样可以将一个长任务打散成一些短任务,保证渲染引擎及时渲染
等一段时间:
requestAnimationFrame 保证回调函数在屏幕每一次的刷新间隔中被执行一次setTimeout,它无法保证DOM 插入:
DocumentFragment 避免频繁插入 DOM,以减少重排与重绘减少 DOM 数量,只有可视区域的 DOM,滚动时动态修改 DOM 的内容——"用有限的 DOM 来加载无限的数据"
![[Pasted image 20240425142725.png]]
[[004.定高虚拟列表|定高虚拟列表]] 实现的一个 item 高度固定且已知的 Demo,旨在理解其原理
不定高是指列表项高度不固定(如:根据内容撑开)
在虚拟列表中应用动态高度的解决方案一般有如下三种:
itemHeight 进行扩展,支持传递类型为数字、数组、函数
[50, 20, 100, 80, ...](index: number): number这种方式虽然有比较好的灵活度,但仅适用于可以预先知道或可以通过计算得知列表项高度的情况,依然无法解决列表项高度由内容撑开的情况。
由于预先渲染至屏幕外,再渲染至屏幕内,这导致渲染成本增加一倍。而且要将缓冲区增大,防止可视区域渲染不及时
这种是比较常见的做法,Demo:[[005.不定高虚拟列表|不定高虚拟列表]]
Demo:[[007.瀑布流虚拟列表|瀑布流虚拟列表]]