|
|
|
@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
|
|
|
|
|
>这个函数的任务是创建 WorkInProgress 树的 Fiber 节点,根据传入参数的判断是复用已有的 Fiber 节点或是创建新的 Fiber 节点 |
|
|
|
|
|
|
|
|
|
createWorkInProgress 会在 Fiber 递归开始前、出现新节点和进入 Bailout 逻辑的时候被触发,逻辑开始会先判断传入的 Fiber 节点是否存在 alternate 属性。 |
|
|
|
|
createWorkInProgress 在 Fiber 递归开始前、出现新节点和进入 Bailout 逻辑的时候都会被触发,逻辑开始会先判断传入的 Fiber 节点是否存在 alternate 属性。 |
|
|
|
|
|
|
|
|
|
```javascript |
|
|
|
|
function createWorkInProgress(current, pendingProps) { |
|
|
|
@ -13,7 +13,29 @@ function createWorkInProgress(current, pendingProps) {
@@ -13,7 +13,29 @@ function createWorkInProgress(current, pendingProps) {
|
|
|
|
|
} |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
alternate 属性链接的是其对应的 WorkInProgress 节点, |
|
|
|
|
alternate 属性链接的是其对应的 WorkInProgress 节点,如果该属性不存在会进入创建新 Fiber 的逻辑: |
|
|
|
|
|
|
|
|
|
## 创建新 Fiber 节点 |
|
|
|
|
|
|
|
|
|
```javascript |
|
|
|
|
workInProgress = createFiber( |
|
|
|
|
current.tag, |
|
|
|
|
pendingProps, |
|
|
|
|
current.key, |
|
|
|
|
current.mode |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
// 赋值同名参数 |
|
|
|
|
workInProgress.elementType = current.elementType; |
|
|
|
|
workInProgress.type = current.type; |
|
|
|
|
workInProgress.stateNode = current.stateNode; |
|
|
|
|
|
|
|
|
|
// 通过 alternate 属性互相链接 |
|
|
|
|
workInProgress.alternate = current; |
|
|
|
|
current.alternate = workInProgress; |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
## 复用已有 Fiber 节点 |
|
|
|
|
|
|
|
|
|
React 的首屏渲染时会交由 `createWorkInProgress` 函数生成一个 `WorkInProgress Fiber` 节点,这个节点就是 FiberNode,`createWorkInProgress` 接收两个参数,分别是 `current` 和 `pendingProps`,这里的 `pendingProps` 是组件的属性 |
|
|
|
|
因为传入的是 `current Fiber` 树,所以 `createWorkInProgress` 内会从 `current` 的 `alternate` 取出中取出与之链接的 `WorkInProgress Fiber` 节点,并对其做空值判断,因为对于首屏渲染而言,`WorkInProgress` 是不存在的,所以会走到不存在 `WorkInProgress` 的逻辑,在这里也就是调用 `createFiber` 函数,这个函数会更加传递的参数 `new` 一个 Fiber 的实例,其内部并没有什么复杂的逻辑,而是对 Fiber 节点的属性进行了初始化,`createFiber` 返回之后,会对返回的 FiberNode 节点进行赋值,复用 `current FiberNode` 节点的内容,并对它们各自的 `alternate` 进行赋值,双向链接 |
|
|
|
|