当面临需要插入大量数据到页面的情况时,下面是一些建议的处理方法:
-
分页加载:考虑将数据分成多个页面,每次只加载当前页面所需的数据。这样可以减少一次性加载大量数据对页面性能的影响,并提供更好的用户体验。
-
虚拟滚动:使用虚拟滚动技术,只渲染当前可见区域的数据,而不是全部渲染。这可以显著减少渲染时的性能开销,并提高滚动时的响应速度。
-
延迟加载:只在用户需要时加载数据。例如,当用户滚动到页面底部时,再加载下一页的数据。这样可以逐步加载数据,减轻页面的负担。
-
后台分页查询:考虑在后端实现分页查询,只返回当前页所需的数据量。通过限制每次请求的数据量,可以减少数据传输和页面渲染的时间。
-
数据缓存:如果数据是经常被使用的,并且不经常变化,可以考虑在前端进行数据缓存。这样可以避免每次加载都从后端请求数据,提高页面的加载速度。
以上这些方法可以根据具体的场景和需求进行组合使用。重要的是权衡性能和用户体验,确保页面加载和操作的流畅性。
下面是使用的 时间分片
来处理
通过 setTimeout
直接上一个例子:
上面的例子中,我们使用了 setTimeout,在每一次宏任务中插入一页数据,然后设置多个这样地宏任务,直到把所有数据都插入为止。
但是很明显能看到的问题是,快速拖动滚动条时,数据列表中会有闪烁的情况
这是因为:
JavaScript 代码在主线程上按照顺序执行,包括处理用户交互、运行脚本等。而 setTimeout
的回调函数会被添加到事件队列中,等待主线程上的所有任务完成后执行。 如果主线程上有其他任务(如计算密集型任务、大量的 DOM 操作等),即使设置了 0ms 的延迟,setTimeout
的回调函数也需要等待这些任务完成后才能执行。这意味着设置延迟时间为 0ms 并不能保证回调函数立即执行。 换句话说,尽管使用 setTimeout
分割任务可以让浏览器在处理大量 DOM 插入时更具有响应性,但它并不能保证立即执行回调函数。
所以,我们改善一下,通过 requestAnimationFrame 来处理
很明显,闪烁的问题被解决了
这是因为:
requestAnimationFrame 会在浏览器每次进行页面渲染时执行回调函数,保证了每次任务的执行间隔是稳定的,避免了丢帧现象。所以在处理大量 DOM 插入操作时,推荐使用 requestAnimationFrame 来拆分任务,以获得更流畅的渲染效果
扩展阅读