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

相关内容

热门资讯

【srs】源码构建srs5.0... 3 对比了http server 发现srs更稳定和更受欢迎 5.0 git clone -b 5...
day5—选择题 文章目录1.下面的程序 编译运行后,在屏幕上显示的结果是(A࿰...
中文代码120 PK      嘚釦                docProps/PK    嘚釦X雋  y  ...
金三银四互联网大厂最全1000... Java 面试 大家都知道,现在的 Java 面试是越来越难了!主要原因...
【RocketMQ】源码详解:... 消费者启动 入口 : org.apache.rocketmq.client.impl....
Nuxt.js - nuxt/... 文章目录nuxt2基础添加拦截器使用nuxt3后续会更新 nuxt2 官方文档 基础 下载,新建好...
怎么看时序图 | 从时序理解嵌... 版权声明: 著作权归元存储,禁止转载 Hello 大家好, 我是元存储~ 主页:元存储的博客_CSD...
数据结构 -- 线性表:定长顺... 一、顺序表 概念: 是一种线性结构(1对1的关系)...
WPF DataGrid突出显...  DataGrid有时需要对某个表格的数据进行突出显示: 思路:利用IM...
SpringBoot学习笔记(... 文章目录2 依赖管理和自动配置2.1 依赖管理2.1.1 什么是依赖管理2.1.2 修改自动仲裁/默...
Hadoop--万恶NameN... 每次用到Hadoop集群时NameNode总有各种各样奇奇怪怪的问题启动不了或者hdfs用9870端...
《Linux是怎样工作的》 读... 内存管理 Linux通过内核中名为内存管理系统的功能来管理系统上搭载的所有内存。除了各种进程以外&...
umi配置多环境变量并在doc... umi配置多环境变量并在docker中跑起来1、项目背景2、配置环境变量3、使用docker 容器 ...
MATLAB R2023a更新... R2023a来啦!!废话不多说看看新版本有啥有趣的玩意和好玩的特性叭&#...
古典密码学 主要划分方式及其分类按密钥方式划分:对称,非对称按明文处理方式分...
MySQL与分布式:主从复制 文章目录MySQL与分布式一、Linux下载 MySQL二、主从复制①修改配置文件②配置主机③配置从...
2023年3月广州/东莞/惠州... 软考是全国计算机技术与软件专业技术资格(水平)考试(简称软...
Android异步消息机制 一、异步消息处理机制Handler Android中的异步消息处理主要由4个部分组成:...
UART驱动情景分析-注册 一、tty串口驱动框架 应用程序通过某一个设备节点来访问驱动程序,设备节点都对应了某些...
leetcode 1092. ... 给出两个字符串 str1 和 str2,返回同时以 str1 和 str2 作为子序列...