React中的Virtual DOM(看这一篇就够了)

news2024/11/16 12:46:57

文章目录

  • 前言
  • 了解Virtual DOM
  • react创建虚拟dom的方式
  • React Element
  • 虚拟dom的流程
  • 虚拟dom和真实dom的对比
  • 后言

前言

hello world欢迎来到前端的新世界


😜当前文章系列专栏:react合集
🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误,感谢大家指出)🌹
💖感谢大家支持!您的观看就是作者创作的动力

了解Virtual DOM

虚拟 DOM(Virtual DOM)是 React 中的一种技术,它是一个轻量级的 JavaScript 对象树,用于描述真实 DOM 的结构和属性。虚拟 DOM 可以作为中间层存在,用于优化页面渲染的性能和效率。

作用

  • 虚拟 DOM 的基本思想是将整个 DOM 结构抽象成一个 JavaScript 对象树,通过对这个对象树的操作来更新实际的 DOM。当组件的状态或属性发生变化时,React 会生成一个新的虚拟 DOM 树,并通过比较新旧虚拟 DOM 树的差异,找出需要更新的部分。然后,React 会将这些差异转化为最小的 DOM 操作,只更新实际 DOM 中需要变化的部分,从而提高页面渲染的性能。
  • 虚拟 DOM 的主要优势在于它可以避免频繁地直接操作实际 DOM。相比于直接修改实际 DOM,虚拟 DOM 的操作更加轻量级,因为它是在内存中进行的。只有当需要更新实际 DOM 时,React 才会将变化应用到实际 DOM 上,从而减少了对实际 DOM 的操作次数,提高了性能。
  • 此外,虚拟 DOM 还可以简化开发流程。开发者可以将关注点集中在组件的逻辑和状态管理上,而不需要过多地关注实际 DOM 的操作。这样可以提高开发效率,并使代码更易于维护和理解。

总结来说,虚拟 DOM 是 React 中的一个重要概念,通过在内存中构建和操作 JavaScript 对象树,它可以优化页面渲染的性能和效率,同时简化开发流程。虚拟 DOM 在 React 中的应用使得前端开发更加高效和便捷。

react创建虚拟dom的方式

第一种:jsx来创建虚拟dom

const VDOM = (
	<div>
		<h1>我是张三</h1>
		<p>今年28岁了</p>
	</div>
)

使用 React.createElement() 方法:

React 提供了一个名为 createElement() 的方法,用于创建虚拟 DOM 元素。这个方法接受三个参数:元素类型、属性对象和子元素。

const element = React.createElement('div', { className: 'my-class' }, 'Hello, React!');

总结

上述代码中,createElement() 方法创建了一个

元素的虚拟 DOM,其中包含了 className 属性和文本内容。

无论使用 JSX 还是 createElement() 方法,最终都会生成一个虚拟 DOM 对象,它是一个普通的 JavaScript 对象,包含了元素类型、属性、子元素等信息。这个虚拟 DOM 对象可以被 React 用于进行组件的渲染和更新操作。

需要注意的是,创建虚拟 DOM 只是在内存中构建了一个 JavaScript 对象,并没有直接操作实际的 DOM。要将虚拟 DOM 渲染到实际的 DOM 上,需要使用 React 的渲染方法,如 ReactDOM.render()。这个方法会将虚拟 DOM 转化为实际的 DOM 并插入到指定的容器中。

React Element

  • Virtual DOM 是真实 DOM 的模拟,真实 DOM 是由真实的 DOM 元素构成,Virtual DOM 也是由虚拟的 DOM 元素构成。
  • 真实 DOM 元素我们已经很熟悉了,它们都是 HTML 元素(HTML Element)。
  • 那虚拟 DOM 元素是什么呢?React 给虚拟 DOM 元素取名叫 React 元素(React Element)。

在这里插入图片描述

虚拟dom的流程

初始化:当创建一个 React 组件时,React 会生成一个虚拟 DOM 树,它是由轻量级的 JavaScript 对象构成的,与实际的 DOM 结构相对应。

渲染虚拟 DOM:通过调用组件的 render 方法,React 将虚拟 DOM 树转换为真实的 DOM 元素。这个过程会根据组件的状态和属性,生成一个新的虚拟 DOM 树。

