1、render 阶段
- 创建 Fiber 节点树(采用
深度优先遍历)- 挂载 Dom
- 生成 effectList 的单向环状链表
beginWork
- mount时:
- 采用
深度优先的方式遍历 "DOM树" - 根据
tag不同,创建不同类型的Fiber
- 采用
- update时:
Diff算法- 对比当前组件与该组件在上次更新时对应的
Fiber节点
- 对比当前组件与该组件在上次更新时对应的
- reconcileChildren
- 挂载子组件时调用 mountChildFibers
- 更新子组件时调用 reconcileChildFibers
completeWork
- mount时:
- 将
Fiber节点生成对应的DOM节点 - 把子孙
DOM节点插入刚生成的DOM节点中 - 与
update逻辑中的updateHostComponent类似的处理props的过程
- 将
- upate时:主要是处理
propsonClick、onChange等回调函数的注册- 处理
style prop - 处理
DANGEROUSLY_SET_INNER_HTML prop - 处理
children prop
- effectList:
- 在
completeWork的上层函数completeUnitOfWork中 - 每个执行完
completeWork且存在effectTag的Fiber节点会 - 被保存在一条被称为
effectList的单向链表中
- 在
2、commit 阶段
作用:执行
Effect 链表过程:useEffect、useLayoutEffect 不同阶段执行不同的函数
before mutation阶段(执行DOM操作前)
- 变量赋值、状态重置
- 处理
DOM节点渲染/删除后的autoFocus、blur逻辑 - 调用
getSnapshotBeforeUpdate、useEffect生命周期函数
mutation阶段(执行DOM操作)
- 遍历
effectList,依次执行commitMutationEffects - 根据
effectTag调用不同的处理函数处理Fiber(增、删、更)
layout阶段(执行DOM操作后)
- 遍历
effectList,依次执行commitLayoutEffectOnFiber - 根据
fiber.tag不同类型的节点分别处理- ClassComponent: 触发
this.setState第二个参数回调函数 - FunctionComponent:
- 调用
useLayoutEffect hook的回调函数 useEffect的销毁与回调函数
- 调用
- ClassComponent: 触发
- commitAttachRef
- 获取
DOM实例 - 更新
ref
- 获取
- current Fiber树切换