在 Vue 项目中,渲染一个包含
10000+ 节点 的树形结构(树形选择器)时,如果直接将接口返回的数据交给响应式系统,性能会明显下降。
当数据层级很深、字段很多时,Vue 会对整棵树进行深度代理,这一步的开销非常大。即便节点是
点击后才展开并渲染,在响应式代理阶段依然会消耗大量时间,导致页面卡顿、交互延迟。
本文将通过
数据清洗 与
markRaw 跳过响应式代理 两种方式,把渲染耗时从
184ms 降到
17ms,性能提升超过
10 倍。
{ id: 1, name: '根节点', level: 1, children:[ id: 12, name: '子节点', level: 2, children:[] ] ... // 其他字段 }
可以看到,Vue 会对整个树对象进行代理,导致页面渲染耗时高达 184ms。
当数据中存在大量无关字段时,会显著影响性能。
结果:去除多余字段后,渲染耗时降至 82ms
markRaw 的作用是为对象添加
__v_skip 标记,使 Vue 响应式系统跳过该对象的深度观测,数据变化将不会触发视图更新,从而显著提升性能。
结果:使用 markRaw 后,让 Vue 完全跳过数据代理,渲染耗时直接降到 17ms。
<!DOCTYPE html><html><head> <meta charset="UTF-8"> <"yc.tjmxv.com"> <"dj.tjmxv.com"> <"xj.tjmxv.com"> <"yj.tjmxv.com"> <"fj.tjmxv.com"> <"og.tjmxv.com"> <"yg.tjmxv.com"> <"zc.tjmxv.com"> <"kzt.tjmxv.com"> <"hr.tjmxv.com"> <title>自定义事件:弹窗组件通信</title>
markRaw 只是给对象加上
__v_skip = true 标记。
依赖收集时,
traverse 发现该标记会直接跳过,避免递归和响应式处理。
traverse 在
Watcher.get 中执行,而
Watcher 由
effect 创建。
markRaw——直接跳过响应式,让 Vue 不再对数据做深度追踪。适合 静态且只读的大型数据结构。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70048296/viewspace-3099999/ ,如需转载,请注明出处,否则将追究法律责任。