react替换元素节点_一道 React 面试题:在浏览器、组件和元素中都渲染了些什么?...

2023-11-05

// 每日前端夜话 第403篇
// 正文共:1500 字
// 预计阅读时间:7 分钟
0d5d6e2392f57d980b53e88c8019c5d4.png

这道题的答案有点复杂。

首先要搞清楚 elementcomponent 是不是一回事?

从技术上来说,ReactDOM 不会在 DOM 中渲染 React 组件或 React 元素。它渲染由其组件实例支持的 DOM 元素。对于类组件来说这是正确的。但是对于函数组件,ReactDOM 仅渲染 DOM 元素。函数组件没有实例(可以通过 this 访问),因此在使用函数组件时,ReactDOM 会渲染由函数返回的元素所生成的 DOM 元素。

你需要在这里理解的是,React 元素不同于 DOM 元素。React 元素只是 HTML 元素、React 组件或它们的混合的“描述”。

好吧,一个更好的面试题可能应该这样问:当你在JSX中使用 之类的东西时,它是组件、元素还是实例?

这是一个元素,但不是 DOM 元素,而是一个 React元 素。因为任何 JSX 标签都会被转换为 React.createElement 再去调用。

但是要想让 React 继续使用这个 React 元素的话,必须调用一个函数或从一个类中创建实例。

你可能会在一些 React 教程中看到 组件(component)、元素(element)实例(instance) 这些词。我在这里混用这些词是不对的,但是我认为 React 的初学者需要了解它们的区别。React 官方博客上有一篇文章专门说明这些概念,但我认为这些内容对于初学者来说还远远不够。

以下是这些术语的简单定义:

  • React Component 是模板,蓝图,全局定义的。可以是函数(带有渲染功能)。
  • React Element 是从组件中返回的东西。这个对象实际上描述了组件所代表的 DOM 节点。对于函数组件来说,此元素是函数返回的对象。对于类组件,元素是组件的渲染函数返回的对象。React 元素不是我们在浏览器中所看到的。它们只是内存中的对象,我们无法对其进行任何更改。
  • React 在其内部通过创建、更新和销毁 instance 来找出需要渲染给浏览器的 DOM 元素树。使用类组件时,通常将其浏览器渲染的 DOM 元素称为组件实例。你可以渲染同一组件的多个实例。实例是你在基于类的组件内部使用的 this 关键字。你不需要手动从类创建实例,只需要记住它就在 React 的内存中即可。
  • 基于函数的 React 元素没有实例。一个函数组件仍然可以被多次渲染,但是 React 不会将本地实例与每个渲染相关联。它只是用函数的调用来确定要为该函数渲染的 DOM 元素。

最重要的是,ReactDOM 不会在浏览器中渲染组件,也不会渲染元素(这里的术语元素代表 React.createElement 的返回值)。它也不渲染实例。它只渲染 DOM 元素。

不幸的是,使用术语组件既指模板又指通过模板使用的任何一种实例或者调用,这似乎是很普遍的。人们对此感到困惑很正常,这挺痛苦的。

每个 React 应用都从一个使用 React elementrender 调用开始。下面以 reactjs.org 官网提供的 HelloMessage 案例作为例子,我对这个例子稍微做了一些修改,使其具有了函数组件:

const Today = () => (
  <div>Today is {new Date().toDateString()}div>
);class HelloMessage extends React.Component {
  render() {
    return (
      <React.Fragment><div>Hello {this.props.name}div><Today />React.Fragment>
    );
  }
}ReactDOM.render(
  <HelloMessage name="Taylor" />,
  mountNode
);

第一个 React 元素是我们在 ReactDOM.render 调用中开始的元素:

<HelloMessage name="Taylor" /> // 这是 React element

这个 React 元素描述了要渲染的 DOM 树应该以 HelloMessage 组件和值等于 Taylor 的 prop name 开始。

现在回答问题:HelloMessage 是什么?

每当 React 元素描述一个 React 组件时(就像上面的 React 元素一样),React 使用该组件将描述替换为组件返回的内容。这时它将会为基于类的组件创建一个实例,并将该实例的引用保留在内存中。它不会为基于函数的组件创建任何内容。它只是调用它们。

HelloMessage 组件返回的是一个描述 React.Fragment 组件的 React 元素。

回答问题:React.Fragment 是什么?

React 会持续不断的减少这些组件的未知描述,直到只存在有效的 DOM 节点。React.Fragment 的描述被翻译成 2 个React 元素,一个描述 div ,另一个描述 Today 组件。

