vue的响应式系统与渲染器构成闭环协作机制:数据变更触发effect重执行生成新vnode,再经patch比对并最小化更新dom,异步队列合并多次变更确保单次批处理。

Vue 的响应式系统和渲染器之间不是松散耦合,而是一套闭环协作机制:数据一变,自动触发 patch 更新真实 DOM —— 这个过程看似“魔法”,实则每一步都清晰可溯。
响应式变更 → effect 重新执行
当你修改 ref、reactive 或 computed 的值时,Vue 内部的 trigger 逻辑会通知所有依赖该响应式字段的 effect。组件的 render 函数本身就是一个 effect,它在首次挂载时已被注册进依赖系统。
- 每个响应式属性背后对应一个 Dep(依赖收集器),记录哪些 effect 订阅了它
- 赋值操作触发 setter → 调用 trigger → 遍历 subs 执行所有关联 effect
- render effect 重新运行,生成新的 VNode 树(注意:此时 DOM 还没动)
新旧 VNode 交由 patch 对比
render effect 返回的新 VNode 和上一次缓存的 oldVNode 一起传入 patch 函数,开始最小化更新。
- patch 先判断节点类型:文本、元素、组件、Fragment、Teleport 等各自走不同处理分支
- 对元素节点,比对 key、tag、props、class、style、事件监听器等;key 不同直接卸载重建
- 对子节点,采用双端 diff 策略(头-头、尾-尾、头-尾、尾-头),兼顾顺序变动与插入/删除效率
- 静态节点或带 patchFlags 的节点会被跳过深度比对,提升性能
DOM 操作只发生在必要位置
patch 不是重绘整块区域,而是按需执行原子级 DOM 操作:
- 属性变更:setAttribute、removeAttribute、textContent 更新等
- 子节点变更:insertBefore、appendChild、removeChild 精确控制位置
- 组件更新:调用子组件 instance.update(),复用已有实例,不销毁重建
- 指令与 ref 处理:v-model、v-show、ref="xxx" 在 patch 各阶段同步更新绑定关系
异步队列保障更新批处理
多个响应式变更不会立刻触发多次 patch,而是被合并进一个异步更新队列:
- 所有同步变更收集完毕后,nextTick 微任务中统一 flushJobs
- 确保同一事件循环内多次 state 修改只触发一次 render + 一次 patch
- 开发者可通过 nextTick() 获取 DOM 更新后的状态,比如获取元素尺寸或焦点
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










