前语


前一篇文章ReactDOM.render串联烘托链路(一),咱们梳理了烘托链路的初始化阶段和render阶段的前半段,这篇文章咱们来看看renhttps认证der阶段的后半段和commit阶段。

rehttp 500nder后半段


completeWork

前面有说道,在render阶段,这个进程中,穿插了大量了beginWork、completeWork调用,这两个办法串联起来https协议便是一个仿照递归的进程。这个两个办法便是rendehttps安全问题r的作业内容。接下来咱们来看看completeWork。
ReactDOM.render串联烘托链路(二)
在这render整个阶段beginWork和completeWork根本都是成对存在的,beginWork担任Fiber节点的创立,而competeWork担任Fiber阶段转换为真实Dom。

completeWork:前

ReactDOM.render串联烘托链路(二)

if (enableProfilerTimer && (unitOfmarkdown编辑器Work.mode & ProfileMode) !== NoMode) {
startProfhttp署理ilerTimer(unitOfWork);
// 创立当时节点https协议的子节点
next = beginWork(cmarkdownpadurrmarkdown语法中如何添加视频ent, unitOfWork, subtreeRenderLanes);
stopProfilerhttp 404TimerIfRunningAndRecordDehttpwatchlta(uhttps协议nitOfWork, true);
} else {
// 创立当时节点的子节点
next = beginWorhttps域名k(currenthttp协议, unitOfWorkhttps和http的区别, subtreeRenderLanes);
}
if (next === null) {
// 调用 completeUnitOfWork
completeUnitOfWork(unitOfWork);
} else {
// 将当时节点更新为新创立出的 Fibehttps域名r 节点
workInProgress = next;
}

performUnitOfWork中,先经过beginWork来创立当时页面的子节点,http://192.168.1.1登录然后判http协议别创立的子阶段是否为空,假设为空(阐明这个节点没有子节点, 是一个叶子节点)。因此这种情况下,就会调用 completeUnitOfWork,实施当时节点对应的 completeWork 逻辑。

completeWork:后

ReactDOM.render串联烘托链路(二)
completeWork中和beginhttp://www.baidu.comWork的实施千篇一律,根据worhttps协议kInProgress tag(一共有十余种)的不同,实施不同的逻辑。这儿http协议咱们要害来看看HostComponent case:
ReactDOM.render串联烘托链路(二)

其真实render进程中,存在两棵树,一颗便是大名鼎鼎的workInProgress树,一颗便是current树。这两棵树workInProgress树标明”当时http协议正在render的树“,current树标明”现已render结束的树“。

workInProgress 节点和 current 节点之间用 alternate 特征相互连接。在组件的挂载阶段,current 树只需一个 rootFiber 节点,并markdown编辑器没有其他内容

completeWork总结
  • completeWork意图:将Fiber映射为真实DOM
  • completeWork要害作业
    • 创立DOM
    • 刺进DOM树
    • 设置DOM特征
completeUnitOfWork:翻开大循环

ReactDOM.render串联烘托链路(二)
completeUnitOfWork首要http协议的作用是http 500翻开一个大循环,在里http://www.baidu.com面循环如下的操作:

  1. 针对其httpclient时阶段,调用completeWork
  2. 将当时节点的副作用链(Efhttps和http的区别fectList)刺进到其父节点对应的副作用链(EffectLmarkdown教程ist)中。
  3. 以当时节点为起点,循环遍历其兄弟节点及其父节点,当遍历到兄弟节点时,将 return 掉当时调用,触发兄弟节点对应的 performUnitOfWork 逻辑;而遍历到父节点时,则会直接进入下一轮循环,也便是重复 1、2 的逻辑。

在整个ReactDOM.render的进程中,render节点是最为重要的,也是最难了解的,我感觉了解知道就行。

commit 阶段


ReactDOM.render串联烘托链路(二)

commhttpclientit 分为三个阶段

  • before mutation
  • mutation
  • lamarkdown教程yout
before mutation

before mutation 阶段,这个阶段 DOM 节点还没有被烘托到界面上去,进程HTTPS中会触发 getSnapshotBeforeUpdate,也会处理 useEffect 钩子相关的调度逻辑。

mutation

这个阶段担任 DOMhttps认证HTTPS点的烘托。在烘托进程中,会遍历 effectList,根据 flmarkdown下载ahttps安全问题gs(effectTag)的不同,实施不同的 DOM 操作。

layout

这个阶段处理 DOM 烘托结束之后的收尾逻辑。比方调用 componentDidMount/componentDidUpdHTTPSate,调用 useLayoutEffect 钩子函数的回调等。除了这些之外,它还会把 fiberRoot 的 current 指针指向 workInProgress Fiber 树。

总结


经过两篇文章大致的梳理了一下,ReactDOM.render的烘托链路。

  • 初始化阶段
  • render阶段
  • commit阶段

结束了对 ReactDOM.rHTTPender 调用栈的分析。表面上分析的是初度烘托的烘托链路,实践大将包括同步形式下的HTTPS挂载、更新链路(与挂载链路的调用栈十分相似)都串联了一遍。