v-memo 是 vue 3.2+ 的实验性指令,用于优化长列表渲染性能,仅当依赖数组各项浅层引用均未变化时复用子树,需配合 v-for 和稳定 key 使用。

v-memo 是 Vue 3.2 引入的实验性指令,专为优化长列表(尤其是 v-for)的渲染性能而设计。它不是全局缓存,也不替代 key,而是让 Vue 在满足条件时跳过整块 vnode 的 diff 和 patch 过程——前提是“依赖数组”未变化。用对了,能显著减少虚拟 DOM 比较开销;用错了,反而引发渲染错误或状态不同步。
理解 v-memo 的工作原理
v-memo 接收一个数组作为依赖项(类似 computed 的依赖追踪),只有当数组中**每个值的浅层引用都未改变**时,Vue 才复用上一次生成的子树。它作用于模板片段,必须与 v-for 配合使用,且需显式提供 key:
- 语法:
v-memo="[dep1, dep2]",数组元素必须是响应式数据(ref、reactive 属性等) - 不支持动态数组长度变化(如
v-memo="[...items.map(i => i.id)]"会失效) - 若依赖项含 undefined / null / NaN,v-memo 会退化为始终不缓存(每次重渲染)
- 不能嵌套在 v-if / v-else 中使用,否则缓存行为不可预测
长列表中正确使用 v-memo 的典型场景
适用于列表项结构稳定、仅局部数据更新的场景,比如消息列表、商品卡片、日志条目:

