ReactFiberHooks
负责处理 Hooks 核心的关键文件,实现了函数组件的状态管理和生命周期机制。
信息
5261 行的大文件。。。。,仅次于 'ReactFiberCommitWork' 的 5283 行和 'ReactFiberWorkLoop' 的 5338 行
一、 核心概念
- Fiber 节点储存 Hooks : 每个函数组件对应的 Fiber 节点通过 memoizedSate 属性储存一个 Hooks 链表
- Hook 累心表示 : 每个 Hook 通过 memoizedState 上的隐式标记区分类型( 如
useState、useEffect)
1.关键函数解析
- Hook 调度入口 :
renderWithHooks函数组件的渲染入口,负责:- 设置当前 Fiber 和渲染阶段
- 执行组件函数并收集 Hooks
- 处理副作用( 如
layoutEffect)
- Hook 管理 :
mountWorkInProgressHook/updateWorkInProgressWork创建或复用当前渲染的 Hook 节点,维护 Hooks 链表顺序 - 具体 Hook 实现:
useState/useReducer- 挂载阶段 : 创建 Hook , 初始化 state 和更新列队
- 更新阶段 : 处理
dispatch,调度更新
useEffect/useLayoutEffect- 将
effect对象(包含回调函数和依赖)添加到 Fiber 的 effects 链表 - 在渲染提交阶段执行副作用
- 将
useContext: 从 Context 中获取最新值并触发重新渲染useRef: 创建可跨渲染周期保存值的对象(current属性 )
2.更新机制
- 更新列队处理 :
- 如
setState会生成更新对象,加入 Hook 的queue.pending链表 - 通过
processUpdateQueue计算最新的state
- 如
- 副作用调度 :
useEffect的回调会被包装成 Effect 对象,挂载在 Fiber 的 effects 链表- 在
commit阶段执行:commitWork➞commitHookEffectList()
3.设计亮点
- 链表结构 : Hooks 链表保证执行顺序与声明一致,支持动态增减 Hooks
- 双缓存机制 : 使用
current和workInProgress两颗 Fiber 树,避免重复计算 - 调度集成 : Hooks 更新无缝接入 React 的 Fiber 调度和批处理系统