React 中的元素、组件、实例和节点

2023-11-10

React 元素其实就是一个简单JavaScript对象,一个React 元素和界面上的一部分DOM对应,描述了这部分DOM的结构及渲染效果。一般我们通过JSX语法创建React 元素,

React 元素可以分为两类:DOM类型的元素和组件类型的元素。DOM类型的元素使用像h1、div、p等DOM节点创建React 元素,前面的例子就是一个DOM类型的元素;组件类型的元素使用React 组件创建React 元素

const element = <h1 className='greeting'>Hello, world</h1>;

element是一个React 元素。在编译环节,JSX 语法会被编译成对React.createElement()的调用,从这个函数名上也可以看出,JSX语法返回的是一个React 元素。上面的例子编译后的结果为:

element就是一个组件类型的元素,它的值是:

const element = React.createElement(
 'h1',
 {className: 'greeting'},
 'Hello, world!'
);

对于DOM类型的元素,因为和页面的DOM节点直接对应,所以React知道如何进行渲染。但是对于组件类型的元素,如buttonElement,React是无法直接知道应该把buttonElement渲染成哪种结构的页面DOM,这时就需要组件自身提供React能够识别的DOM节点信息

React元素描述的是React虚拟DOM的结构,React会根据虚拟DOM渲染出页面的真实DOM。

组件 (Component)

React 组件,应该是大家最熟悉的React中的概念。React通过组件的思想,将界面拆分成一个个可以复用的模块,每一个模块就是一个React 组件。一个React 应用由若干组件组合而成,一个复杂组件也可以由若干简单组件组合而成。

React组件和React元素关系密切,React组件最核心的作用是返回React元素。这里你也许会有疑问:React元素不应该是由React.createElement() 返回的吗?但React.createElement()的调用本身也是需要有“人”负责的,React组件正是这个“责任人”。React组件负责调用React.createElement(),返回React元素,供React内部将其渲染成最终的页面DOM。

既然组件的核心作用是返回React元素,那么最简单的组件就是一个返回React元素的函数:

function Welcome(props) {
 return <h1>Hello, {props.name}</h1>;
}

Welcome是一个用函数定义的组件。如果使用类(class)定义组件,返回React元素的工作具体就由组件的render方法承担,例如:

class Welcome extends React.Component {
 render() {
  return <h1>Hello, {this.props.name}</h1>;
 }
}

其实,使用类定义的组件,render方法是唯一必需的方法,其他组件的生命周期方法都只不过是为render服务而已,都不是必需的。

实例 (Instance)

这里的实例特指React组件的实例。React 组件是一个函数或类,实际工作时,发挥作用的是React 组件的实例对象只有组件实例化后,每一个组件实例才有了自己的props和state,才持有对它的DOM节点和子组件实例的引用。在传统的面向对象的开发方式中,实例化的工作是由开发者自己手动完成的,但在React中,组件的实例化工作是由React自动完成的,组件实例也是直接由React管理的。换句话说,开发者完全不必关心组件实例的创建、更新和销毁。

节点 (Node)

在使用PropTypes校验组件属性时,有这样一种类型:

MyComponent.propTypes = { 
 optionalNode: PropTypes.node,
}

PropTypes.node又是什么类型呢?这表明optionalNode是一个React 节点。React 节点是指可以被React渲染的数据类型,包括数字、字符串、React 元素,或者是一个包含这些类型数据的数组。

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

