关于 react useEffect 的一些逻辑梳理
# 初始化阶段
- 调用 mountEffect, 设置 fiberFlags
- mountEffect 调用 mountWorkInProgrsss 把当前 effect hook 加到 currentlyRenderingFiber.memoizedState
- 此时直到 commitRoot 阶段 effect.destory 还是 undefinded
- commitRoot 异步调用刷新 PassiveEffect, 执行 useEffect 传递的回调, 同时把回调的返回值设置为 effect.destory
# 更新阶段
- 调用 updateEffect
- updateEffect 调用 updateWorkInProgress 把当前 effect hook 加到 currentlyRenderingFiber.memoizedState
- 根据 prevDeps 跟 nextDeps, 判断是否需要给当前 fiber 打上 Flag 用于 commitRoot 阶段的处理
- 此时直到 commitRoot 阶段 effect.destory 都还是上一次设置的 destory
# 总结
无论是初始化阶段还是更新阶段都需要使用 pushEffect 设置 currentlyRenderingFiber.updateQueue
最终 commit 阶段会根据 hook.tag 判断该 hook 的回调是否需要重新执行