Vue响应式系统是计算属性运行的底层基础,提供依赖追踪、脏检查缓存及模板自动解包能力,并与ref/reactive/watch共享同一内核。

Vue 响应式系统是计算属性得以运行的底层基础,没有响应式系统,计算属性就无法自动追踪依赖、缓存结果或触发更新。
响应式系统为计算属性提供依赖追踪能力
计算属性内部的 getter 函数在执行时,会读取 ref 或 reactive 中的响应式数据(如 firstName.value 或 user.name)。此时 Vue 的响应式系统通过 track 机制自动记录这些访问行为,把当前计算属性标记为这些数据的“订阅者”。一旦后续这些数据被修改,系统通过 trigger 通知该计算属性“依赖已变”,准备重新求值。
缓存机制依赖响应式系统的“脏检查”逻辑
计算属性不是每次访问都执行函数,而是靠响应式系统维护一个“是否脏”的状态:
- 初始化时执行一次 getter,缓存结果,并标记为“干净”
- 依赖数据变更时,系统将该计算属性标记为“脏”(dirty = true)
- 下一次访问时,发现是脏的,才重新执行 getter 并更新缓存
这个“脏/净”判断完全由响应式系统在 set 操作后统一调度,计算属性本身不主动监听,只被动响应。
立即学习“前端免费学习笔记(深入)”;
模板中自动解包的背后是响应式代理
你在模板里写 {{ fullName }} 而不用 {{ fullName.value }},是因为 computed 返回的是一个特殊的 ref 类型对象(ComputedRefImpl),它复用了 ref 的 getter/setter 拦截逻辑。其 .value 访问器内部会调用 trackRefValue,继续走响应式依赖收集流程——这和普通 ref 的行为一致,体现了响应式系统在各类响应式对象间的一致性设计。
计算属性是响应式系统的高阶封装
你可以把响应式系统看作“引擎”,而计算属性是它最常用的一个“变速箱”:
- ref / reactive 提供原始响应式能力(数据可被追踪、可触发更新)
- computed 在此基础上增加惰性求值、缓存、依赖聚合等语义层能力
- watch 则是另一条路径:不返回值,专注副作用执行,但也同样依赖同一套 track/trigger 机制
三者共享同一套响应式内核,只是使用意图不同:ref/reactive 是“数据源”,computed 是“派生值”,watch 是“副作用监听器”。


