React 中的元素、组件、实例和节点 的相关文章

  • Dimple.js - 将数据标签添加到条形图的每个条形

    我使用的是dimple js 它基于d3 js 是否可以向本示例中提到的条形图的每个条形添加数据标签http dimplejs org examples viewer html id bars vertical http dimplejs
  • 将鼠标悬停在图像上以显示按钮,并且将鼠标悬停在实际按钮上时不会触发

    我试图让按钮在悬停在图像上时出现 以下作品 jQuery show image mouseenter function jQuery the buttons animate opacity 1 1500 mouseout function
  • 茉莉花节点没有输出

    我是 JavaScript Node js 和 jasmine 的新手 我正在尝试运行 Node Craftsman Book 一书中的测试 FilesizeWatcher 我创建了 package json 文件并运行 npm insta
  • 使用 javascript 调用 ViewComponent

    我有一个带有几个视图组件的网页 当我单击这些组件时 我会为其打开一个简单的编辑器 请参见下图 如果我编辑文本并按 Enter 键 我想重新渲染视图组件而不是孔页面 是否可以使用 javascript 调用视图组件来获得此行为 通过更新 您现
  • browserify 错误 /usr/bin/env: 节点: 没有这样的文件或目录

    我通过 apt get install 安装了 node js 和 npm 以及所有依赖项 然后安装了 browserify npm install browserify g 它完成了整个过程 看起来安装正确 但是当我尝试为此做一个简单的捆
  • 最小的 ExtJS 包是什么?

    有谁知道 Ext JS 2 2 所需的最少文件吗 我知道 ExtJS 网站有一个功能 build http extjs com products extjs build ExtJS ext js 的小版本 作为 ext all js 的替代
  • 如何制作像Stackoverflow一样的可折叠评论框

    我正在构建一个网站 并且有一个状态更新列表 我希望允许用户为列表中的每个项目撰写评论 但是我正在尝试实现一个类似于堆栈溢出工作方式的用户界面 特别是可折叠的评论表单 列表 用户在其中单击对列表中的特定状态更新添加评论 并且在列表中的该项目下
  • 如何在CKEditor 5中监听焦点事件

    我想听一下 CKEditor 5 中的焦点事件 我认为这样的事情会起作用 但回调从未被调用 document querySelector editable ClassicEditor create el then editor gt edi
  • 从 DOM 中删除后,动态添加的 JavaScript 脚本会继续执行

    因此 我正在创建一个 SPA 并使用 AJAX 将 HTML 页面加载到我网站的索引页面中 问题是 当包含我的一个页面时 它似乎会徘 徊并执行其中的 JavaScript 代码 即使它随后从 DOM 中删除 索引 html 正文 div d
  • 如何在 Chrome 中实现抓取光标图标?

    我知道可以在 Chrome 中使用抓取光标图标 当然是在 Gmail 中 但我不知道如何在我的代码中实现它 我已经尝试过 在CSS中 body cursor grab body cursor webkit grab body cursor
  • React延迟加载/无限滚动解决方案

    我花了一段时间才弄清楚如何使用优秀的延迟加载图像React Lazyload 组件 https github com jasonslyvia react lazyload 演示在滚动时延迟加载图像 但在测试时我无法获得相同的行为 罪魁祸首是
  • 区分单击与 mousedown/mouseup

    我已经阅读了有关这种情况的 stackoverflow 上的几个答案 但没有一个解决方案有效 我尝试根据用户是否单击某个元素或使用 jQuery 将鼠标按住该元素来执行不同的操作 有可能做到这一点吗 onMouseDown 将在按下左侧或右
  • 为什么我的 onclick 事件自动触发

    加载页面时最初显示 Hello World 我希望它仅在单击按钮后显示 我知道我可以通过向按钮添加内联事件侦听器来做到这一点 我可以只用脚本编写所有这些代码吗
  • t /= d 是什么意思? Python 和错误

    t current time b begInnIng value c change In value d duration def easeOutQuad swing function x t b c d alert jQuery easi
  • Rxjs 可观察等待直到满足某些条件

    我有以下重试逻辑来重试操作 对于单个请求来说它工作得很好 对于多个正在进行的请求 我想在重试之前等待现有的重试逻辑完成 handleError errors Observable
  • Web浏览器控件:如何捕获文档事件?

    我正在使用 WPF 的 WebBrowser 控件加载一个简单的网页 在这个页面上我有一个锚点或一个按钮 我想在我的应用程序后面的代码中 即在 C 中 捕获该按钮的单击事件 WebBrowser 控件是否有办法捕获加载页面元素上的单击事件
  • while 循环元素状态 cypress

    我有一个问题 我想单击一个按钮直到它消失 但次数可能会有所不同 所以我想检查可见性状态 当可见 true时单击按钮 当可见 false时结束测试 但问题是我不知道如何循环从获取元素到末尾的所有链 单击按钮一次 由于中断而停止 如果我删除中断
  • 如何在 jQuery 中检查复选框是否被选中?

    我需要检查checked复选框的属性 并使用 jQuery 根据选中的属性执行操作 例如 如果age复选框被选中 然后我需要显示一个文本框来输入age 否则隐藏文本框 但下面的代码返回false默认情况下 if isAgeSelected
  • 如何仅在第一次访问时弹出模态窗口

    我有一个模式窗口 当您访问某个页面时会弹出 访客必须选择我同意或我不同意 我需要一个漂亮的小 jquery 脚本 它会记住谁之前访问过该页面并同意 这样他们每次访问该页面时就不会弹出模式 有人可以推荐一个好的脚本来使用吗 这是代码 div
  • Javascript / jQuery - 转换特殊 html 字符

    我有一个pre元素中包含一些 html 代码 该代码中有特殊字符 例如 lt 所以它不会破坏页面 然后我有一个 javascript 函数 它获取此 pre 元素的内容 突出显示它 使用 codemirror 并用突出显示的文本替换元素内容