回答问题:代码中的 Today  什么是?

它调用 Today 函数来找出最后一个问题。Today 函数返回描述一个 div 的 React 元素。

至此,virtual 树中包含了所有描述 DOM 节点的 React 元素。React 通过一致性比较算法找出要在浏览器中更新的内容。用组件实例所转换的树节点保留修改该实例的能力。


bf900e78bfb396f94e67bbb671683ac2.gif
359ef06eba0ff3422da8fbb5ba253418.png
精彩文章回顾,点击直达
aa1567b5253098adcf97cc0b9eb5baba.png 前端先锋

长按扫描维码
关注我们 获取更多前端资讯
|最新技术|业界动态|

|学习视频|源码资源|

前端先锋 d0eaee1697f01d48961f2529e3a4fbcc.gif转了吗 affb29e6d3ef72a1f4f9dceb5ac32228.gif赞了吗 67aaddc2c1ea87c02d3ac6f6a86d22d6.gif在看吗
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react替换元素节点_一道 React 面试题:在浏览器、组件和元素中都渲染了些什么?... 的相关文章

  • 新手购买了服务器怎么进入

    服务器一般是远程控制进行操作使用 通过服务器远程软件填写服务器IP 端口 用户名及其密码或授权文件进行访问 还可分为桌面图形版和命令行窗口版 对于Linux服务器专业人员来说 使用命令行窗口版较多 基本上的控制是使用命令行操作即可 当然啦
  • linux下宽字符文件, Linux上 wfopen(打开宽字符版的文件名和模式)的实现 (**)

    目录 linux下宽字符文件 Linux上wfopen 打开宽字符版的文件名和模式 的实现 https blog csdn net ken2232 article details 130316198 QString toWCharArray
  • 数字基带信号(主要涉及基带编码、传输系统)

    一 数字基带信号 1 数字基带信号 所谓数字基带信号 就是消息代码的电波形 数字基带信号的类型很多 本节以由矩形脉冲构成的基带信号为例 主要研究这些基带信号的时域波形 频谱波形以及功率谱密度波形 remark 信息是非实体 信源的信息必须外
  • 神经网络学习小记录53——TF2搭建孪生神经网络(Siamese network)比较图片相似性

    神经网络学习小记录53 TF2搭建孪生神经网络 Siamese network 比较图片相似性 学习前言 什么是孪生神经网络 代码下载 孪生神经网络的实现思路 一 预测部分 1 主干网络介绍 2 比较网络 二 训练部分 1 数据集的格式 2
  • vue3中界面使用router,以及使用watch来监听router的改变

    前言 众所周知 vue2中使用router非常简单 但是vue3中略微有些改变 这里来罗列下他的改变 1 路由跳转 vue2 this router push vue3 import useRouter from vue router co
  • cv2.error: OpenCV(4.7.0) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window.cpp:971:...

    这个错误表明在使用 OpenCV 库的 highgui 模块时 程序传入的图像宽度为0 导致断言失败 这通常是由于读取的图像不存在或者文件路径有误导致的 建议检查图像路径是否正确 并确保图像文件存在
  • List集合添加指定元素到指定位置

    以下内容来自 JDK API 1 6 版本 List 接口提供了两种在列表的任意位置高效插入和移除多个元素的方法 方法摘要 boolean add E e 向列表的尾部添加指定的元素 可选操作 void add int index E el
  • 工业以太网通讯Profinet协议详解

    Profinet是通过西门子控制系统被广泛使用的工业通信协议 是一种较新的 基于以太网的工业通讯协议 Profinet使用的物理接口是一个标准的RJ 45以太网插口 Profinet电缆如下图 通过它的绿色外皮很好辨认 虽然在某些情况下 可
  • Lego_Loam--源码分析

    0 整体框架分析 翻看 LEGO Loam 的代码目录 首先进入到launch 文件中 看到
  • Spring boot Mybatis type-aliases-package错误解决

    背景 最近在练习spring boot 2 7 0整合mybatis 2 1 3时 发现在使用mybatis type aliases package配置后 xml中的别名会出现爆红的现象 错误复现 配置文件中 使用mybatis type
  • 开关电源基本原理和种类-反激-正激

    不可不知的几种开关电源及工作原理 前面分享了部分开关电源的基础知识 里面经常涉及不同种类的开关电源 虽然说 开关电源再怎么变 原理都一样 但过程细节总有区别 比如说 石墨和钻石都是同一种元素 碳 但性质有天地之别 扯远了 这次 我总结归纳了
  • **全排列实现数字1-9排序**

    在为蓝桥杯比赛备考过程中 真正体验到自己编程能力的薄弱 在一次小练习中接触全排列这一算法 基于对全排列的熟悉掌握 通过C语言代码实现数字1 9的全排列 当然也可以进行全排列的拓展 C语言实现数字1 9全排列 include
  • 计算机组成原理笔记03

    计算机组成原理笔记03 做题笔记1 内容 教材的思维导图 课后练习 计算部分 中国大学MOOC计算机组成原理 计算部分 1 教材的思维导图 在看题之前 最好先看这篇定点运算 写的特别清晰明了 2 课后练习 3 2 选择题 1 一个C语言程序
  • vue.config.js

    use strict const path require path function resolve dir return path join dirname dir const CompressionPlugin require com
  • 【学习笔记】springboot的AutoConfigurationImportSelector 、@EnableAutoConfiguraion和@import解析

    文章目录 EnableAutoConfiguration介绍 AutoConfigurationImportSelector 例子 使用importSelector 自动装配原理分析 总结 EnableAutoConfiguration介绍
  • ElasticSearch 索引查询使用指南——详细版

    我们通常用用 cat API检测集群是否健康 确保9200端口号可用 curl localhost 9200 cat health v 绿色表示一切正常 黄色表示所有的数据可用但是部分副本还没有分配 红色表示部分数据因为某些原因不可用 2
  • 面试了38位Java候选人之后,我总结出了他们关于面试中的16条通病

    都说现在Java面试卷 前段时间项目招人的时候 我刚好就作为面试官面试了一些人 在整个面试的过程中 我就发现了一些关于面试的通病 所以呢 趁着这次金 铜 九银 铁 十的机会 我就把面试别人时的感受结合自身的所见所闻 整理成16条小建议分享给
  • 【C语言/C++_数组长度问题】如何获取数组长度?

    problem 我们怎么获取数组长度 常规数组 int float double 我们怎么获取字符串数组长度 字符串数组 未完待续 Solution 1 使用sizeof 函数 获取所求数组的的总大小 再获取该数组中单个元素所占空间大小 进
  • Windows 10 系统服务的 “自动(延迟启动)” 时间

    简而言之 设置为Automatic的服务将在引导过程中启动 而设置为Delayed的服务将在引导后立即启动 启动服务延迟可以提高服务器的启动性能 并且具有安全性优势 这些优势在Adriano的文章中列出 默认情况下 自动 延迟启动 实际上是

