Patch 阶段不是独立生命周期钩子,而是更新过程中核心执行环节,发生在 beforeUpdate 之后、updated 之前,负责新旧 VNode 对比并高效同步到真实 DOM。

Vue.js 的 Patch 阶段不是独立的生命周期钩子,而是 更新过程中的核心执行环节,发生在 beforeUpdate 之后、updated 之前,负责将新旧虚拟 DOM(VNode)对比并高效同步到真实 DOM。
Patch 阶段触发时机
它由响应式数据变化自动触发,但不立即执行,而是被推入异步更新队列。当队列在下一个 tick 清空时,Vue 才启动完整更新流程:重新调用 _render() 得到新 VNode → 进入 _update() → 开始 patch。
- 仅在组件处于“运行中”阶段且数据发生响应式变更时触发(首次挂载走的是初始化渲染路径,非 patch)
- 多个同步数据修改会被合并为一次 patch,避免重复计算和 DOM 操作
- 手动调用
this.$forceUpdate()或依赖非响应式数据变化时,也会走同一 patch 流程
Patch 的核心工作流程
Vue 通过递归对比新旧 VNode 树,生成最小化操作指令集,并按需应用:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
-
节点类型判定:若新旧节点 tag 不同(如
div→span),直接卸载旧节点、新建插入,跳过深度比对 -
静态节点优化:若节点标记为
static(编译时确定不可变),且 key 和 tag 相同,则跳过 diff,复用已有 DOM - 属性与样式更新:只更新实际变化的 attribute、class、style 等,不全量重写
-
子节点差异化处理:对普通子节点做“同层同序”比对;对带
key的列表节点启用 key-based diff,精准定位移动、新增、删除项 -
组件实例复用逻辑:相同构造函数 + 相同 key 的组件,会复用实例并仅触发其
update方法,而非销毁重建
与生命周期钩子的关系
Patch 是 beforeUpdate 到 updated 之间的底层动作,开发者无法直接干预,但可借助钩子感知其边界:
立即学习“前端免费学习笔记(深入)”;
-
beforeUpdate:新 VNode 已生成,旧 DOM 尚未改动,适合读取当前 DOM 状态(如滚动位置) -
updated:patch 完成、真实 DOM 已同步,此时可安全操作更新后的元素(如聚焦输入框、初始化第三方库) - 注意:
updated不保证子组件也已完成 patch,如需等待全部完成,应配合nextTick
为什么 Patch 不是 Vue 1.x 的方式
Vue 1.x 中每个模板绑定对应一个 watcher,可精准更新对应 DOM 片段;而 Vue 2+ 将 watcher 粒度提升至组件级,靠 VNode + diff 算法解决“不知道改哪”的问题。Patch 正是这一设计的关键落地——用空间换时间,以一次完整 VNode 树比对,换取极低的 watcher 内存开销和更可维护的更新逻辑。

