随机推荐

  • Twins: Revisiting the Design of Spatial Attention inVision Transformers解读

    文章 https arxiv org abs 2104 13840 代码 GitHub Meituan AutoML Twins Two simple and effective designs of vision transformer
  • Protobuf Java (2)

    接上一篇文章 Protobuf Java 1 接下来写一个demo 使用protobuf 读写消息 目录 1 写消息 2 读一个消息 3 扩展Protocol Buffer 1 写消息 现在让我们尝试使用协议缓冲区类 您希望地址簿应用程序能
  • CentOS7主机名的查看和修改

    CentOS7主机名的查看和修改 在CentOS7中 有三种定义的主机名 静态的 Static hostname 静态 主机名也称为内核主机名 是系统在启动时从 etc hostname自动初始化的主机名 瞬态的 Tansient host
  • Ping 命令

    PING Packet Internet Groper 因特网包探索器 Ping命令是Windows系列自带的一个可执行命令 利用它可以检查网络是否能够连通 并且能够帮助我们分析判定网络故障 ping的发送和接收 同一个子网中的源主机对目的
  • html ui组件,UI组件

    Bootstrap 天然响应式 12分栏 cnpm install bootstrap 安装相关包 在index html中引入文件后才可以用 如下 ElementUI 24分栏 elementUI使用 安装 element ui cnpm
  • Django 启动报错 mysqlclient 1.4.0 or newer is required; you have 0.9.3

    报错原因 MySQLclient 目前只支持到 Python3 4 这里使用了更高版本的 python 那么需要 我们在Django 配置文件目录下 也就是setting py 同级目录下 配置指定版本的mysqlclient pymysq
  • Flowable工作流引擎的使用2(BPMN结构及节点介绍)

    Flowable工作流引擎的使用 2BPMN结构介绍 上一篇讲到了flowable如何使用 用了一个简单的demo 演示了一下流程的创建 发起 审核 查询等功能 内容不多但是引申出很多的概念 BPMN deployId processId
  • 数据分析笔记—数据仓库篇

    数据仓库 数据仓库 Data Warehouse 可简写为DW或DWH 数仓等 它仅适用于查询和分析 通常涉及大量的历史数据 数据仓库中的数据一般来自应用日志文件 数据埋点 和事务应用 实际发生的业务记录的数据 等广泛来源 一个数据仓库通常
  • yolo 推理 nms

    测试代码 另外一个说明cv2绘制不了中文 但可以用其他包实现 from pathlib import Path import cv2 import torch from models common import DetectMultiBac
  • 数组新增的常用方法(es6-es12)-今天一定要学会

    1 forEach 遍历数组中的元素 不改变原数组 2 map 遍历数组 对数组中每个元素做操作并将操作后的元素放到数组中返回 不改变原数组 3 filter 过滤 返回包含所有在回调函数上结果未true的值的新数组 不改变原数组 4 ev
  • 关于CPU的浮点运算能力计算

    原文链接 https www jianshu com p b9d7126b08cc Intel官方参数 https ark intel com FLOAS 核数 单核主频 CPU单个周期浮点计算值
  • 从头开始学Java——JVM虚拟机八问

    文章目录 什么是Java虚拟机 为什么Java被称为 平台无关的编程语言 什么是JIT HotSpot怎么工作的 HotSpot虚拟机要使用解释器与编译器并存的架构 什么是编译时 运行时 编译 运行 编译时运行时问题归纳 反射 描述Java
  • 解决node-sass: Command failed 问题

    从github 下载的vue 源码 yarn 安装报错 爬了下百度 试了好几种方法都没成功 最后ChatGPT帮我解决了 ChatGPT回答 一语命中 好用 node sass 是一个将 Sass 编译为 CSS 的 Node js 模块
  • 关于springboot使用定时器的几种方式

    1 Scheduled注解 Component public class SimpleSchedule private Integer time 0 定时器定义 设置执行时间 Scheduled cron 6 private void pr
  • maven -- 问题解决(二)解决“Could not calculate build plan”问题

    错误提示如下 eclipse maven Could not calculate build plan Failure to transfer org apache maven plugins maven surefire plugin p
  • disabled_button

    直接看题目 然后干他 这里说flag在按钮上 但是我们就是按不了这个flag 那直接看HTML呗 可以看到它这里有个搞鬼的东东 一搜 可以知道这个东西禁止让你输入 你不让我输入 我就给你删了呗 然后我们可以点flag 一点 flag就出来了
  • 关于漏洞"这个页面包含一个错误/警告信息,可能会导致敏感信息泄露"

    公司开发的产品 在用软件扫描漏洞时 扫出了这么一个漏洞 可以看出有漏洞的地方是登录页面 在登录中 主要逻辑如下 一些拒绝登录是通过抛异常 gt 然后捕获异常 gt 获取异常信息 gt 跳回到登录页面并展示错误信息 下面为代码示例 Requs
  • 如何获取 docker 容器(container)的 ip 地址

    1 进入容器内部后 lcc lcc docker exec it docker mysql bash root b3b1d61142df root b3b1d61142df cat etc hosts 127 0 0 1 localhost
  • Hive 是怎样保存元数据的

    保存元数据的方式有 内存数据库derby 本地mysql数据库 远程mysql数据库 本地的mysql数据库用的比较多 因为本地读写速度都比较快 内存数据库derby 安装小 但是数据存在内存 不稳定 mysql数据库 数据存储模式可以自己
  • React 中的元素、组件、实例和节点

    React 元素其实就是一个简单JavaScript对象 一个React 元素和界面上的一部分DOM对应 描述了这部分DOM的结构及渲染效果 一般我们通过JSX语法创建React 元素 React 元素可以分为两类 DOM类型的元素和组件类