当前位置: 首页 > news >正文

React Virtual DOM及Diff算法

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对象

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 人工智能基础_机器学习033_多项式回归升维_多项式回归代码实现_非线性数据预测_升维后的数据对非线性数据预测---人工智能工作笔记0073
  • 池化层是有什么作用
  • Redis - 订阅发布替换 Etcd 解决方案
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • 常用免费网站总结(自用)
  • 如何在3DMax中使用超过16个材质ID通道?
  • 避免defer陷阱:拆解延迟语句,掌握正确使用方法
  • 微服务的注册发现和微服务架构下的负载均衡
  • cocos----1
  • 压力测试总共需要几个步骤?思路总结篇
  • 想买GPT4会员却只能排队?来看看背后的故事!
  • Linux安装Docker完整教程
  • 【C++11】线程库
  • 假如我是AI Agent专家,你会问什么来测试我的水平
  • 67基于matlab图像处理,包括颜色和亮度调整、翻转功能、空间滤波和去噪、频域滤波和去噪、噪声添加,形态学操作、边缘检测及示波器集成的GUI图像处理。
  • [译]Python中的类属性与实例属性的区别
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • MySQL主从复制读写分离及奇怪的问题
  • PHP 7 修改了什么呢 -- 2
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 关于for循环的简单归纳
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • # linux 中使用 visudo 命令,怎么保存退出?
  • #100天计划# 2013年9月29日
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (zhuan) 一些RL的文献(及笔记)
  • (二)c52学习之旅-简单了解单片机
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • @angular/cli项目构建--Dynamic.Form
  • [ C++ ] STL---string类的使用指南
  • [<死锁专题>]
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [C++][opencv]基于opencv实现photoshop算法色阶调整
  • [CocosCreator]Android的增加AndroidX的动态权限
  • [CTF]php is_numeric绕过