From 58e2fa4e727c75a4662a0d6601b89319924883f8 Mon Sep 17 00:00:00 2001 From: YuJian Date: Mon, 9 May 2022 16:23:36 +0800 Subject: [PATCH] vault backup: 2022-05-09 16:23:36 --- ... 的深入探索 - createWorkInProgress.md | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/React 的源码深入/React 的流程解析 - Fiber 递归/React 的深入探索 - createWorkInProgress.md b/React 的源码深入/React 的流程解析 - Fiber 递归/React 的深入探索 - createWorkInProgress.md index b78d05f..ee6ef20 100644 --- a/React 的源码深入/React 的流程解析 - Fiber 递归/React 的深入探索 - createWorkInProgress.md +++ b/React 的源码深入/React 的流程解析 - Fiber 递归/React 的深入探索 - createWorkInProgress.md @@ -53,7 +53,25 @@ var createFiber = function (tag, pendingProps, key, mode) { ## 复用已有 Fiber 节点 -从以上的判断逻辑出来会进入一大串 Fiber 属性赋值的逻辑 +从以上的判断逻辑出来会进入一大串 Fiber 属性赋值的逻辑,代码太长就不贴了,其中有一个 switch 语句,是为 Fiber type 属性赋值对应的 Component Type: + +```javascript +switch (workInProgress.tag) { + case IndeterminateComponent: + case FunctionComponent: + case SimpleMemoComponent: + workInProgress.type = resolveFunctionForHotReloading(current.type); + break; + + case ClassComponent: + workInProgress.type = resolveClassForHotReloading(current.type); + break; + +case ForwardRef: +workInProgress.type = resolveForwardRefForHotReloading(current.type); +break; +} +``` 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` 进行赋值,双向链接