React@16.x(20)渲染流程-首次渲染

news2024/11/20 4:50:24

目录

  • 1,渲染的前置知识点
    • 1.1,React 元素
    • 1.2,React 节点
    • 1.3,节点类型
    • 1.4,真实DOM
  • 2,首次渲染
    • 2.1,根据参数创建节点
    • 2.2,不同节点,有不同处理
    • 2.3,生成虚拟DOM树
    • 2.4,将生成的真实DOM对象,加入到容器中
  • 3,部分举例说明
    • 3.1
    • 3.2
    • 3.3

1,渲染的前置知识点

渲染:将 React 元素生成特定对象,并通过这些对象生成真实 DOM 对象,加入到容器中。

1.1,React 元素

1,通过 React.createElement() 创建,JSX 是它的语法糖。

  • <div></div>
  • <App />

2,它有一个 type 属性,用于标记类型

常见类型举例:

const ele = <div></div>;
console.log(ele);

普通 DOM

在这里插入图片描述

class Child extends Component {}
console.log(<Child />);

在这里插入图片描述

函数

function Child() {}
console.log(<Child />);

在这里插入图片描述

1.2,React 节点

专门用于渲染到页面的特定对象

  • 通过React 元素创建;
  • ReactDOM 通过它来进行渲染

1.3,节点类型

下面这些都是 React 自己创建的节点类型:

  1. DOM 节点,创建该节点的 React 元素类型 是一个字符串。
  2. 组件(Composite)节点,创建该节点的 React 元素类型是一个函数或类。
  3. 文本(Text)节点,由字符串,数字创建。
  4. 空(Empty)节点,由 nullundefinedfalsetrue 创建。
  5. 数组节点,由一个数组创建。

举例:

1和2已经有例子了,不多赘述。

3,4,5说的【创建】是指通过 React 元素创建,也就是说字符串,数字,null 等也都会被创建为 React 元素,再创建 React 节点。

const ele = "text"; // 或 123, null, true 等 
console.log(<ele />);

// 数组可以直接渲染
export default class App extends Component {
    render() {
        return (
            <>
                123
                {true}
                {ele}
                [1,2,3]
            </>
        );
    }
}

注意,节点类型中并不包括普通对象,所以普通对象无法渲染

1.4,真实DOM

通过 document.createElement() 创建的 DOM 元素。

2,首次渲染

ReactDOM.render(参数1, 参数2) 的过程中,React 内部会将React 元素(参数1)先转为 React 节点,再进行渲染(挂载到参数2)。

2.1,根据参数创建节点

参数指 ReactDOM.render() 的第一个参数:

ReactDOM.render(app, document.getElementById('root'));

2.2,不同节点,有不同处理

  1. 文本节点:通过 document.createTextNode() 创建真实的文本节点。
  2. 空节点:无事发生(但节点存在)。
  3. DOM节点:通过 document.createElement() 创建真实DOM对象,接着立即设置该真实DOM元素的各种属性(属性在 props 中),然后遍历对应 React 元素的 children 属性,进行递归操作(回到第1步)。
  4. 数组节点:遍历数组,对数组的元素创建节点,并进行递归操作(回到第1步)。
  5. 组件节点:
    1. 函数组件:调用该函数(函数必须返回可以生成节点的内容),将函数返回的结果进行递归操作(回到第1步)
    2. 类组件:
      1. 创建类的实例;
      2. 调用类的生命周期方法 static getDerivedStateFromProps()
      3. 调用组件的 render 方法,得到节点对象进行递归操作(回到第1步);
      4. 将组件的生命周期方法 componentDidMount() 加入到执行队列(先进先出)。当整个虚拟DOM树构建完成,并将真实DOM对象加入到容器之后,执行该队列。

结合类组件的第3步和第4步。可以得到父子组件生命周期的执行顺序:
getDerivedStateFromProps --> 父 render -->
getDerivedStateFromProps --> 子 render ->
componentDidMount() --> 父 componentDidMount()

2.3,生成虚拟DOM树

对节点处理后,会生成整个虚拟DOM树,同时节点对应的真实DOM也生成了。

React 会将虚拟DOM树保存起来,后续更新时会进行对比。

2.4,将生成的真实DOM对象,加入到容器中

ReactDOM.render() 的第2个参数就是容器,通过 appendChild() 方法将生成的真实DOM对象,加入容器中。

