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

目录

  • 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树:


以上。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW FPGA开发NI sbRIO-9607高精度数字滤波器

使用NI sbRIO-9607硬件平台&#xff0c;通过LabVIEW FPGA模块实现一个高精度数字滤波器。该应用不需要额外的实时操作系统 (RT)&#xff0c;所有控制与数据处理均在sbRIO-9607的FPGA上完成&#xff0c;充分利用其并行处理能力&#xff0c;实现低延迟、高性能的数据滤波。这种滤…

Linux系统--vi/vim编辑器

目录 vi\vim编辑器介绍 vi\vim编辑器的三种工作模式 命令模式&#xff08;command mode&#xff09;&#xff1a; 输入模式 &#xff08;insert mode&#xff09;&#xff1a; 底线命令模式&#xff08;Last line mode&#xff09;&#xff1a; 命令的选项 查看命令帮助和…

kali配置静态ip

kali配置静态ip 因为一些环境需要&#xff0c;本地linux主机需要搭建一个桥接模式的网络&#xff0c;那么直接就在kali中配置了&#xff0c; 打开vim /etc/network/interfaces 这里就需要自己配置一下ip&#xff0c;网关&#xff0c;路由等内容 这里参考&#xff1a;参考链接 …

Django render()函数页面渲染

1&#xff0c; render() 函数 在Django框架中&#xff0c;render() 函数是一个非常有用的快捷方式&#xff0c;用于从视图函数返回一个完整的HTTP响应。它负责将给定的模板与上下文数据结合&#xff0c;渲染出最终的HTML页面&#xff0c;并返回一个HttpResponse对象。 from d…

[AI资讯·0605] GLM-4系列开源模型,OpenAI安全疑云,ARM推出终端计算子系统,猿辅导大模型备案……

AI资讯 1毛钱1百万token&#xff0c;写2遍红楼梦&#xff01;国产大模型下一步还想卷什么&#xff1f;AI「末日」突然来临&#xff0c;公司同事集体变蠢&#xff01;只因四大聊天机器人同时宕机OpenAI员工们开始反抗了&#xff01;AI手机PC大爆发&#xff0c;Arm从软硬件到生态…

前端应用开发实验:组件应用

目录 实验目的相关知识点实验内容及要求代码实现效果 实验目的 &#xff08;1&#xff09;掌握组件的创建方法&#xff08;全局组件、局部组件&#xff09;&#xff1b; &#xff08;2&#xff09;重点学会组件之间的数据传递&#xff08;prop传值、自定义事件&#xff09;&am…

单列集合--ArryList、LinkedList、Set

使用IDEA进入某个类之后&#xff0c;按ctrlF12,或者alt数字7&#xff0c;可查看该实现类的大纲。 package exercise;import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.function.Consumer;public class Demo3 {public static void…

微信小程序公众号二合一分销商城源码系统 基于PHP+MySQL组合开发的 可多商户商家入驻 带完整的安装代码包以及搭建教程

系统概述 微信小程序公众号二合一分销商城源码系统&#xff0c;是基于PHPMySQL组合开发的一款高效、稳定的电子商务平台解决方案。该系统创新性地将微信公众号与小程序的功能进行了深度整合&#xff0c;为商家提供了一个功能齐全、易于管理的分销商城系统。通过此系统&#xf…

基于聚类与统计检验深度挖掘电商用户行为

1.项目背景 在当今竞争激烈的电商市场中,了解用户的行为和需求对于制定成功的市场策略至关重要,本项目通过建立RFM模型、K-Means聚类模型,将1000个用户进行划分,针对不同类的用户,提出不同的营销策略,最后通过统计检验来探究影响用户消费行为的因素和影响用户上网行为的…

揭秘数字工厂:如何运用AGV、LMS和WMS成为制造业的隐藏神器

揭秘数字工厂&#xff1a;如何运用AGV、LMS和WMS成为制造业的隐藏神器 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &a…

泛微开发修炼之旅--07通过后端代码实现创建并发送待办、源码及示例

文章链接&#xff1a;泛微开发修炼之旅--07通过后端代码实现创建并发送待办、源码及示例

C语言实战:贪吃蛇(万字详解)

&#x1f4a1;目录 效果图 界面设计思路 1. 基本布局 2. 视觉元素 游戏机制设计 基本规则 游戏代码 前期准备 游戏代码详解 数据结构设计 宏定义 数据结构定义 函数原型&#xff08;详见后文&#xff09; 主函数代码 核心代码 Review 效果图 界面设计思路 1. 基…

[论文笔记]Mixtral of Experts

引言 今天带来大名鼎鼎的Mixtral of Experts的论文笔记&#xff0c;即Mixtral-8x7B。 作者提出了Mixtral 8x7B&#xff0c;一种稀疏专家混合(Sparse Mixture of Experts&#xff0c;SMoE)语言模型。Mixtral与Mistral 7B具有相同的架构&#xff0c;不同之处在于每个层由8个前馈…

Mybatis03-ResultMap及分页

1、属性名和字段名不一致问题 1.问题 数据库中的字段 新建一个项目Mybatis-04&#xff0c;拷贝之前&#xff0c;测试实体类字段不一致的情况 public class User {private int id;private String name;private String password; }select * from mybatis.user where id #{id} …

2024年会计、金融与工商管理国际会议(ICAFBA 2024)

2024年会计、金融与工商管理国际会议 2024 International Conference on Accounting, Finance, and Business Administration 【1】会议简介 2024年会计、金融与工商管理国际会议是一场集合了全球会计、金融与工商管理领域专家学者的学术盛会。此次会议旨在深入探讨会计、金融与…

【C++课程学习】:类和对象(上)(类的基础详细讲解)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 &#x1f35f;1.1类的引出&#xff1a; &#x1f35f;1.2类的结构&#xff1a; &#x1f35f;1.3类的…

进入新公司有焦虑感怎么办?

前因 前两天技术交流群里有童鞋问了一个很有意思的问题&#xff0c;他问如何克服进入新公司的焦虑感&#xff1f;很多热心的童鞋都纷纷支招&#xff0c;比如 “主动干活”、“专注干活”、“让时间冲淡焦虑感”、……等等&#xff0c;这些都很有道理&#xff0c;不过&#xff…

最小栈、栈的弹出(C++)

1.最小栈 思路分析&#xff1a; 代码&#xff1a; class MinStack { public:MinStack() {}void push(int val) {st.push(val);//两种情况需要更新最小值//1.最小栈为空(就是存最小值的那个栈)//2.插入的值小于或等于最小栈的栈顶元素if(minstack.empty()||minstack.top()>…

高并发系统限流原理

短时间内巨大的访问流量&#xff0c;我们如何让系统在处理高并发的同时还能保证自身系统的稳定性&#xff1f;估计有人会说&#xff0c;增加机器就可以了&#xff0c;因为我的系统架构设计就是按照分布式思想进行架构设计的&#xff0c;所以可以只需要增加机器就可以解决问题了…