剖析React源码,探秘协调过程(下)
2023-09-08 16:48:35
React的协调过程是其运行时最重要的部分之一,上篇文章中,我们介绍了beginWork阶段的前半部分,本篇文章将继续探究后半部分的内容。
在beginWork阶段,首先会通过workInProgress.tag来判断当前处理的FiberNode是哪种类型,然后针对不同的类型调用不同的update方法。这些方法虽然名字差别很大,但本质上都是为了更新FiberNode的状态。
对于HostComponent类型的FiberNode,update方法为updateHostComponent,它会将新的props与旧的props进行比较,如果发现有变化,则会调用DOM API更新DOM节点。
对于ClassComponent类型的FiberNode,update方法为updateClassComponent,它会调用组件的render方法生成新的虚拟DOM,然后与旧的虚拟DOM进行比较,如果发现有变化,则会调用beginWork方法更新子FiberNode。
对于FunctionComponent类型的FiberNode,update方法为updateFunctionComponent,它会直接调用组件的函数生成新的虚拟DOM,然后与旧的虚拟DOM进行比较,如果发现有变化,则会调用beginWork方法更新子FiberNode。
对于HostText类型的FiberNode,update方法为updateHostText,它会将新的文本内容与旧的文本内容进行比较,如果发现有变化,则会调用DOM API更新DOM节点。
对于SuspenseComponent类型的FiberNode,update方法为updateSuspenseComponent,它会根据Suspense组件的状态来决定是否需要挂起渲染。
这些update方法都是协调过程的核心部分,它们负责将虚拟DOM转换为真实DOM,并确保组件的状态与最新的props保持同步。
在beginWork阶段的最后,协调过程会调用completeUnitOfWork方法来完成当前FiberNode的更新。completeUnitOfWork方法会检查当前FiberNode是否有未处理的子FiberNode,如果有,则会调用beginWork方法继续更新子FiberNode。如果没有,则会调用completeWork方法来完成当前FiberNode的更新。
completeWork方法会将当前FiberNode及其所有的子FiberNode添加到effect list中,并标记需要更新的DOM节点。然后,协调过程会调用commitRootImpl方法来将effect list中的更新应用到真实DOM中。
至此,协调过程就完成了。React会通过协调过程来确保虚拟DOM与真实DOM保持同步,并确保组件的状态与最新的props保持同步。