React 执行架构流程详细----归阶段 mount 时流程(三)
创始人
2025-05-30 10:18:47
0

React 执行架构流程详细----归阶段 mount 时流程(三)

目录

    • React 执行架构流程详细----归阶段 mount 时流程(三)
      • 引言
        • 归阶段 mount 时流程
        • 🌰
      • 总结
      • 解决问题
        • 问题提出
        • 解答


引言

由前一篇可知:

  • render 阶段就是采用dfs的方式依次执行fiber节点的 beginWork 和 completeWork

  • 整个 React 执行分为四个阶段,今天阐述第二个阶段:归阶段 mount 时流程


归阶段 mount 时流程

也就是 mount 阶段 completeWork 的流程

🌰

  1. 对于以下这个结构来说:
    在这里插入图片描述
  2. 第一个进入 completework 的节点是 img ,会根据 fiber节点的 type 进入不同的 case
    在这里插入图片描述
    img 节点是 host component ,所以进入这个case:
    在这里插入图片描述
  3. 首先会判断 current 是否存在,首次渲染时 current 是不存在的,接下来会为 hostcomponent 对应的 fiber 节点创建对应的 DOM 节点,进入 createInstance 函数:
    在这里插入图片描述
  4. 可以看到 在 createInstance 中执行了 createElement 函数,domElement 就是 img DOM 元素
    在这里插入图片描述
  5. 当创建完dom 节点后,会通过 appendAllChildren 函数 将这个节点插入到到之前已经创建好的dom树中。
    appendAllChildren 的作用:将已经创建好的dom节点挂载到当前dom 树下,当我们 归阶段,从每一个子节点一路向上,归到根节点时,创建的每一个子节点都会挂载到它的父级dom节点下,当执行到 App 节点时,就已经有一棵构建好的 dom 树
    在这里插入图片描述
  6. 接下来会将 img dom 节点保存在 img 对应的 fiber 节点的 stateNode 属性上
    在这里插入图片描述
  7. 最后在 finalizeInitialChildren 给 dom 节点设置一些属性,img 节点上加上了 alt,className 等属性
    在这里插入图片描述
  8. 进入 setInitialProperties 函数:
    在这里插入图片描述
    首先会判断这是否是一个自定义标签,接下来会根据 hostcomponent 的 tag 来进入不同的逻辑

    再判断props 是否合法,再进入初始化 dom 属性的操作

    属性类型不同做不同的处理
    在这里插入图片描述
    最终会调用 setAttribute 进行属性赋值:
    在这里插入图片描述

即一个 fiber 节点的 completework 就完成了,之后就进入下一个 fiber 节点的 completework

PS:对于以下类型的组件,是没有 completeWork 的逻辑的
在这里插入图片描述


总结

  1. 会判断当前fiber节点的类型,进入不同的 case(比如说是 HostComponent,就进入相关的 case)
  2. 首先会判断 current 是否存在
  3. 为 HostComponent 对应的 fiber 节点创建对应 的 DOM 节点,会将这个DOM节点保存在 该fiber 的 stateNode 上,然后再为DOM 节点设置一些属性(初始化属性)
  4. 将创建好的节点插入到 DOM 树中:每一个 hostComponent 在 appendChildren 函数中,执行挂载
  5. 然后就进入下一个 fiber 节点的 completeWork 的过程
  6. 当整个应用的所有节点都执行完了 completeWork 时,将 root node 的标记 effectTag 置为 placement,就能将整棵 树进行挂载到页面上

解决问题

问题提出

在 reconcileChildren 中,当某个 fiber 节点不存在对应的 current 节点时,他是不会被标记 effectTag 的,那么首屏渲染的时候,这些 DOM 节点是如何挂载到页面中的呢?

解答

对于首屏渲染,会有一个节点进入 reconcileChildFibers 逻辑,这个存在 current 节点的就是当前应用的根节点,即下图中的 FiberRootNode

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

之后会进入 reconcileSingleElement 函数:
在这里插入图片描述

进入 placeSingleChild :App 节点的effectTag会被赋值为 placement

