其中我们谈到
本节我们深入flushPassiveEffects
方法内部探索useEffect
的工作原理。
flushPassiveEffects
内部会设置优先级
,并执行flushPassiveEffectsImpl
。
flushPassiveEffectsImpl
主要做三件事:
调用该
useEffect
在上一次render
时的销毁函数如果存在同步任务,不需要等待下次
事件循环
的宏任务
,提前执行他
本节我们关注前两步。
在v16
中第一步是同步执行的,在中提到:
基于这个原因,在中,useEffect
的两个阶段会在页面渲染后(layout
阶段后)异步执行。
接下来我们详细讲解这两个步骤。
这是因为多个组件
间可能共用同一个ref
。
如果不是按照“全部销毁”再“全部执行”的顺序,那么在某个组件useEffect
的销毁函数
中修改的ref.current
可能影响另一个组件useEffect
的回调函数
中的同一个ref
的current
属性。
在中也有同样的问题,所以他们都遵循“全部销毁”再“全部执行”的顺序。
在阶段一,会遍历并执行所有useEffect
的销毁函数
。
其中pendingPassiveHookEffectsUnmount
数组的索引i
保存需要销毁的effect
,i+1
保存该effect
对应的fiber
。
向pendingPassiveHookEffectsUnmount
数组内push
数据的操作发生在layout阶段
commitLayoutEffectOnFiber
方法内部的schedulePassiveEffects
方法中。
其中向pendingPassiveHookEffectsMount
中数据的操作同样发生在schedulePassiveEffects
中。