commit阶段的主要工作(即Renderer的工作流程)分为三部分:
- before mutation阶段(执行DOM操作前)
- mutation阶段(执行DOM操作)
- layout阶段(执行DOM操作后)
before mutation阶段,会遍历effectList,依次执行:
- 处理DOM节点渲染/删除后的 autoFocus、blur逻辑
- 调用getSnapshotBeforeUpdate生命周期钩子
- 调度useEffect
mutation会遍历effectList,对每个Fiber节点执行如下三个操作:
- 根据ContentReset effectTag重置文字节点
- 更新ref
- 根据effectTag分别处理,其中effectTag包括(Placement | Update | Deletion | Hydrating)
Deletion
- 递归调用Fiber节点及其子孙Fiber节点中fiber.tag为ClassComponent的componentWillUnmount(opens new window)生命周期钩子,从页面移除Fiber节点对应DOM节点
- 解绑ref
- 调度useEffect的销毁函数
layout,因为该阶段的代码都是在DOM渲染完成(mutation阶段完成)后执行的。一共做了两件事: