|
|
@ -6,11 +6,16 @@ |
|
|
|
|
|
|
|
|
|
|
|
## React 17 |
|
|
|
## React 17 |
|
|
|
|
|
|
|
|
|
|
|
Fiber 递归开始首先会交由 createWorkInProgress 函数生成 WorkInProgress 的第一个 Fiber 节点,这个节点就是 FiberNode,所以我们也从 createWorkInProgress 函数开始讲解 React 中 Fiber 递归的流程,**这个函数的主要工作就是根据传入的 Fiber 节点的判断复用 Fiber 节点还是创建新的 Fiber 节点**,而这个判断的条件就是传入的 Fiber 节点的 alternate 属性是否存在,在第一次进入到这个函数时也就是首屏渲染中传入的 FiberNode 是不存在这个属性的,所以会进入到 createFiber 函数:即执行创建新 Fiber 节点的逻辑 |
|
|
|
Fiber 递归开始首先会交由 createWorkInProgress 函数生成 WorkInProgress 的第一个 Fiber 节点,这个节点就是 FiberNode,所以我们也从 createWorkInProgress 函数开始讲解 React 中 Fiber 递归的流程,**这个函数的主要工作就是根据传入的 Fiber 节点的判断复用 Fiber 节点还是创建新的 Fiber 节点**,而这个判断的条件就是传入的 Fiber 节点的 alternate 属性是否存在 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在第一次进入到这个函数时也就是首屏渲染中传入的 FiberNode 是不存在这个属性的,所以会进入到 createFiber 函数:即执行创建新 Fiber 节点的逻辑。 |
|
|
|
|
|
|
|
|
|
|
|
```javascript |
|
|
|
```javascript |
|
|
|
function createWorkInProgress(current, pendingProps) { |
|
|
|
function createWorkInProgress(current, pendingProps) { |
|
|
|
if (workInProgress === null) { |
|
|
|
if (workInProgress === null) { |
|
|
|
|
|
|
|
// current 的 alternate 属性不存在会执行 createFiber 函数逻辑 |
|
|
|
|
|
|
|
// 表示当前的 Fiber 节点不存在对应的 WorkInProgress Fiber |
|
|
|
|
|
|
|
// 在首屏渲染和新增DOM节点的情况下,alternate 是会不存在的 |
|
|
|
workInProgress = createFiber( |
|
|
|
workInProgress = createFiber( |
|
|
|
current.tag, |
|
|
|
current.tag, |
|
|
|
pendingProps, |
|
|
|
pendingProps, |
|
|
@ -33,7 +38,7 @@ function createWorkInProgress(current, pendingProps) { |
|
|
|
|
|
|
|
|
|
|
|
这个函数具体的深入解析可以看 [[React 的深入探索 - createWorkInProgress]]。 |
|
|
|
这个函数具体的深入解析可以看 [[React 的深入探索 - createWorkInProgress]]。 |
|
|
|
|
|
|
|
|
|
|
|
第一次 createWorkInProgress 执行完毕之后,接下来就会交给 beginWork 开始正式的 Fiber 递归,在 React 中 Fiber 的创建使用递归实现的深度优先遍历算法,即尽可能深的探索树的分支,探索完毕后再回溯,在这一过程中负责探索阶段的就是 beginWork 函数。 |
|
|
|
createWorkInProgress 执行完毕之后,我们就有了一个 WorkInProgress Fiber 节点,接下来就会交给 beginWork 开始正式的 Fiber 递归,在 React 中 Fiber 的创建使用递归实现的深度优先遍历算法,即尽可能深的探索树的分支,探索完毕后再回溯,在这一过程中负责探索阶段的就是 beginWork 函数。 |
|
|
|
|
|
|
|
|
|
|
|
**beginWork 执行在递归节点的 Fiber 创建之前,主要是为传入的 Fiber 节点创建第一个子 Fiber 节点**,其内部可以看作一个大的 switch 语句,根据传入的 Fiber 节点的子元素类型不同执行不同的 Fiber 创建逻辑,不管父元素拥有多少个子元素,它最终都会创建并返回第一个子元素的 Fiber 节点,直到并不存在子元素为止,[[React 的深入探索 - beginWork]]。 |
|
|
|
**beginWork 执行在递归节点的 Fiber 创建之前,主要是为传入的 Fiber 节点创建第一个子 Fiber 节点**,其内部可以看作一个大的 switch 语句,根据传入的 Fiber 节点的子元素类型不同执行不同的 Fiber 创建逻辑,不管父元素拥有多少个子元素,它最终都会创建并返回第一个子元素的 Fiber 节点,直到并不存在子元素为止,[[React 的深入探索 - beginWork]]。 |
|
|
|
|
|
|
|
|
|
|
|