Vue响应式系统通过依赖收集与派发更新构建状态到视图的确定性闭环:数据劫持(Object.defineProperty/Proxy)实现读取时收集依赖、修改时通知更新;精确追踪实际访问字段,驱动组件render重求值与虚拟DOM最小化更新;闭环可调试、可预测。

Vue.js 的响应式系统核心在于建立数据变化到视图更新的自动映射关系,不是靠轮询或手动触发,而是通过依赖收集与派发更新构成一个可追踪、可通知的逻辑闭环。
数据劫持:让 JS 对象“开口说话”
Vue 2 使用 Object.defineProperty 劫持 data 中每个属性的 getter/setter;Vue 3 则基于 Proxy 拦截整个对象的操作。无论哪种方式,目的都是在读取时记录依赖(谁用到了这个值),在修改时通知依赖更新(谁该重新计算或渲染)。
- getter 中执行“依赖收集”,把当前正在运行的 watcher(或 effect)存入该属性的依赖列表
- setter 中执行“派发通知”,遍历依赖列表,触发它们的更新逻辑(如重新求值、刷新 DOM)
- 数组和嵌套对象需特殊处理:Vue 对 Array.prototype 方法做了重写,对新增/删除属性调用 vm.$set 或使用 ref/reactive 包裹,确保响应式链路不中断
依赖追踪:谁用了谁,得记清楚
响应式不是“所有数据一变就全量重绘”,而是精确到组件内实际访问过的字段。这靠的是“响应式副作用”与“依赖图”的配合。
从零开始编排 SpringBoot+Vue 全栈项目工作流,适用于新建全栈项目或完整脚手架请求,触发后依次调用 product‑spec‑builder(需求调研)等模块。
- 每个 computed、watch、模板插值,都会创建一个响应式副作用(Watcher 或 Effect)
- 副作用执行过程中访问响应式数据,触发其 getter,从而将自己“订阅”到对应属性的依赖池中
- 当属性变化,只通知它真正关心它的那些副作用,避免无效更新
视图更新:从状态变更到 DOM 重绘的最小化路径
数据变化不会直接操作 DOM,而是先驱动组件重新求值(render 函数执行生成新 VNode),再由虚拟 DOM 算法比对新旧 VNode,仅更新真实 DOM 中有差异的部分。
立即学习“前端免费学习笔记(深入)”;
- 组件级更新:响应式通知最终会触发组件的 update 队列(异步、去重、批量)
- render 函数是响应式副作用,它内部读取的 data、computed、props 都会被自动追踪
- DOM 更新发生在 nextTick 微任务队列中,保证多次数据变更只触发一次视图同步
逻辑闭环的本质:可收敛、可推导、可调试
这个闭环不是黑盒——你改了 data,能明确知道哪些 computed 会重新计算、哪些组件会 re-render、哪些 DOM 节点会变动。Vue 提供了 Vue Devtools 和 effectScope、onTrack / onTrigger 等调试钩子,让依赖关系可见、可干预。
- 响应式系统把“状态 → 视图”变成一个确定性函数:输入相同,输出一致;变化可追溯,更新可预测
- 脱离响应式(比如直接修改未定义属性、用 Object.assign 替换对象)会断开闭环,必须用 Vue 提供的 API 维持连接
- Composition API 中的 ref、reactive、computed 本质仍是同一套机制,只是封装更灵活、组合更自由


















