一、computed 函数通过内部的 ReactiveEffect 实现了对依赖项的追踪和更新,从而实现了计算属性的响应式特性
computed 接受一个 getter 函数,返回一个只读的响应式 ref 对象。该 ref 通过 .value 暴露 getter 函数的返回值
它也可以接受一个带有 get 和 set 函数的对象来创建一个可写的 ref 对象
通过创建 ComputedRefImpl 的实例来实现计算属性的核心功能
ComputedRefImpl 类的实现:通过 ReactiveEffect 来管理计算属性的更新逻辑,effect 是一个响应式的副作用,用于跟踪依赖并在依赖变化时触发重新计算
value 的获取:在获取 value 时,Vue 会检查计算属性是否需要重新计算(effect.dirty),如果需要,会调用 effect.run() 重新计算值,并触发相应的依赖追踪和更新
trackRefValue → trackEffect → ref.dep 依赖追踪
triggerRefValue → triggerEffects → effect.trigger 更新
value 的设置:如果计算属性是可写的,设置新值时会调用 setter 函数
二、计算属性 vs 方法
计算属性的最大特点是它们会基于其依赖项缓存计算结果果。只有当依赖的响应式数据发生变化时,计算属性才会重新计算,否则会返回上一次的计算结果
方法每次被调用时,都会重新执行,不管依赖的数据是否发生了变化。这在某些情况下会导致不必要的重复计算,影响性能
三、其他
学习的记录,仅供参考