vue 3 的 patchflags 是编译器自动注入 vnode 的数字标记,用于运行时跳过不必要的 diff:text(1)、class(2)、style(4)、props(8)、full_props(16)、need_patch(32)、hoisted(-1),支持按位或组合。

Vue 3 的 PatchFlags 是编译阶段注入到虚拟节点(VNode)上的数字标记,用于在运行时跳过不必要的 diff 比较,大幅提升更新性能。它不是手动设置的,而是由 Vue 编译器(@vue/compiler-dom)根据模板结构自动推导生成。理解每种标志位的含义,能帮你读懂生成的渲染函数、定位性能瓶颈,甚至写出更友好的优化型模板。
文本内容变化:TEXT
当一个元素的子节点仅为纯文本,且该文本是响应式变量(如 {{ msg }})时,会打上 1(PatchFlags.TEXT)。此时 patch 过程只需更新 node.textContent,无需遍历子节点或比对 VNode 结构。
- 适用场景:
<div>{{ title }}</div> - 不触发:静态文本(
<div>Hello</div>)、含插槽或组件子节点
类名动态绑定:CLASS
当 class 绑定为响应式对象或表达式(如 :class="{ active: isActive }" 或 :class="cls"),且不是全静态时,会标记 2(PatchFlags.CLASS)。运行时仅更新 node.className 或操作 classList,跳过属性 diff 全量比对。
- 注意:字符串拼接(
:class="'base ' + (isActive ? 'active' : '')")也会触发,但可能生成更复杂的 patch 逻辑 - 静态 class(
class="btn")不参与 patch,编译期直接写死
内联样式变化:STYLE
使用 :style 绑定响应式样式对象(如 :style="{ color: textColor, fontSize: size + 'px' }")时,生成 4(PatchFlags.STYLE)。patch 阶段只更新 node.style 对象属性,避免对整个 style 字符串做 diff 或重写。
- 支持对象语法和数组语法(含 CSS 变量)
- 静态
style="color: red"不打 flag,直接固化在 VNode props 中
动态属性绑定(非 class/style):PROPS
当存在响应式的非专有属性(比如 :id、:data-id、:aria-label 等),且未被归类到 CLASS/STYLE/TEXT 中时,会用 8(PatchFlags.PROPS)。此时只比对并更新「有响应式绑定的那些属性」,而非全部 props。

