【React】手把手学习React - 元素渲染

2023-11-07

前言

大家好,分享了这么多文章发现无论是项目实战还是源码分析或者是基本使用,绝大多数文章都是关于Vue的,还没有关于React的分享,接下来从今天开始我们将一起学习一下React。React与vue一样也是一个非常火爆的前端库。关于React的基本介绍我们曾在之前的一篇文章中分享过了,感兴趣的小伙伴可以前往初识React查看。今天的分享我们将学习一下React中的元素渲染

元素的渲染

什么是元素的渲染呢?在React的官方有这么一句话来描述:元素是构成react应用的最小单元,它用于描述屏幕上输出的内容。其实当我们打开一个网页时呈现在我们眼前的内容都是由元素组成的,但React中的元素与浏览器的DOM元素不同,React元素是创建开销极小的普通对象(可以理解为虚拟dom),然后通过ReactDOM更新真实DOM来与React元素保持一致。我们平时在浏览器中看到的内容都是由真实DOM元素构成的;React最终会把虚拟DOM元素转换为真实DOM并渲染

初识React中我们讲项目的目录结构时提到public/index.html,在这个文件中有个id为“root”的div元素,我们将其称为DOM节点,因为该节点内所有的内容都将由React DOM管理。当我们使用React构建应用时通常只会定义一个单一的根节点。在React的每个组件(后面章节会讲解组件)中只能有一个根节点存在 要想将React元素渲染到根DOM节点中,我们只需把它们传入ReactDOM的render方法即可,如下代码:

const element = <h1>Hello, world!</h1>
ReactDOM.render(
	element,
   document.getElementById("root") 	
); 

执行上面的代码,页面上就会出现“Hello, world”

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BkfOzxfL-1658320147085)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7e328f60641d40b6b03a9ae3b8a9ca32~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image?)]

更新已渲染的元素

React 元素都是不可变的。当元素被创建之后,我们是无法改变其内容或属性的。那么如果我们想把已经渲染的元素更新掉该怎么办呢,目前能想到唯一办法就是创建一个新的元素,然后将它传入 ReactDOM.render() 方法替换原来的元素以实现重新渲染,下面我们来看一个显示当前时间的例子:

function currentDate() {
const element = (
   <div>
    <h1>Hello, world!</h1>
     <h2>现在是: {new Date().toLocaleTimeString()}.</h2>
   </div>
 );
 ReactDOM.render(
   element,
   document.getElementById('root')
 );
}
setInterval(currentDate, 1000); 

上面代码中我们定义了一个currentDate方法,在方法中定义了React元素并调用ReactDOM的render方法将元素渲染到根DOM节点root中,并在定时器中每隔1秒调用一次函数从而重新渲染页面。但是我们发现React元素的代码和javascript的代码杂在了一起,其实我们可以把两者进行分离,让React元素专门用于渲染,而javascript专门干javascript该干的事。我们可以把用于展示的React元素封装起来,然后通过属性传值(后面章节中讲解)的方式把值动态的传给React元素,从而达到react元素与js代码分离的效果,同时也能达到代码复用的目的,看如下示例:

function Clock(props) {
 return (
   <div>
     <h1>Hello, world!</h1>
     <h2>现在是:{props.date.toLocaleTimeString()}.</h2>
   </div>
 );
}
function currentDate() {
 ReactDOM.render(
   <Clock date={new Date()} />,
   document.getElementById('root')
 );
}
setInterval(currentDate, 1000); 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aP9tEnN7-1658320147086)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ba24a5f96cf8451a82302e2e46027856~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image?)]

元素的局部更新

React在更新已渲染的元素的时候,ReactDOM会将元素和它的子元素与它们之前的状态进行对比,并且只会更新与之前状态不一样的元素,也就是说哪些元素发生了变化就更新哪些元素,而不是全部更新, 我们可以通过浏览器的检查元素工具查看上一个例子来确认这一点。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x3Xb678B-1658320147086)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3439d35ba05a4b928bcfae92ada5f421~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image?)]

尽管每一秒我们都会新建一个描述整个 UI 树的元素,但实际上React DOM 只会更新发生了改变的内容,也就是例子中的h2显示当前日期部分

总结

本次分享我们学习了react中的元素渲染,首先学习了react中元素的概念,然后还简单介绍了react中元素与浏览器中dom元素的区别,最后通过显示Hello,world和实时获取当前时间的小例子来展示了如何实现react中的元素渲染。今天的分享就都这里了!!!

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

【React】手把手学习React - 元素渲染 的相关文章