ReactDOM.render(app, document.getElementById('root'));

3,部分举例说明

3.1

const app = <div className="assaf">
    <h1>
        标题
        {["abc", null, <p>段落</p>]}
    </h1>
    <p>
        {undefined}
    </p>
</div>;
ReactDOM.render(app, document.getElementById('root'));

得到的虚拟DOM树:

3.2

function Comp1(props) {
    return <h1>Comp1 {props.n}</h1>
}

function App(props) {
    return (
        <div>
            <Comp1 n={5} />
        </div>
    )
}

const app = <App />;
ReactDOM.render(app, document.getElementById('root'));

得到的虚拟DOM树:

3.3

class Comp1 extends React.Component {
    render() {
        return (
            <h1>Comp1</h1>
        )
    }
}

class App extends React.Component {
    render() {
        return (
            <div>
                <Comp1 />
            </div>
        )
    }
}

const app = <App />;
ReactDOM.render(app, document.getElementById('root'));

得到的虚拟DOM树:


以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1791567.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ollama+FastAPI+React手把手构建自己的本地大模型,支持SSE

最近大家都在玩LLM&#xff0c;我也凑了热闹&#xff0c;简单实现了一个本地LLM应用&#xff0c;分享给大家&#xff0c;百分百可以用哦&#xff5e;^ - ^ 先介绍下我使用的三种工具&#xff1a; Ollama&#xff1a;一个免费的开源框架&#xff0c;可以让大模型很容易的运行在…

JVMの垃圾回收

在上一篇中&#xff0c;介绍了JVM组件中的运行时数据区域&#xff0c;这一篇主要介绍垃圾回收器 JVM架构图&#xff1a; 1、垃圾回收概述 在第一篇中介绍JVM特点时&#xff0c;有提到过内存管理&#xff0c;即Java语言相对于C&#xff0c;C进行的优化&#xff0c;可以在适当的…

【AI大模型】Transformers大模型库(三):特殊标记(special tokens)

目录​​​​​​​ 一、引言 二、特殊标记&#xff08;special tokens&#xff09; 2.1 概述 2.2 主要功能 2.3 代码示例 三、总结 一、引言 这里的Transformers指的是huggingface开发的大模型库&#xff0c;为huggingface上数以万计的预训练大模型提供预测、训练等服…

设计模式之过滤器模式FilterPattern(十)

一、过滤器模式 过滤器模式&#xff08;Filter Pattern&#xff09;或标准模式&#xff08;Criteria Pattern&#xff09;是一种设计模式&#xff0c;这种模式允许开发人员使用不同的标准来过滤一组对象&#xff0c;通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模…

Python爬虫之简单学习BeautifulSoup库,学习获取的对象常用方法,实战豆瓣Top250

BeautifulSoup是一个非常流行的Python库&#xff0c;广泛应用于网络爬虫开发中&#xff0c;用于解析HTML和XML文档&#xff0c;以便于从中提取所需数据。它是进行网页内容抓取和数据挖掘的强大工具。 功能特性 易于使用: 提供简洁的API&#xff0c;使得即使是对网页结构不熟悉…

QtCharts使用

1.基础配置 1.QGraphicsView提升为QChartView#include <QtCharts> QT_CHARTS_USE_NAMESPACE #include "ui_widget.h"2. QT charts 2.柱状图 2.1QBarSeries //1.创建Qchart对象QChart *chart new QChart();chart->setTitle("直方图演示");//设…

【机器学习300问】107、自然语言处理(NLP)领域有哪些子任务?

自然语言处理&#xff08;NLP&#xff09;是计算机科学、人工智能和语言学领域的一个交叉学科&#xff0c;致力于让计算机能够理解、解析、生成和与人类的自然语言进行互动。自然语言指的是人们日常交流使用的语言&#xff0c;如英语、汉语等&#xff0c;与计算机编程语言相对。…

MySQL中:cmd下输入命令mysql -uroot -p 连接数据库错误

目录 问题cmd下输入命令mysql -uroot -p错误 待续、更新中 问题 cmd下输入命令mysql -uroot -p错误 解决 配置环境变量&#xff1a;高级系统设置——环境变量——系统变量——path编辑——新建——MySQL.exe文件路径&#xff08;如下图所示&#xff09; phpstudy2018软件下&am…

《微服务大揭秘:SpringBoot与SpringCloud的魔法组合》

