React Virtual DOM及Diff算法

news2024/11/23 13:36:20

JSX到底是什么

使用React就一定会写JSX,JSX到底是什么呢?它是一种JavaScript语法的扩展,React使用它来描述用户界面长成什么样子,虽然它看起来非常像HTML,但他确实是javaScript,在React代码执行之前,Babel会对将JSX编译为React API。

<div className="container">
	<h3>Hello React</h3>
	<p>React is Great</p>
</div>
React.createElement(
	'div',
	{className: 'container'}, 
	React.createElement('h3', null, 'Hello React'),
	React.createElement('p', null, 'Hello React')
)

从两种语法对比来看,JSX语法的出现 只是为了让React开发人员编写界面代码更加轻松。

React.createElement 作用是创建虚拟dom

DOM操作问题

在现代web应用程序中使用javaScript操作DOM是必不可少的,但遗憾的是它比其他大多数JavaScript操作要慢的多。
大多数JavaScript框架对于DOM的更新远远操作其必须进行的更新,从而使得这种缓慢操作变得更糟。
例如假设你有包含十个项目的列表,你仅仅更改了列表的第一项,大多数JavaScript框架会重建整个列表,这比必要的工作要多十倍。
更新效率低下已经成为严重问题,为了解决这个问题,React普及了一种叫做Virtual Dom的东西,Virtual DOM出现的目的就是为了提高JavaScript操作DOM对象的效率。

为什么是Virtual DOM

在React中, 每个DOM对象都有一个对应的Virtual DOM对象,它是DOM对象的JavaScript对象表现形式,其实就是使用JavaScript对象来描述DOM对象信息,比如DOM对象的类型是什么,她身上有哪些属性,它拥有哪些子元素。
可以把Virtual DOM对象理解为DOM对象的副本,但是它不能直接显示在屏幕上。

<div className="container">
	<h3>Hello React</h3>
	<p>React is Great</p>
</div>
{
	type: 'div',
	props: {className: 'container'},
	children: [
		{
			type: 'h3',
			props: null,
			children: [{type: 'text'}, props: {textContent: 'Hello React'}]
		},
		{
			type: 'p',
			props: null,
			children: [{type: 'text'}, props: {textContent: 'Reac'}]
		}
	]
}

Virtual DOM如何提升效率

精准找出发生变化的部分,只更新发生变化的部分。
在React第一次创建DOM对象后,会为每个DOM对象创建其对应的Virtual DOM对象,在DOM对象发生更新之前,React会先更新所有的Virtual DOM对象, 然后React会将更新后的Virtual DOM和更新前的Virtual DOM进行比较,从而找出发生变化的部分。
React会将发生变化的部分更新到真实的DOM对象中,React 仅更新必要更新的部分。
Virtual DOM对象的更新和比较 仅发生在内存中,不会再视图中渲染任何内容,所以这一部分的性能损耗是微不足道的。

在这里插入图片描述

创建Virtual DOM

在React代码执行前 JSX会被Babel转换为React.createElement方法的调用,在调用createElement方法时会传入元素的类型,元素的属性,以及元素的子元素,createElement方法的返回值为构建好的Virtual DOM对象

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

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

相关文章

介绍几种Go语言开发的IDE

文章目录 1.前言2.几种ide2.1 Goland2.2 VsCode示例 2.3 LiteIDE2.4 Eclipse插件GoClipse2.5 Atom2.6 Vim2.7 Sublime Text 3.总结写在最后 1.前言 Go语言作为一种新兴的编程语言&#xff0c;近年来受到了越来越多的关注。 它以其简洁、高效和并发性能而闻名&#xff0c;被广…

基于STC12C5A60S2系列1T 8051单片机的数模芯片DAC0832实现数模转换应用

基于STC12C5A60S2系列1T 8051单片机定时器/计数器应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍数模芯片DAC0832介绍通过按键调节数模芯片DAC0832输出模拟量控制…

ThreadLocal原理及使用场景

ThreadLocal意为线程本地变量&#xff0c;用于解决多线程并发时访问共享变量的问题 明显&#xff0c;在多线程的场景下&#xff0c;当有多个线程对共享变量进行修改的时候&#xff0c;就会出现线程安全问题&#xff0c;即数据不一致问题。常用的解决方法是对访问共享变量的代码…

dll文件【C#】

加载方法&#xff1a; [DllImport("controlcan.dll")] public static extern UInt32 VCI_OpenDevice(UInt32 DeviceType, UInt32 DeviceInd, UInt32 Reserved); 文件存放位置&#xff1a; 一般放Debug文件夹下。 运行错误&#xff1a; 原因是CPU位数选择不对&…

F8652X 984865265 F8652E 984865264

F8652X 984865265 F8652E 984865264 亚历克能够满足最严格的建筑规范开箱-不需要大量的定制&#xff0c;设计时间或劳动力&#xff0c;或专门的布线系统。 模块化ALEC系统包括三个简单的硬件组件——区域控制器(ZC001)、标准按钮墙板和物联网(IoT)网关。该系统可以无限扩展&…

Python高级语法----高级Python函数式编程

文章目录 1. 函数式编程概念2. 使用functools模块3. 深入理解lambda, map, filter, reduce函数a. lambda 函数b. map 函数c. filter 函数d. reduce 函数1. 函数式编程概念 函数式编程是一种编程范式,它将计算视为函数的评估,并避免使用程序状态及可变数据。在Python中,函数…

【VS Code插件开发】创建终端(八)

