认识
一、认识
effectScope
作用是捕获其中所创建的响应式副作用 (即计算属性和侦听器),这样捕获到的副作用可以一起处理,与effect
、computed
、watch
都有关联
二、工作
2.1 constructor
-
若
detached
为false
表示子父级关联,若为true
则断开子父级关联 -
若
activeEffectScope
存在表示在此之前已经执行过,存在父级
所以两者均满足条件时,记录parent
、将当前EffectScope
加入父级并且记录当前EffectScope
在父级中的位置index
2.2 run
-
执行
run
前需根据active
判断当前EffectScope
是否处于激活状态 -
暂存上个
activeEffectScope
为currentEffectScope
-
执行
fn
阶段保证activeEffectScope
为当前EffectScope
,避免后续若执行onScopeDispose
时activeEffectScope
错乱 -
执行完毕
finally
阶段重新将activeEffectScope
赋值为上一个EffectScope
,保证初始化阶段子父级关系正确
执行阶段通过activeEffectScope
的巧妙,既保证了当前阶段的正常执行,又可以让后续的EffectScope
能正确记录子父级关系
2.3 stop
-
为防止重复执行,同样需要判断当前
EffectScope
是否处于激活状态 -
停止在
recordEffectScope
阶段记录的effect
,即调用effect
中的stop
,新版本中effect
引入了recordEffectScope
记录effect
-
执行
onScopeDispose
阶段cleanups
收集用户定义的动作 -
停止
scopes
收集的子集EffectScope
-
取消父级对对当前
EffectScope
引用,若移除的最后一个不是当前EffectScope
,将父级中当前索引位置值赋值为last
,改变last
中记录的index
2.4 effectScope
返回EffectScope
实例
2.5 recordEffectScope
添加当前effect
,effect
中会调用recordEffectScope
收集effect
,watch
和computed
均通过effect
实现,这里也呼应了官网对EffectScope
的解释:捕获其中所创建的响应式副作用 (即计算属性和侦听器),这样捕获到的副作用可以一起处理
2.6 getCurrentScope
获取当前EffectScope
2.7 onScopeDispose
这里会收集用户stop
需要执行的动作
activeEffectScope.cleanups.push(fn)
当执行stop
时触发用户动作,run
阶段的操作保证了activeEffectScope
为当前EffectScope
,不会发生混乱