Vue Reactive 使用 Javascript Proxy 代理对象来实现依赖追踪和触发更新,在 ProxyHandler 实现中,get 方法进行依赖追踪,set 方法进行触发更新:
一、mutableHandlers → MutableReactiveHandler extends BaseReactiveHandler implements ProxyHandler
查看 vue 3.4 源码 (packages/reactivity/src/baseHandlers.ts):
二、get 方法进行依赖追踪
调用 track 方法:记录哪些 effect 依赖于哪些属性
通过 trackEffect 方法,记录当前活动的 effect 到依赖集合中
shouldTrack && activeEffect:判断是否应该进行跟踪以及当前是否有活动的 effect
ReactiveEffect (effect 类),用于表示依赖关系
Dep,依赖集合,用于存储依赖该集合的所有 effect
dep.set(effect, effect._trackId):核心,将 effect 的 _trackId 添加到依赖集合中
三、set 方法进行触发更新
调用 trigger 方法:找到所有依赖于该属性的 effect,并触发这些 effect
通过 triggerEffects 方法:触发依赖集合中的所有 effect
Dep: 依赖集合,用于存储依赖该集合的所有 effect
DirtyLevels: 脏度级别的枚举,表示 effect 的脏度状态
queueEffectSchedulers: 一个数组,用于存储需要稍后运行的调度器(schedulers)
effect.scheduler :调度器,一个函数,用于决定何时以及如何运行某个 effect
四、其他
学习的记录,仅供参考