🐱 个人主页:不叫猫先生,公众号:前端舵手 🙋‍♂️ 作者简介:前端领域优质作者、阿里云专家博主,共同学习共同进步,一起加油呀! ✨优质专栏:VS Code插件开发极速入门 📢 资料领取:前端进阶资料可以找我免费领取 目录 一、createTerminal创建终端二、终端方法1、…

警方打击了大规模网络钓鱼提供商BulletProftLink

导语 最近&#xff0c;马来西亚皇家警察宣布成功打击了一个名为BulletProftLink的大规模网络钓鱼提供商。这个提供超过300个钓鱼模板的平台被查封&#xff0c;给全球网络安全带来了巨大的利好消息。本文将带您了解这个引人注目的行动背后的故事&#xff0c;并揭示BulletProftLi…

根据特定规则生成合并数据,遍历循环时会存在数据错乱等情况的问题排查(深拷贝 仅自己记录)

问题前景 在合并生成领料单&#xff0c;选择相同物料&#xff0c;合并领料&#xff0c;但因批次&#xff0c;数量不一样&#xff0c;需要单独生成一个主单据下面显示具体的物料&#xff0c;主单据的数量必须是选择单据的数量累加 错误代码演示 const temp JSON.parse(JSON…

YOLOV5中parser参数配置

源码下载链接&#xff1a;ultralytics/yolov5: YOLOv5 &#x1f680; in PyTorch > ONNX > CoreML > TFLite (github.com) 需要配置的参数&#xff1a;--data parser.add_argument(--data, ...)&#xff1a;添加一个用于数据配置文件的路径的参数。 可以直接修改&am…

达索系统SOLIDWORKS 2024钣金和结构系统新功能

达索系统SOLIDWORKS钣金和结构系统是大家比较熟悉的模块了&#xff0c;在2024版本中钣金和结构系统功能也做了很棒的提升。接下来让我们看看如何使用达索系统SOLIDWORKS 2024钣金和结构系统的一些新功能快速完成相应的设计。 达索系统SOLIDWORKS 2024的钣金提供了槽口延伸功能…

【C++】一维字符数组 与 二维字符数组

一维字符数组 一维字符数组 可以通过数组名直接进行整体输入和输出&#xff08;注意&#xff1a;当使用一维字符数组存储字符串时&#xff0c;因为元素尾部会有一个空字符\0,所以需要给空字符\0留一个位置&#xff09; char a[5]; cin>>a; cout<<a;二维字符数组 …

通过ping来测试网络带宽

在windows下通过 ping -l 5000 192.168.31.1 其中5000为设置ping的单个包的大小 192.168.31.1为目的地地址 假设ping 5000字节平均耗费1ms而ping 45000字节平均耗费4ms&#xff0c;因此&#xff0c;往返额外花费3ms单程额外花费1.5ms&#xff0c;多发送40000字节即320000比特…

[文件读取]GoCD 任意文件读取漏洞 (CVE-2021-43287)

1.1漏洞描述 漏洞编号CVE-2021-43287漏洞类型文件读取漏洞等级⭐⭐漏洞环境VULFOCUS攻击方式 描述: GoCD 一款先进的持续集成和发布管理系统,由ThoughtWorks开发。&#xff08;不要和Google的编程语言Go混淆了&#xff01;&#xff09;其前身为CruiseControl,是ThoughtWorks在…

MySQL--MHA高可用

MHA相关知识 1.什么是MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件MHA 的出现就是解决MySQL 单点故障的问题。目的&#xff1a;MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。MH…

揭秘软件测试培训骗局:如何从贩卖焦虑到高薪包就业

你可能并不是一个IT行业的从业者&#xff0c;也可能是第一次听说软件测试工程师这个岗位。但由于看了某个网站的广告&#xff0c;或者听某个人说可以花钱培训软件测试技术&#xff0c;入职软件测试工程师岗位&#xff0c;于是动了这方面的心思。 但是互联网上有很多地方说&…

Kstry: 业务架构的首选之选

在当今数字化时代&#xff0c;构建稳健且高效的业务架构对于企业的成功至关重要。Kstry作为一种创新性的技术架构&#xff0c;已经在各个领域展现出卓越的表现。本文将探讨为何Kstry被视为业务架构的首选&#xff0c;并介绍其独特的特点和优势。 引言 业务架构是指基于企业战略…

C语言—i++、++i、条件运算符、goto语句、注释

i和i #include <stdio.h> int main() {int i5,j;j i;printf("i%d,j%d\n", i, j);i 5;j i;printf("i%d,j%d\n", i, j);system("pause");return 0;}i6,j6 i6,j5 请按任意键继续. . .条件运算符 goto语句 #include <stdio.h> int …

工业交换机的解决方案

在工业网络产品的早期阶段&#xff0c;主要关注的是工业交换机的电气、物理、结构等方面的特点。如今的工业网络&#xff0c;在规范硬件条件的同时&#xff0c;也正在向智能、灵活、高效的方向发展。除了注重硬件方面&#xff0c;它还越来越重视软件特性&#xff0c;如网管、环…

【C#学习】button:只显示图片

第一步&#xff1a;设置按钮背景图片&#xff0c;并且图片随按钮大小变化 第二步&#xff1a;设置按钮使之只显示图片 button1.FlatStyle FlatStyle.Flat;//stylebutton1.ForeColor Color.Transparent;//前景button1.BackColor Color.Transparent;//去背景button1.FlatAppe…