useEffect 的实现原理是什么
结论:
useEffect在 render 阶段只是把 effect(create/destroy/deps)登记到 Fiber 并打 Passive flag;commit 完成后 React 统一 flush passive effects:先执行 cleanup,再执行 create。
1. render 阶段做什么
- 创建 effect 对象,保存 deps 与回调
- 把 effect 挂到
fiber.updateQueue(常见是环形链表) - deps 变化则标记
HookHasEffect,提示需要执行
2. commit 后如何执行
- flush passive effects:先跑上次的 destroy,再跑这次的 create
- 通常异步调度,避免阻塞绘制
3. 常见追问
- “deps 怎么比较”:逐项
Object.is - “为什么 cleanup 先于 create”:避免重复订阅/资源泄漏