只需要在App这一级有一个 Placement 的 effectTag ,就能将整棵 dom树挂载到页面上,这就是首屏渲染的 dom插入逻辑

在这里插入图片描述


参考资料:
React 项目源码
技术揭秘
React 版本是17

相关内容

热门资讯

安卓10系统断网软件,轻松实现... 你有没有遇到过这种情况?手机突然断网了,明明信号满格,却连不上网,急得你团团转。别急,今天就来给你揭...
安卓可以改什么系统版本,体验全... 你有没有想过,你的安卓手机其实可以像换衣服一样,换一个全新的“系统版本”呢?没错,这就是今天我们要聊...
最好的平板游戏安卓系统,畅享指... 亲爱的游戏迷们,你是否在寻找一款能够让你在安卓平板上畅玩无忧的游戏神器?别急,今天我就要给你揭秘,究...
华为安卓系统卡顿解决,华为安卓... 你是不是也遇到了华为安卓系统卡顿的问题?别急,今天就来给你支几招,让你的华为手机重新焕发活力!一、清...
安卓建议升级鸿蒙系统吗,探讨鸿... 亲爱的安卓用户们,最近是不是被鸿蒙系统的新鲜劲儿给吸引了?是不是在犹豫要不要把你的安卓手机升级成鸿蒙...
安卓如何变苹果系统桌面,桌面系... 你有没有想过,把你的安卓手机变成苹果系统桌面,是不是瞬间高大上了呢?想象那流畅的动画效果,那简洁的界...
windows平板安卓系统升级... 你有没有发现,最近你的Windows平板电脑突然变得有些不一样了?没错,就是那个一直默默陪伴你的小家...
安卓系统扩大运行内存,解锁更大... 你知道吗?在科技飞速发展的今天,手机已经成为了我们生活中不可或缺的好伙伴。而手机中,安卓系统更是以其...
安卓系统怎么改变zenly,探... 你有没有发现,你的安卓手机上的Zenly应用最近好像变得不一样了?没错,安卓系统的大手笔更新,让Ze...
英特尔安卓子系统,引领高效移动... 你有没有想过,手机里的安卓系统竟然也能和电脑上的英特尔处理器完美结合呢?这可不是天方夜谭,而是科技发...
永远会用安卓系统的手机,探索安... 亲爱的手机控们,你是否也有那么一款手机,它陪伴你度过了无数个日夜,成为了你生活中不可或缺的一部分?没...
有哪些安卓手机系统好用,好用系... 你有没有发现,现在手机市场上安卓手机的品牌和型号真是琳琅满目,让人挑花了眼?不过别急,今天我就来给你...
卡片记账安卓系统有吗,便捷财务... 你有没有想过,用手机记账是不是比拿着小本本记录来得方便多了?现在,手机上的应用层出不穷,那么,有没有...
武汉摩尔影城安卓系统APP,便... 你有没有想过,一部手机就能带你走进电影的世界,享受大屏幕带来的震撼?今天,就让我带你详细了解武汉摩尔...
联想刷安卓p系统,畅享智能新体... 你有没有发现,最近联想的安卓P系统刷机热潮可是席卷了整个互联网圈呢!这不,我就迫不及待地来和你聊聊这...
mac从安卓系统改成双系统,双... 你有没有想过,你的Mac电脑从安卓系统改成双系统后,生活会有哪些翻天覆地的变化呢?想象一边是流畅的苹...
kindke安卓系统激活码,激... 亲爱的读者,你是否在寻找一款能够让你手机焕然一新的操作系统?如果你是安卓用户,那么今天我要给你带来一...
萤石云监控安卓系统,安卓系统下... 你有没有想过,家里的安全可以随时随地掌握在手中?现在,有了萤石云监控安卓系统,这不再是梦想啦!想象无...
手机安卓系统会不会爆炸,系统升... 手机安卓系统会不会爆炸——一场关于安全的探讨在当今这个数字化的世界里,手机已经成为我们生活中不可或缺...
安卓系统双清详图解,恢复出厂设... 你有没有遇到过手机卡顿、运行缓慢的问题?别急,今天就来给你详细解析一下安卓系统的“双清”操作,让你的...