随机推荐

  • 牛客网Verilog快速入门题目收获——异步复位的串联T触发器(VL2)

    一 题目要求 给出信号示意图以及波形示意图 用verilog实现两个串联的异步复位的T触发器的逻辑 二 完成题目前的知识储备 1 书写规范 根据verilog代码书写规范 低电平复位信号用 rst n 高电平复位用rst 这里题目低电平复位
  • 优秀的框架stylefeng——guns/roses

    Guns基于SpringBoot 致力于做更简洁的后台管理系统 完美整合springmvc shiro mybatis plus beetl Guns项目代码简洁 注释丰富 上手容易 同时Guns包含许多基础模块 用户管理 角色管理 部门管
  • 平均年薪超105万元,区块链开发待遇这么高?

    近段时间 没有比 区块链 更火的词了 2019年10 月 24 日时国家就区块链技术发展现状与趋势进行第十八次集体学习 学习时着重强调 区块链技术的集成应用在新的技术革新和产业变革中起到重要作用 这意味着区块链技术将加速与产业的融合 也就是
  • 【形形色色的卷积】差分卷积

    文章目录 0 前言 1 中心差分卷积 2 像素差分卷积 3 参考 0 前言 普通卷积不能显式地提取图像的梯度信息 因此不能较好地描述细粒度的纹理信息 在人脸活体检测 边缘检测等对细粒度纹理信息敏感的任务中难以取得理想的结果 针对上述问题 O
  • 梁乾东:4.10黄金下周涨跌怎么看?黄金原油最新策略解析

    黄金下周行情解析 周五 4月9日 上海黄金交易所收涨0 54 报370 11元 克 白银T D收涨0 71 报5267元 公斤 金价收高 主要由于美债收益率下跌 美元短线走弱 也给金价带来短期支撑 但由于全球经济复苏良好 这始终对金价构成下
  • idea报错一个包找不到另一个包 com.j8.enity.User cannot be cast to com.j8.enity.lx

    要注意自己定义的类是否是正确的 否则就会出现这样的错误
  • 阿里天池-全球数据智能大赛

    里面的数据解析 https tianchi aliyun com forum issueDetail spm 5176 12282029 0 0 1549467d4xr1bT postId 62363 用NotePad 或其他的软件打开se
  • 鸽巢算法

    该算法主要用来对给定数据集进行排序的 可以快速求出第N大的数字 时间为常数时间 缺点 数据的范围不能太大 步骤如下 1 给定一个待排序数组 相当于一群鸽子 创建一个备用数组 叫鸽巢数组 并初始化元素为0 备用数组的索引 鸽巢的编号 即是待排
  • 让人工智能机器人学会自我情绪管理

    人类微观管理的一个影响是显而易见的 它会减慢速度 人类也是如此 一个不得不向上级请求命令的人类士兵的反应会比一个有权采取主动的人反应更慢 这对人工智能来说是一个更大的刹车 机器人教育课件它的电子思维过程比人类的神经化学大脑循环要快得多 一个
  • 超详细的Node.js环境搭建

    在使用Node js前 我们需要先进行Node js安装和配置 1 下载 Node js官网地址 https node js org 从官网上可以看到有两个版本的安装包 14 15 1和15 3 0 15 3 0是当前最新版 14 15 1
  • a-table及相关组件的使用

    a table及相关组件的使用 基础的渲染
  • 第38.1节 osg加载大tif-编译vpb

    目录 本节内容 具体内容 本节内容 本节开始实现使用osg加载超大tif的功能 具体有多大的tif可以支持呢 就是要多大有多大 要不是网友们提这个功能 我基本上已经忘记vpb了 它是osg早期关于使用影像和高程大图来生成瓦片地形的这么一个工
  • DeepSpeed 部署中bug以及解决方法

    text generation 1 can t find Rust compiler 在Linux上安装Rust 您可以使用curl或者类似包管理器的工具来安装Rust 使用curl命令安装Rust和Cargo curl proto htt
  • java基础:内部类

    内部类 1 简介 大部分时候 类被定义为一个独立的程序单元 在某些情况下 也会把一个类放在另外一个类的内部定义 这种类就被称为内部类 嵌套类 包含内部类的类也被称为外部类 宿主类 2 作用 内部类提供了更好的封装 可以将内部类隐藏在外部类之
  • 图片上传怎么搞?!阿里云OSS对象存储教你快速实现!

    一 需求背景 小白 辉哥 我想在项目中实现图片上传 不知道有没有好用的第三方文件上传技术呢 辉哥 那多了去了 阿里 腾讯 百度 七牛云等都有文件上传技术 你从中随便挑一个 辉哥这就给你安排 小白 阿里也有文件上传 要不辉哥就给我安排阿里的实
  • Spring Boot 读取配置文件的五种方式

    第一种 Value 方式读取 前提条件 在application properties 文件中 写入相关属性值 customer address USA 读取工具类源码 Component public class CustonerConf
  • Java面试整理(二)《JavaSE》

    JavaSE 说明 我会根据我自己的经验 给每个内容标注重要程度 共有三个等级 低 中 高 仅个人参考意见 JVM是什么 中 JVM是Java Virtual Machine的缩写 是用于运行Java字节码的虚拟机 JVM是运行在操作系统之
  • 30功能之Base64编码原理

    一 Base64的由来 目前Base64已经成为网络上常见的传输8Bit字节代码的编码方式之一 在做支付系统时 系统之间的报文交互都需要使用Base64对明文进行转码 然后再进行签名或加密 之后再进行 或再次Base64 传输 那么 Bas
  • 2022接口自动化测试工具Postman 使用教程

    一 Postman接口测试概述 1 1 接口测试 接口是指对协定进行定义的引用类型 通俗讲是就是软件系统不同组成部分衔接的约定 接口测试是测试系统组件间接口的一种测试 接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点 测
  • react替换元素节点_一道 React 面试题:在浏览器、组件和元素中都渲染了些什么?...

    每日前端夜话 第403篇 正文共 1500 字 预计阅读时间 7 分钟 这道题的答案有点复杂 首先要搞清楚 element 和 component 是不是一回事 从技术上来说 ReactDOM 不会在 DOM 中渲染 React 组件或 R