🔰 基础理解
✅ 语法:
<span v-once>{{ msg }}</span>
✅ 效果:
• 只渲染一次,之后无论数据如何变化,该内容都不会更新。
• 非常适用于静态内容或首次加载后不需要变化的数据。
🧪 示例:
<template>
<div>
<p v-once>页面加载时:{{ now }}</p>
<p>始终更新:{{ now }}</p>
<button @click="update">更新时间</button>
</div>
</template>
<script>
export default {
data() {
return {
now: new Date().toLocaleTimeString()
}
},
methods: {
update() {
this.now = new Date().toLocaleTimeString()
}
}
}
</script>
🔍 点击按钮后:
- 第一个 v-once 的段落不变。
- 第二个正常显示时间变化。
🔍 深入理解(进阶用法与原理)
✅ 渲染性能优化利器
- Vue 会给使用 v-once 的节点打上“静态标记”,渲染后直接跳过后续的虚拟 DOM diff。
- 大量使用静态内容的场景(如文章页、商品详情页首屏)中,可以明显降低开销。
✅ 不仅适用于文本,也适用于组件和 DOM 树
<!-- 整个 div 结构都不会再更新 -->
<div v-once>
<h1>{{ title }}</h1>
<p>{{ content }}</p>
</div>
<!-- 甚至可以用在组件上 -->
<StaticSection v-once />
✅ 组合使用其他指令时的影响
<div v-for="item in list" :key="item.id" v-once>
{{ item.name }}
</div>
- 上面每一项都只渲染一次。
- 若 list 变化,新项目不会被渲染,原有的不会更新(⚠️ 谨慎使用)。
⚠️ 注意事项:
场景 | 建议 |
---|---|
静态展示内容 | ✅ 推荐使用 |
表单项、交互式组件 | ❌ 禁止使用 |
配合 v-for 渲染数据列表 | ⚠️ 谨慎使用 |
需要响应式更新的数据 | ❌ 禁止使用 |
🧠 总结
内容 | 说明 |
---|---|
指令名称 | v-once |
核心作用 | 元素或组件仅初次渲染,后续数据更新不再影响它 |
最佳场景 | 静态内容、加载提示、SEO内容占位 |
性能优化 | 避免不必要的 diff 提升渲染性能 |
陷阱警告 | 会永久冻结 DOM,不适合交互、响应式场景 |
在vue2/3上的差异
✅ 共通点(Vue 2 与 Vue 3 都一致)
特性 | Vue 2 / Vue 3 共通 |
---|---|
语法一致 | ✅ <div v-once>...</div> |
渲染后不可变 | ✅ 渲染一次后,后续数据变更不再影响 DOM |
用于组件或元素 | ✅ 都支持作用于组件、元素、结构块 |
优化静态性能 | ✅ 避免 diff,提升性能 |
与 v-for 一起使用 | ✅ 可使用,但慎用(新项不会渲染) |
🚀Vue 2 vs Vue 3 差异点
方面 | Vue 2 | Vue 3 |
---|---|---|
编译静态优化 | 部分依赖手动优化(如 v-once) | 自动静态提升(静态节点优化更强) |
静态标记处理机制 | 借助 v-once 标记为静态 | 静态标记 + 静态提升:更智能判断 |
与 Composition API 配合 | 不适用(无 Composition API) | 可在 script setup 等组合式代码中使用 |
与 Suspense 一起用 | 不支持 Suspense | 可用于 Suspense 结构中的静态部分 |
🧪 Vue 3 中的替代 / 辅助方案
虽然 v-once 保留了,但 Vue 3 提供了更丰富的性能优化方式,例如:
defineRenderEffect(底层运行时层面优化)
Vue 3 更深入的静态节点处理,减少对 v-once 的依赖。
使用 markRaw 跳过响应式追踪(组合式 API)
import { markRaw } from 'vue'
const staticData = markRaw({ foo: 'bar' })
用于组件外部传入不希望响应式追踪的对象。
🔧 实际开发建议
场景 | 推荐方式 |
---|---|
静态首屏 HTML | ✅ v-once |
组合式组件中的加载块 | ✅ + fallback |
一次性说明/免责声明 | ✅ v-once |
性能优化目标是 diff 节点过多 | ✅ Vue 3 会自动优化,v-once 为锦上添花 |
🎯 总结一句话
v-once 在 Vue 2 和 Vue 3 中基本一致,但 Vue 3 靠自动静态提升已经能覆盖大部分场景,不再强依赖 v-once;它仍然是你手动优化静态结构的利器,但 Vue 3 让你用得更少、写得更轻松。