当前位置: 首页 > 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对象

http://www.lryc.cn/news/231242.html

相关文章:

  • Spark通过三种方式创建DataFrame
  • 【坑】idea终端下执行maven命令行报错:mvn clean install -Dspring.profiles.active=dev
  • Linux下mysql安装配置教程
  • 在 Electron上安装better-sqlite3出错
  • 利用网络管理解决方案简化网络运维
  • C#中.NET Framework4.8 Windows窗体应用通过EF访问数据库并对数据库追加、删除记录
  • 使用Filebeat+Kafka+Logstash+Elasticsearch构建日志分析系统
  • 后端接口错误总结
  • 将scut-seg标签转化成通用coco标签
  • 阿里云添加端口
  • Linux组调度
  • 深入解析JavaScript中的变量作用域与声明提升
  • 【Python】jupyter notebook(学习笔记)
  • 红色旅游AR互动体验将景区推向更广泛的市场
  • VR全景:打造虚拟政务服务,打通服务群众“最后一公里”
  • PyCharm 安装库时显示连接超时
  • 那些让我苦笑不得的 Bug:编码之路的坎坷经历
  • http接口测试—自动化测试框架设计
  • HTML 之常用标签的介绍
  • 数据恢复入门分享-启动扇区
  • 解决Chrome无法自动同步书签
  • Java绘图-第19章
  • SpringBoot文件在线预览实现
  • cudnn安装
  • uni-app发布后iOS端页面背景图片上下滑动问题
  • ctfshow 文件上传 151-161
  • Selenium浏览器自动化测试框架简单介绍
  • bclinux aarch64 ceph 14.2.10 文件存储 Ceph File System, 需要部署mds: ceph-deploy mds
  • 【微前端】micro-app搭建项目实战
  • C语言——分割单向链表