随机推荐

  • Rider 使用

    下载地址 http www jetbrains com rider fromMenu 破解 https www iteblog com archives 1542 html http idea iteblog com key php 使用
  • 约瑟夫环问题(单循环链表实现)

    用单循环链表解决约瑟夫环问题 大致思路 1 利用尾插法建立一个循环链表 建表成功后删除头结点 2 核心算法 生成一个work指针 每走到约定的step 1的位置时停止 利用pdel指针标记后继结点 循环释放pdel 直到work work
  • java数组(二)

    数组 Arrays 数组是一种数据结构 它是一组相同类型的元素的集合 该集合中的每个元素都通过一个索引访问 在Java中 数组是一个对象 它可以存储在堆上或栈上 具体取决于它如何创建 数组可以是单维数组或多维数组 数组是一个固定长度的数据结
  • C++(基础入门笔记)

    1搭建环境 include
  • TCP/IP/UDP/RTP/RTCP协议

    IP 指定目的地址和源地址 Version 版本号 四个字节 IHL IP Header Length IP头长度 Total Length 总的长度 总的长度减去IP头长度 数据长度 Identification Flags Fragme
  • linux OSI七层模型、TCP/IP协议栈及每层结构大揭秘

    学习Linux 就算是像小编我这样的小萌新 也知道OSI模型 什么 你不知道 好吧 这篇秘籍拿走 不谢 一 两个协议 1 OSI 协议模型 7层 国际协议 PDU 协议数据单元对等层次之间传递的数据单位 OSI协议 7层 国际协议 PDU
  • 伺服控制-canopen

    通迅中断参数设 1 中断 停止 伺服驱动 电机停转 开启抱死动作 1 配置 opration 2 设置 3速度模式 3 设置 伺服松轴 4 设置 伺服使能 运行 1 使能 true 2 启用 true 停止 1 使能 false 2 松轴
  • Linux下安装Nginx服务并设置开机自启动

    目录 一 安装Nginx 二 开机自启动服务配置 一 安装Nginx 系统平台 CentOS Linux release 7 9 2009 Core 64位 Nginx安装版本 liunx 64位 nginx 1 20 2 tar gz 安
  • VSCode进行Lua调试

    1 安装EmmyLua 2 添加配置 3 开始调试 要选择要调试的进程就可以了
  • Docker中快速搭建SFTP

    1 拉docker镜像 docker pull atmoz sftp 2 初始化 创建容器 docker run name internalsftp p 22 22 d atmoz sftp anonymous hello123 opt U
  • 震惊~Signal <XXX> missing in the sensitivity list is added for synthesis purposes在verilog中警告的解决方法

    你是否还在为秃头而烦恼 你是否还在通宵为了赶项目而焦急 朋友 你不是 一个人 看看吧 下面是这个bug的描述 WARNING HDLCompiler 91 F FPGA Doc AD test uart v Line 56 Signal
  • java通过JDBC连接mysql8.0数据库,并对数据库中的表进行增删改查操作

    目录 一 JDBC简介 二 添加依赖 三 JDBC操作数据库的步骤 四 JDBC操作数据库 增删改查 一 新增数据 二 删除数据 三 修改数据 四 查询数据 五 多表连接查询 一 JDBC简介 Java数据库连接 Java Database
  • vue-cli配置sass,使用全局sass变量

    vue cli创建vue2 0项目 安装sass步骤 创建vue2 0项目 vue init webpack 项目名 安装sass步骤 npm install node sass 4 14 1 npm install sass loader
  • JMP、Hook

    include stdio h include tchar h include windows h offset 目标地址 jmp指令起始地址 5 跳转指令解码 0xe9 offset offset 有符号整型 四字节 它等于jmp指令的下
  • 微信小程序——仿盒马鲜生APP

    前段时间 随着马化腾现身全国多地用微信小程序乘坐公交的新闻出现 微信小程序的热度可谓是更上了一层 微信小程序现身至今 因其不用下载就可使用的方便等优点 发展趋势一直良好 盒马鲜生的问世也是充满了热度 实现了快速配送 可谓是阿里巴巴对线下超市
  • 科幻风的卡片视频播放

    上一篇博文展示了卡片中的VR展示 那篇主要是卡片的3D转动来展示未显示的部分图片 这篇 我们来点科幻的 我们在卡片中播放视频的同时来拖动卡片或转动它 像下面那样 这个主要依赖了两个库 具体代码如下
  • 浅谈js宏观任务、微观任务

    js运行机制分为同步异步 异步又分为宏观事件和微观事件 同步异步 js是一门单线程语言 因此js在同一个时间里只能做一件事 单线程意味着 如果在同个时间有多个任务的话 这些任务就需要排队 前一个执行完成才能执行下一个任务 同步任务 同步任务
  • Echarts:象形柱图实现水塔水位的动画、水球图和液位柱子图

    一 象形柱图 1 vue中使用象形柱图 效果图 2 代码实现
  • axios调接口 与缓存

    axios getarr1 let url https www fastmock site mock f5427ab2a4d20236b4aed7a0579d2213 api shop list 调接口 后端给的地址 this axios
  • 【React】手把手学习React - 元素渲染

    前言 大家好 分享了这么多文章发现无论是项目实战还是源码分析或者是基本使用 绝大多数文章都是关于Vue的 还没有关于React的分享 接下来从今天开始我们将一起学习一下React React与vue一样也是一个非常火爆的前端库 关于Reac