v-memo 是 Vue 3.2+ 的轻量级运行时优化指令,用于长列表局部稳定场景,依赖未变时复用 VNode 跳过 diff 和 patch;须配合 v-for 与显式 :key 使用,推荐 key 与 v-memo 依赖一致(如 item.id),避免对象引用或计算值;搭配 shallowRef 可进一步减少响应式开销;可通过 Paint flashing、console.log 或 Performance 面板验证效果。

v-memo 是 Vue 3.2+ 提供的轻量级运行时优化指令,专为长列表这类高频更新但局部稳定的场景设计。它不阻止父组件更新,而是在虚拟 DOM 更新阶段“按需跳过”:当依赖项未变时,直接复用上一次的 VNode,省去 diff、patch 和节点重建开销。
适用长列表的典型结构
必须配合 v-for 使用(Vue 3.4+ 已强制要求),且需显式声明 :key。常见写法如下:
- 每行加
v-memo,依赖选该行唯一且稳定的基础字段,如item.id、item.status -
:key值建议与v-memo依赖一致,例如都用item.id,避免 Vue 3.4+ 警告失效 - 避免用
item(对象引用每次都不等)或item.name.toUpperCase()(计算结果不可缓存)
正确写法示例
假设渲染一个用户列表,仅当用户 ID 或状态变化时才重绘整行:
<div v-for="user in users" :key="user.id" v-memo="[user.id, user.status]">
<span>{{ user.name }}</span>
<span>{{ user.email }}</span>
<status-badge :status="user.status"></status-badge>
</div>
点击按钮修改全局计数器 count++ 时,只要 user.id 和 user.status 不变,所有行都不会触发重新渲染;只有调用 updateUserStatus(id, newStatus) 时,对应行才更新。
Element Plus Vue3 桌面组件库。在开发 Vue 3.x 页面时调用,使用 Element Plus 组件(如 el-button、el-input、el-form、el-table 等)。
配合 shallowRef 提升整体效率
长列表数据本身若不需要深度响应式(比如只读展示),可用 shallowRef 包裹数组,减少响应式追踪开销:
const users = shallowRef([{ id: 1, name: 'Alice', status: 'active' }])- 这样即使数组长度达上千项,Vue 也不会对每个对象属性建立响应式连接
- 搭配
v-memo后,从数据读取到模板渲染的链路更轻量
验证是否生效的简单方法
不用复杂工具也能快速确认:
- 打开 Chrome DevTools → Rendering → 勾选 “Paint flashing”,触发父组件更新,
v-memo区域不应闪红 - 在子组件模板中加
console.log('render'),观察日志是否只在依赖变化时输出 - 对比 Performance 面板中 “Render” 阶段耗时,同操作下应有明显下降(实测 200 行表格可降 60%+)
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!









