vue响应式系统通过数据变→依赖感知→视图更新闭环实现自动同步:vue 2用object.defineproperty、vue 3用proxy使数据可观测;模板/计算属性执行时收集依赖至dep;setter触发后批量异步更新并结合虚拟dom diff高效渲染。

Vue.js 响应式系统保障 UI 状态与应用状态同步,核心不是“手动刷新”,而是构建一条自动、精准、可追踪的数据流闭环:数据变 → 依赖感知 → 视图更新。整个过程由响应式机制驱动,无需开发者干预 DOM。
响应式数据是同步的起点
Vue 把 data、setup 中的 reactive/ref 变量转化为“可观测对象”:
- Vue 2 用
Object.defineProperty为每个属性设置 getter/setter;Vue 3 则用Proxy拦截整个对象读写,天然支持新增属性和数组方法劫持 - 只要变量被声明为响应式(如
const state = reactive({ count: 0 })),后续对state.count++的修改就会触发 setter - 非响应式属性(如直接给已有对象添加新字段)不会触发更新,需用
Vue.set或reactive包裹嵌套结构
依赖收集让更新“知道该通知谁”
模板渲染或计算属性执行时,会进入“依赖收集阶段”:
- 访问
{{ count }}或computed: { doubled() { return this.count * 2 } }时,对应属性的 getter 被调用 - 此时 Vue 记录当前正在执行的组件(或 computed/watcher)为该属性的依赖,存入其关联的
Dep集合中 - 一个属性可被多个组件/计算属性依赖,
Dep用Set去重,避免重复更新
派发更新与批量刷新确保高效同步
当响应式数据变化,setter 触发后:
-
Dep遍历所有依赖,调用它们的update()方法(如组件重新 render、watch 回调执行) - 这些更新任务不立即执行,而是推入一个异步队列(微任务,如
Promise.then) - 同一事件循环内多次修改同一数据,只触发一次最终更新,避免重复渲染
- 更新完成后,Vue 执行虚拟 DOM diff,仅操作真实 DOM 中真正变化的部分
同步边界:哪些情况不会自动同步?
响应式系统有明确的能力边界,需主动处理:
-
异步更新时机:赋值后 DOM 并未立刻更新,可用
nextTick确保在更新后操作 DOM -
外部状态源:URL 参数、localStorage、WebSocket 推送等不属于响应式系统管辖范围,需手动同步(如监听
popstate或watchroute) -
第三方库状态:如 LiteGraph.js 的节点参数,需用
watch响应式变量并显式调用其 API 更新
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











