返回

揭秘 React 冒泡阶段:从 Complete UnitOfWork 到卸载

前端

在 React 的生命周期中,冒泡阶段是至关重要的阶段,它决定了如何将更新传递到组件树中。该阶段始于 completeUnitOfWork 函数,它负责完成 Fiber 节点的创建、diff 算法的执行以及调用 render 阶段的部分生命周期函数。

从 Complete UnitOfWork 到 ReconcileChildren

在 beginWork 阶段之后,completeUnitOfWork 函数负责将 Fiber 节点连接到其父节点并更新 DOM。该函数首先调用 reconcileChildren,它负责协调子 Fiber 节点的创建、更新和卸载。reconcileChildren 函数采用以下步骤:

  1. 比较当前 Fiber 节点与其对应的新 Fiber 节点的子节点。
  2. 如果子节点是不同的,则更新 DOM 并调用子 Fiber 节点的 beginWork 函数。
  3. 如果子节点是相同的,则跳过该子节点并继续处理下一个子节点。

处理 Effect Tag

在协调子节点之后,completeUnitOfWork 函数处理 Fiber 节点的 effectTag。effectTag 是一个位掩码,它指示需要对 Fiber 节点执行哪些操作。常见的 effectTag 包括:

  • Placement :需要将该 Fiber 节点添加到 DOM 中。
  • Update :需要更新该 Fiber 节点的 DOM 属性。
  • Deletion :需要从 DOM 中删除该 Fiber 节点。

触发副作用

如果 Fiber 节点的 effectTag 为非零,则 completeUnitOfWork 函数将触发副作用。副作用是一些需要在 DOM 更新之后执行的操作,例如:

  • 更新状态
  • 调用生命周期函数
  • 设置计时器

卸载 Fiber 节点

如果 Fiber 节点的 effectTag 包含 Deletion 标志,则 completeUnitOfWork 函数将卸载该 Fiber 节点。卸载 Fiber 节点的步骤如下:

  1. 调用该 Fiber 节点的卸载生命周期函数(如果有)。
  2. 从其父节点中删除该 Fiber 节点。
  3. 从 DOM 中删除该 Fiber 节点的 DOM 节点。

传递更新

completeUnitOfWork 函数将更新一直传递到组件树的根节点。当所有 Fiber 节点都经过 completeUnitOfWork 函数处理后,更新就完成了。

总结

冒泡阶段是 React 生命周期中的关键阶段,它负责将更新传递到组件树中。completeUnitOfWork 函数是冒泡阶段的起始函数,它负责协调子节点、处理 effectTag、触发副作用和卸载 Fiber 节点。通过了解冒泡阶段,我们可以更深入地理解 React 的工作原理。