Vue.js 的 Patch 过程不进行属性劫持,劫持发生在响应式初始化阶段(Vue 2 用 Object.defineProperty,Vue 3 用 Proxy);Patch 仅在 commit 阶段将响应式数据同步到 DOM Property(如 el.value = nextValue),依赖平台 patchProp 规则区分 property 与 attribute。

Vue.js 的 Patch 过程本身并不直接实现属性劫持,也不负责 DOM Property 的主动同步。属性劫持(如 Object.defineProperty 或 Proxy)发生在响应式系统初始化阶段(reactive / defineProperty),而 DOM Property 同步是 渲染器(Renderer)在 patch 阶段根据 vnode 指令和 props 执行的副作用操作,属于“更新行为”,而非“劫持机制”。
属性劫持发生在响应式建立时,不在 patch 中
Vue 2 使用 Object.defineProperty 在 observe 阶段递归遍历 data,为每个属性设置 getter/setter;Vue 3 使用 Proxy 在 reactive() 时创建代理对象。这些操作均在组件实例创建、数据初始化时完成,与后续 diff 和 patch 无关。Patch 阶段只消费已存在的响应式状态,不重新劫持。
- 劫持目标:JavaScript 对象属性(如
vm.message),不是 DOM 元素属性 - 触发时机:首次
new Vue({ data })或ref()/reactive()调用时 - Patch 中看到的已是“被劫持后可通知更新”的响应式值,它只读取,不干预劫持逻辑
Patch 过程如何同步 DOM Property(非 HTML Attribute)
当 vnode 描述一个元素(如 ),patch 会识别 value 是 DOM Property(而非 attribute),并在 commit 阶段直接赋值到原生 DOM 元素的 property 上:
从零开始编排 SpringBoot+Vue 全栈项目工作流,适用于新建全栈项目或完整脚手架请求,触发后依次调用 product‑spec‑builder(需求调研)等模块。
-
el.value = nextValue—— 直接写入 JS 属性,绕过 setAttribute - 对
checked、selected、disabled等布尔属性同样如此 - 区分依据来自平台补丁逻辑(如
patchProp函数),结合标签名、prop 名、是否为 boolean prop 等规则判断
v-model 等指令依赖响应式 + patch 协同工作
v-model 本质是语法糖:它既注册事件监听(如 @input)更新响应式数据,又在 patch 时把数据值同步到 DOM Property。这不是 patch “劫持”了 input,而是:
- 用户输入 → 触发
input事件 → 执行生成的 update 表达式(如msg = $event.target.value)→ 触发 setter → 触发依赖通知 → 触发 re-render - re-render 生成新 vnode → patch 对比 → 发现
value变更 → 执行el.value = newValue
开发者无需手动同步,但需理解 Property 与 Attribute 差异
例如: 的初始值由 HTML attribute 决定;但一旦 JS 执行 el.value = 'new',attribute 不变,property 改变。Vue 的 patch 始终以响应式数据为唯一真相源,只更新 property,不操作 attribute(除非显式用 v-bind:value.prop 或 v-bind:value.attr 强制指定)。
- 常见误区:以为
v-bind:value会调用setAttribute→ 实际默认走 property 赋值 - 需要强制设 attribute?用
v-bind:value.attr="xxx"(Vue 3)或v-bind:attr-value(需自定义 directive) - 自定义组件中,
props是响应式数据,子组件内部通过this.$attrs或ctx.attrs访问透传的 attribute,与 property 同步逻辑解耦
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










