【 React 】Real DOM 和Virtual DOM的区别?优缺点?

1. 是什么

Real DOM,真实DOM ,意思为文档对象模型,是一个结构化文本的抽象,在页面渲染出的每一个结点都是一个真实DOM结构,如下:

javascript 复制代码
<div id="root">
    <h1>Hello World</h1>
</div>

Virtual Dom,本质上是以JavaScript对象形式存在的对DOM的描述
创建虚拟DOM目的就是为了更好将虚拟的节点渲染到页面视图中,虚拟DOM对象的节点与真实DOM 的属性一---照应

在React中,JSX是其一大特性,可以让你在JS中通过使用XML的方式去直接声明界面的DOM结构

javascript 复制代码
//创建h1标签,右边千万不能加引号
const vDom =<h1>Hello World</h1>;
//找到<div id="root"></div>节点
 const root =document.getElementById("root");
 //把创建的h1标签渲染到root节点上
ReactDOM.render(vDom,root);

上述中,ReactDOM.render()用于将你创建好的虚拟DOM节点插入到某个真实节点上,并渲染到页面上

JSX实际是一种语法糖,在使用过程中会被babel进行编译转化成JS代码,上述VDOM转化为如下:

c 复制代码
const vDom = React.createElement(
    'h1',
    { className: 'hClass', id: 'Id' },
    'hello world'
)

可以看到,JSX就是为了简化直接调用React.createElement()方法:

  • 第一个参数是标签名,例如h1、span、table...
  • 第二个参数是个对象,里面存着标签的一些属性,例如id、class等
  • 第三个参数是节点中的文本

通过console.log(VDOM),则能够得到虚拟VDOM消息

所以可以得到,]SX通过babel的方式转化成React.createElement执行,返回值是一个对象,也就是虚拟DOM

2. 区别

两者的区别如下:

  • 虚拟DOM不会进行排版与重绘操作,而真实DOM会频繁重排与重绘
  • 虚拟DOM的总损耗是"虚拟DOM增删改+真实DOM差异增删改+排版与重绘",真实DOM的总损耗是"真实DOM完全增删改+排版与重绘"

传统的原生api或jQuery去操作DOM时,浏览器会从构建DOM树开始从头到尾执行一遍流程

当你在一次操作时,需要更新10个DOM节点,浏览器没这么智能,收到第一个更新DOM请求后,并不知道后续还有9次更新操作,因此会马上执行流程,最终执行10次流程

而通过VNode,同样更新10个DOM节点,虚拟DOM不会立即操作DOM,而是将这10次更新的diff内容保存到本地的一个js对象中,最终将这个js对象一次性attach到DOM树上,避免大量的无谓计算

3. 优缺点

真实DOM的优势:

  • 易用

缺点:

  • 效率低,解析速度慢,内存占用量过高
  • 性能差:频繁操作真实DOM,易于导致重绘与回流

使用虚拟DOM的优势如下:

  • 简单方便:如果使用手动操作真实DOM来完成页面,繁琐又容易出错,在大规模应用下维护起来也很困难
  • 性能方面:使用Virtual DOM,能够有效避免真实DOM数频繁更新,减少多次引起重绘与回流,提高性能
  • 跨平台:React借助虚拟DOM,带来了跨平台的能力,一套代码多端运行

缺点:

  • 在一些性能要求极高的应用中虚拟DOM无法进行针对性的极致优化
  • 首次渲染大量DOM时,由于多了一层虚拟DOM的计算,速度比正常稍慢
相关推荐
我即将远走丶或许也能高飞1 小时前
vuex 和 pinia 的学习使用
开发语言·前端·javascript
钟离墨笺1 小时前
Go语言--2go基础-->基本数据类型
开发语言·前端·后端·golang
爱吃泡芙的小白白1 小时前
Vue 3 核心原理与实战:从响应式到企业级应用
前端·javascript·vue.js
卓怡学长2 小时前
m115乐购游戏商城系统
java·前端·数据库·spring boot·spring·游戏
老陈聊架构2 小时前
『AI辅助Skill』掌握三大AI设计Skill:前端独立完成产品设计全流程
前端·人工智能·claude·skill
Ulyanov3 小时前
从桌面到云端:构建Web三维战场指挥系统
开发语言·前端·python·tkinter·pyvista·gui开发
cypking3 小时前
二、前端Java后端对比指南
java·开发语言·前端
摘星编程3 小时前
用React Native开发OpenHarmony应用:timing定时动画参数
javascript·react native·react.js
糠帅傅蓝烧牛肉面3 小时前
单实例多MCP聚合服务:两种实现方案深度对比
前端·docker·ai
哈哈你是真的厉害3 小时前
基础入门 React Native 鸿蒙跨平台开发:多种Switch 开关介绍
react native·react.js·harmonyos