跳到主要内容

认识

2024年03月20日
柏拉文
越努力,越幸运

一、认识


effectScope 作用是捕获其中所创建的响应式副作用 (即计算属性和侦听器),这样捕获到的副作用可以一起处理,与effectcomputedwatch都有关联

二、工作


2.1 constructor

  1. detachedfalse表示子父级关联,若为true则断开子父级关联

  2. activeEffectScope存在表示在此之前已经执行过,存在父级

所以两者均满足条件时,记录parent、将当前EffectScope加入父级并且记录当前EffectScope在父级中的位置index

2.2 run

  1. 执行run前需根据active判断当前EffectScope是否处于激活状态

  2. 暂存上个activeEffectScopecurrentEffectScope

  3. 执行fn阶段保证activeEffectScope为当前EffectScope,避免后续若执行onScopeDisposeactiveEffectScope错乱

  4. 执行完毕finally阶段重新将activeEffectScope赋值为上一个EffectScope,保证初始化阶段子父级关系正确

执行阶段通过activeEffectScope的巧妙,既保证了当前阶段的正常执行,又可以让后续的EffectScope能正确记录子父级关系

2.3 stop

  1. 为防止重复执行,同样需要判断当前EffectScope是否处于激活状态

  2. 停止在recordEffectScope阶段记录的effect,即调用effect中的stop,新版本中effect引入了recordEffectScope记录effect

  3. 执行onScopeDispose阶段cleanups收集用户定义的动作

  4. 停止scopes收集的子集EffectScope

  5. 取消父级对对当前EffectScope引用,若移除的最后一个不是当前EffectScope,将父级中当前索引位置值赋值为last,改变last中记录的index

2.4 effectScope

返回EffectScope实例

2.5 recordEffectScope

添加当前effecteffect中会调用recordEffectScope收集effectwatchcomputed均通过effect实现,这里也呼应了官网对EffectScope的解释:捕获其中所创建的响应式副作用 (即计算属性和侦听器),这样捕获到的副作用可以一起处理

2.6 getCurrentScope

获取当前EffectScope

2.7 onScopeDispose

这里会收集用户stop需要执行的动作

activeEffectScope.cleanups.push(fn)

当执行stop时触发用户动作,run阶段的操作保证了activeEffectScope为当前EffectScope,不会发生混乱