概述
本文主要记录一下 React
渲染过程中需要注意的点
注意
-
- legacy 模式
- blocking 模式
- concurrent 模式
-
两棵树
两棵树 lane => 更新优先级
flags => 掩码
渲染阶段
a. render 阶段
b. commit 阶段-
render phase
DFS => Depth-First-SearchperformUnitOfWork => update WorkInProgress beginWork => 返回 child + bailoutOnAlreadyFinishedWork completeUnitWork completeWork
completeUnitOfWork
循环调用 completeWork
跳出循环在于 sibling,如果有 sibling 则return
completeWork
return nullcommit phase
分为以下阶段
a. Before Mutation 前 Phase
b. Before Mutation Phase
c. Mutation Phase
d. Layout Phase
e. After Layout PhaseBefore Mutation Phase
执行commitBeforeMutationEffects
函数 [循环遍历 Effect List]
=> 读取 host tree 状态 + callgetSnapshotBeforeUpdate
-
Mutation Phase
执行commitMutationEffects
函数 [循环遍历 Effect List] => 执行 DOM 操作
a. reset Text
b. 更新 ref(flags & Ref === true) =>commitDetachRef
c. 根据 flags 分别处理Update =>
commitWork
条件finishedWork.tag
=== FunctionComponent =>commitHookEffectListUnmount
=> 递归调度 effect destroy 函数
=== HostComponent =>commitUpdate
=>updateFiberProps
+updateProperties
[在 DOM 节点应用 diff]-
Deletion =>
commitDeletion
- 递归地删除节点
- 清除 ref
- 调用
componentWillUnmount
- 调度 destroy 函数
-
Placement =>
commitPlacement
- 获取父级 DOM 节点
- 获取 Fiber 节点的 DOM 兄弟节点
- 若
parentFiber.tag === HostRoot | HostPortal
=>insetOrAppendPlacementNodeIntoContainer
- 若
parentFiber.tag !== HostRoot | HostPortal
=>insetOrAppendPlacementNode
Layout Phase
执行commitLayoutEffects
函数 [循环遍历 Effect List] => DOM 渲染完成后,触发生命周期钩子 + Hooks 可以访问到 DOM
a.nextEffect.flags & (Update | Callback)
=>commitLayoutEffectOnFiber
===commitLifeCycles
=> 调用声明周期函数 + Hook 相关
b.nextEffect.flags & Ref
=>commitAttachRef
=> 赋值 Ref源码中的
ReactFiberHostConfig.js
文件 ===ReactDOMHostConfig.js
文件