加入我们的探险队伍&#xff0c;一起深入SpringBoot与SpringCloud构建的微服务世界。以轻松幽默的笔触&#xff0c;带你一步步揭开微服务架构的神秘面纱&#xff0c;从服务发现的智能地图Eureka&#xff0c;到API网关Zuul的城市门卫&#xff0c;每一个环节都充满了惊喜。不仅如…

北航数据结构与程序设计第四次作业选填题复习

首先都是线性的&#xff0c;线性包括顺序和链式&#xff0c;栈和队都可以用两种方式实现。栈只能存于栈顶取于栈顶&#xff0c;队列先进先出&#xff0c;因此存取点是固定的。 函数栈帧创建原理 画图即可。 A.显然不行&#xff0c;5如果第一个出来说明5是最后一个进的&#xf…

《2024年网络安全预测:未来规划深度洞察》

2024 年打击网络对手的计划。 阅读报告&#xff0c;了解我们的专家对 2024 年网络安全行业的预测&#xff0c;包括&#xff1a; 攻击者将人工智能融入其行动中&#xff0c;防御者利用它来加强检测和响应 民族国家继续开展网络行动以实现其地缘政治目标 攻击者继续利用零日漏洞…

nginx代理vue项目路由跳转刷新

常规代理 在我们日常开发中&#xff0c;前端部署到服务器&#xff0c;需要用到nginx部署&#xff0c;简单代理如下&#xff1a; #user nobody; worker_processes 1;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid…

node mysql的增删改查基础

学习koa时&#xff0c;不选择mongodb&#xff0c;而是MySQL&#xff0c;虽然node对mongodb更亲和&#xff0c;但是我感觉MySQL的键值对的储存结构更正规 1.首选确认你的数据库有个库。有个表,我的如下 2.配置 let mySqlConfig{host:localhost,user:root,password:123456,data…

单列集合--List

方法演示&#xff1a; package exercise;import java.util.ArrayList; import java.util.List;public class ListDemo1 {public static void main(String[] args) {List<String> list new ArrayList<>();list.add("hello");list.add("world"…

【MATLAB源码-第222期】基于matlab的改进蚁群算法三维栅格地图路径规划,加入精英蚁群策略。包括起点终点,障碍物,着火点,楼梯。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 蚁群算法&#xff08;Ant Colony Optimization&#xff0c;ACO&#xff09;是一种通过模拟蚂蚁觅食行为的启发式优化算法。它由意大利学者Marco Dorigo在20世纪90年代初提出&#xff0c;最初用于解决旅行商问题&#xff08;T…

LabVIEW源程序安全性保护综合方案

LabVIEW源程序安全性保护综合方案 一、硬件加密保护方案 选择和安装硬件设备 选择加密狗和TPM设备&#xff1a;选择Sentinel HASP加密狗和支持TPM&#xff08;可信平台模块&#xff09;的计算机主板。 安装驱动和开发工具&#xff1a;安装Sentinel HASP加密狗的驱动程序和开发…

Linux: ubi rootfs 加载故障案例

文章目录 1. 前言2. ubi rootfs 加载故障现场3. 故障分析与解决4. 参考资料 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. ubi rootfs 加载故障现场 问题故障内核日志如下&#xff1a; Star…

python-01

第一个程序 import randomcomputer random.randint(1, 3) print(电脑出的是&#xff1a;, computer) i int(input(你要出什么&#xff1f;1代表石头&#xff0c;2代表剪刀&#xff0c;3代表布\n)) if i computer:print(平局) elif (computer 1 and i 3) or (computer 2 …

DP动态规划(上)

文章目录 动态规划基本概念斐波那契数列问题C 实现Python 实现Java 实现 迷你结C、Python和Java在实现动态规划时有哪些性能差异&#xff1f;迷你结哪种语言在动态规划中更适合大规模数据处理?迷你结C有哪些知名的库适用于动态规划和大数据处理?动态规划辅助库大数据处理库 迷…

vs2019 c++20 规范 STL库中关于时间的模板 ratio<T,U> , duration<T,U> , time_point<T,U>等

(探讨一)在学习线程的时候&#xff0c;一些函数会让线程等待或睡眠一段时间。函数形参是时间单位&#xff0c;那么在 c 中是如何记录和表示时间的呢&#xff1f;以下给出模板简图&#xff1a; &#xff08;2 探讨二&#xff09;接着给出对模板类 duration_values 的成员函数的测…