commit阶段的主要工作(即Renderer的工作流程)分为三部分:

    • before mutation阶段(执行DOM操作前)
    • mutation阶段(执行DOM操作)
    • layout阶段(执行DOM操作后)

    before mutation阶段,会遍历effectList,依次执行:

    1. 处理DOM节点渲染/删除后的 autoFocus、blur逻辑
    2. 调用getSnapshotBeforeUpdate生命周期钩子
    3. 调度useEffect

    mutation会遍历effectList,对每个Fiber节点执行如下三个操作:

    1. 根据ContentReset effectTag重置文字节点
    2. 更新ref
    3. 根据effectTag分别处理,其中effectTag包括(Placement | Update | Deletion | Hydrating)

    Deletion

    1. 递归调用Fiber节点及其子孙Fiber节点中fiber.tag为ClassComponent的componentWillUnmount(opens new window)生命周期钩子,从页面移除Fiber节点对应DOM节点
    2. 解绑ref
    3. 调度useEffect的销毁函数


    layout,因为该阶段的代码都是在DOM渲染完成(mutation阶段完成)后执行的。一共做了两件事:

    1. commitLayoutEffectOnFiber(调用生命周期钩子和hook相关操作)
    2. commitAttachRef(赋值 ref)