Diff 算法:在每次更新组件时,React 会使用 Diff 算法比较新旧虚拟 DOM 树的差异,找出需要更新的部分。Diff 算法通过比较节点的类型、属性和顺序等信息,尽可能地减少对实际 DOM 的操作。

更新实际 DOM:根据 Diff 算法的结果,React 会将需要更新的部分转化为最小的 DOM 操作,然后将其应用到实际的 DOM 结构中。这样可以避免全量更新整个页面,提高页面渲染的效率。

监听数据变化:React 使用了单向数据流的模型,当组件的状态或属性发生变化时,React 会重新执行渲染流程,生成新的虚拟 DOM 树,并更新实际的 DOM 结构。

销毁组件:当组件被销毁时,React 会清除对应的虚拟 DOM 树和实际的 DOM 结构,释放相关资源。

虚拟dom和真实dom的对比

  • 性能更好:虚拟DOM可以减少对真实DOM的操作次数,从而提高应用程序的性能。当组件状态发生变化时,React会使用虚拟DOM来计算出最小化的DOM操作,然后只更新需要更新的部分,而不是整个页面。

  • 更容易维护:由于React使用虚拟DOM,我们可以将组件的状态和UI分离开来。这使得代码更加模块化,易于维护和重构。

  • 跨平台:React Native使用虚拟DOM来构建原生应用程序,因此可以在多个平台上使用相同的代码。

  • 更好的开发体验:React使用JSX语法来描述UI,这使得代码更加简洁、易读、易写,并且可以通过组件化的方式来组织代码。

  • 更好的可测试性:由于React组件是纯函数,它们的输出仅取决于输入,因此可以更容易地编写自动化测试。

后言

创作不易,要是本文章对广大读者有那么一点点帮助 不妨三连支持一下,您的鼓励就是博主创作的动力

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

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

相关文章

双非本两年经验,靠这套Java面试题拿下拿下阿里、百度、美团、滴滴、快手、拼多多等大厂offer

背景 博主是双非大学毕业&#xff0c;有两年的互联网经验 社招面试也是一样的流程&#xff1a;项目 八股 算法 项目&#xff1a; 公司项目&#xff0c;涉及的技术包括但不限&#xff1a; 管理域&#xff1a;DDD、CQRS、事件总线、命令总线 运行域&#xff1a;微内核、规则…

卡尔曼滤波(Kalman Filter)原理及Python实现

Kalman-Filter-Example 项目地址 https://github.com/zhengjie9510/kalman-filter-example 理论公式 详细理论可参考DR_CAN关于卡尔曼滤波器的视频讲解。https://www.bilibili.com/video/BV1dV411B7ME 卡尔曼滤波公式分为预测和更新两部分。 预测公式为&#xff1a; x_hat…

IDENTITY_INSERT 设置为 OFF 时,不能为表 ‘t_user‘ 中的标识列插入显式值

出现这个问题的原因 出现这个问题一般都是SQL server数据库&#xff0c;在创建表主键的时候双击修改标识规范默认自增&#xff0c;如果再插入显示的值就会出现这样的问题。这样的问题是非常常见的&#xff0c;通常会出现在大量数据插入表中&#xff0c;列如 解决的办法 在…

最新发布!阿里云卓越架构框架重磅升级

云布道师 10 月 19 日阿里云峰会山东上&#xff0c;阿里云重磅升级《阿里云卓越架构白皮书》&#xff0c;助力企业在阿里云上构建更加安全、高效、稳定的云架构。《阿里云卓越架构白皮书》在今年的阿里云峰会粤港澳大湾区首度亮相&#xff0c;这是阿里云基于多年服务各行各业客…

RK3399平台开发中安卓系统去除USB权限弹窗

RK3399平台开发中安卓系统去除USB权限弹窗 问题方法 问题 当我们在访问一个插入到Android系统的USB设备的时候往往是需要权限的&#xff0c;此时系统会弹出询问权限的对话框&#xff0c;而我们此时希望让它默认允许访问USB设备并且不希望用户看到这个对话框。 方法 文件目录&…

Dart HttpClient 网络请示框架的使用详解

Dart的HttpClient库是一个用于发送HTTP请求的库&#xff0c;它提供了一个简单的API来执行HTTP请求和接收响应。下面是一个详细的HttpClient使用指南。 1. 导入HttpClient库 首先&#xff0c;确保你已经将HttpClient库导入到你的Dart项目中。你可以使用pubspec.yaml文件中的de…

