vue 不内置时间分片但支持任务分片,可通过 requestanimationframe 实现逐帧渲染、computed 预切分组、虚拟滚动优化长列表,并需规避强制布局与重复计算等陷阱。

Vue 本身不内置“时间分片”(Time Slicing)机制,也不像 React 那样依赖调度优先级来切分更新任务。但它完全支持**任务分片(Chunked Rendering)**——即把大批量 DOM 渲染操作拆成小块、逐帧执行,避免主线程长时间阻塞。这在初始化万级列表、批量插入数据或低性能设备上尤为关键。
用 requestAnimationFrame 实现轻量分片渲染
这是最直接、兼容性好、无需额外库的方式。核心是:每帧只处理固定数量的节点,主动让出控制权。
- 维护一个待渲染的数据队列(如原始数组或 documentFragment 节点列表)
- 每次 rAF 回调中只取前 N 项(例如 10–20 条)创建并挂载 DOM
- 若队列未空,递归调用 requestAnimationFrame;否则停止
- 可加入帧耗时检测(
performance.now()),单帧超 1.5ms 就暂停,保障 60fps
结合 v-for 的数据切片(适用于分组布局)
当你要把长列表按固定数量分组展示(比如每行 4 个卡片、每页 8 条),不用等运行时分片,而是在数据层提前切好。
- 在 computed 或 methods 中用
Array.prototype.slice()分组 - 外层
v-for遍历分组数:v-for="group in groupedData" - 内层
v-for渲染每组数据:v-for="item in group" - 注意用
Math.ceil(arr.length / perGroup)计算总组数,避免漏项
用虚拟滚动替代全量分片(推荐用于长列表)
分片渲染是“补救措施”,虚拟滚动才是根本解法。它不渲染不可见区域,自然规避了大批量 DOM 创建压力。
- 仅对当前可视区域内的数据启用渲染(
visibleStart ~ visibleEnd) - 滚动中禁用分片,保证 scroll 响应及时;静止后再异步补全边缘节点(可加防抖)
- 配合
key复用已有 DOM,比反复分片创建更高效 - 常用库如
vue-virtual-scroll-list或 Composition API 手写位置计算
避开常见陷阱
分片不是万能钥匙,用错地方反而拖慢体验。
- 不要在
v-for内部做 slice 或 filter —— 这会重复计算,应预处理到 computed - 避免在分片循环中读取
offsetHeight、getBoundingClientRect等触发强制同步布局 - 首次挂载用分片,后续更新优先走 Vue 的响应式 diff,而不是重跑整个分片逻辑
- 移动端慎用过多 rAF,部分低端机型回调不稳定,可降级为
setTimeout(..., 0)
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