Java程序设计进阶

Java异常处理机制 异常 异常的最高父类是 Throwable&#xff0c;在 java.lang 包下。 Throwable 类的方法主要有&#xff1a; 方法说明public String getMessage()返回对象的错误信息public void printStackTrace()输出对象的跟踪信息到标准错误输出流public void printSta…

【ArcGIS模型构建器】05:批量为多个矢量数据添加相同的字段

本文实现借助arcgis模型构建器,实现批量为多个土地利用矢量数据添加相同的字段,例如DLMC,DLTB等。 文章目录 问题分析模型构建问题分析 有多个土地利用数据矢量图层,每个图层中有很多个图斑,现在需要给每个图层添加一个或者多个字段,如DLCM,DLBM等。 属性表如下所示: …

javaEE -10(11000字详解5层重要协议)

一&#xff1a;应用层重点协议 1.1&#xff1a; DNS DNS&#xff0c;即Domain Name System&#xff0c;域名系统。DNS是一整套从域名映射到IP的系统。 TCP/IP中使用IP地址来确定网络上的一台主机&#xff0c;但是IP地址不方便记忆&#xff0c;且不能表达地址组织信息&#x…

python+requests+unittest执行自动化接口测试!

1、安装requests、xlrd、json、unittest库 <1>pip 命令安装&#xff1a; pip install requests pip install xlrd pip install json pip install unittest <2> pycharm里安装 2、利用Page Object Model 设计理念创建六类Python Package(也可根据项目要求具体实施…

mysql读取文件

环境地址&#xff1a;phpMyAdmin LOAD DATA INFILE 任意文件读取漏洞 | VULNSPY 参考文章&#xff1a; mysql任意文件读取漏洞学习_BerL1n的博客-CSDN博客 从一道ctf题学习mysql任意文件读取漏洞 - 安全客&#xff0c;安全资讯平台 MYSQL 任意文件读取 小组CTF出题感想 - …

linux离线环境中进入docker镜像安装python包

背景 当发现docker镜像因缺少python包执行失败时,需要修改docker镜像,这时候需要用到这个方法 执行失败步骤 (1)、拷贝docker镜像文件 (2)、加载镜像文件 docker load -i jetz_match.tar(3)、执行容器 docker run --name jetz_match -v /opt/jetz_match:/jetzmatch…

第2篇 机器学习基础 —(2)分类和回归

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。机器学习中的分类和回归都是监督学习的问题。分类问题的目标是将输入数据分为不同的类别&#xff0c;而回归问题的目标是预测一个连续的数值。分类问题输出的是物体所属的类别&#xff0c;而回归问题输出的是数值。本节课就…

waf绕过

1.市场Waf分类 硬件Waf&#xff1a;绿盟、安恒、启明、知道创宇等 需要选择模式 透明模式 反向代理分为反向代理&#xff08;代理模式&#xff09;与反向代理&#xff08;牵引模式&#xff09; 反向代理又分为两种模式&#xff0c;反向代理…

C++常见容器实现原理

引言 如果有一天&#xff01;你骄傲离去&#xff01;&#xff08;抱歉搞错了&#xff09;如果有一天&#xff0c;你在简历上写下了这段话&#xff1a; 那么你不得不在面试前实现一下STL常见的容器了。C的常用容器有&#xff1a;vector、string、deque、stack、queue、list、se…

合宙ESP32C3之Arduino、MicroPython上手

此处所说的ESP32C3&#xff0c;是合宙9.9元包邮的那一款&#xff0c;即所谓的“简约款”&#xff0c;无串口芯片。虽然有串口芯片的经典款版本兼容性更好&#xff0c;但随着各种IDE的不断升级&#xff0c;无串口使用起来也能游刃有余。 1.Arduino环境搭建 首先到Arduino.cc上下…

利用MATLAB创建栅格地图(代码可复制)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…

CoDeSys系列-3、Windows运行时软PLC主站和p-net从站IO设备组网测试

CoDeSys系列-3、Windows运行时软PLC主站和p-net从站IO设备组网测试 文章目录 CoDeSys系列-3、Windows运行时软PLC主站和p-net从站IO设备组网测试一、前言二、Windows运行时软plc配置编程1、安装Windows下的运行时扩展包&#xff08;非必要&#xff09;2、创建项目2.1、创建标准…

基于Java的新闻发布管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…