在前端开发中,我们经常听到 虚拟 DOM(Virtual DOM) 这个概念。它是 React、Vue 等框架的核心机制之一,用来提升性能和简化开发。那么,虚拟 DOM 到底是什么?为什么要用它?又是如何工作的呢?本文将带你系统地理解虚拟 DOM。


  1.什么是 DOM

        在浏览器中,DOMDocument Object Model 是 HTML 的结构化表示。它本质上是一棵树,节点对应页面上的元素。例如:

<div id="app"> <h1>Hello</h1> <p>World</p> </div>

对应的 DOM 树大致是:

- div#app 
- h1 (Hello) 
- p (World)

        DOM 提供了强大的 API,可以操作页面。但缺点是:真实 DOM 操作非常昂贵,频繁修改会导致页面性能下降。


2.什么是虚拟 DOM

        虚拟 DOM 并不是浏览器原生提供的,而是框架用 JavaScript 对象 来模拟 DOM 结构的一层抽象。比如上面的 HTML 可以用虚拟 DOM 表示为:

const vdom ={ 
type: 'div', 
props: { id: 'app' }, 
children: [ 
{ type: 'h1', props: {}, children: ['Hello'] }, 
{ type: 'p', props: {}, children: ['World'] } 
] 
};

可以看到:

  • type 表示标签类型

  • props 存储属性(id、class 等)

  • children 表示子节点

这就是虚拟 DOM —— 真实 DOM 的一个轻量级 JS 对象副本


3.为什么需要虚拟 DOM?

  1. 提升性能

    1. 真实 DOM 操作慢:每次修改 DOM 都会引起回流(reflow)和重绘(repaint)。

    2. 虚拟 DOM 用 JS 对象计算变化,再一次性更新真实 DOM,减少开销。

  2. 跨平台

    1. 虚拟 DOM 不依赖浏览器 DOM,可以映射到不同平台,如 小程序、原生移动端、服务端渲染 等。

  3. 声明式 UI

    1. 开发者只需要描述“状态”,框架通过虚拟 DOM 来决定“如何更新 DOM”。

  4. 中间层的作用

    1. 虚拟 DOM 作为 UI 与底层平台之间的中间层,屏蔽了底层差异。开发者只需要操作统一的虚拟 DOM 层,框架可以根据平台不同输出到浏览器 DOM、原生组件或其他渲染目标,从而实现“一份代码,多端运行”。


  1. 虚拟 DOM 的工作流程

虚拟 DOM 的核心机制是 Diff 算法 + Patch 过程

  1. 创建虚拟 DOM

    1. 初始渲染时,框架会把模板/JSX 转换成虚拟 DOM。

  2. Diff 算法对比

    1. 当状态改变时,生成新的虚拟 DOM。

    2. 对比新旧虚拟 DOM,找出差异。

  3. Patch 更新真实 DOM

    1. 仅更新有变化的部分,而不是整个页面。

例如:

  • 初始:

    <p>Hello</p>

  • 更新后:

    <p>Hi</p>

虚拟 DOM 对比结果:只有 Hello → Hi 变了,于是只修改文本节点,而不是重新渲染整个 <p>


  1. React/Vue 中的虚拟 DOM

  • React:使用 React.createElement 或 JSX 生成虚拟 DOM。React16 之后引入 Fiber 架构,优化调度性能。

  • Vue 2:通过 render 函数生成虚拟 DOM。

  • Vue 3:借助 Proxy + 编译优化,减少不必要的虚拟 DOM 对比,性能更强。


  1. 虚拟 DOM 的误区

  2. 虚拟 DOM 并不总是比手动操作 DOM 快

    1. 少量节点操作时,直接操作 DOM 可能更快。

    2. 虚拟 DOM 优势在于复杂应用中降低维护成本。

  3. 虚拟 DOM ≠ 必须

    1. Svelte 就是一个“无虚拟 DOM”框架,它通过编译时优化,直接生成高效的 DOM 更新代码。


  1. 总结

虚拟 DOM 的本质:

  • 用 JavaScript 对象来描述 UI

  • 通过 Diff 算法找到最小化更新路径

  • 作为中间层屏蔽平台差异,实现多端渲染

  • 高效、跨平台地更新真实 DOM

它的意义不只是性能优化,更是让前端开发以 声明式编程 的方式进行,让我们只关心“结果”,而不用关心“过程”。

未来,随着编译型框架的发展(如 Svelte、SolidJS),虚拟 DOM 可能不再是唯一的选择,但在目前的生态下,它仍然是主流方案。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GraphRAG数据可视化

GraphRAG数据可视化

vue/react项目如何跳转到一个已经写好的html页面

如果是一个你copy的别人的网站&#xff0c;某些页面是已经可以直接使用的&#xff0c;但是有些页面需要在vue/react项目中重新二次调整加工&#xff0c;这个时候&#xff0c;就需要将html文件和vue/react项目结合&#xff0c;当某些页面可以直接使用&#xff0c;就直接跳转到这…

MYSQL-表的约束(下)

目录 自增长 唯一键 外键 自增长 MySQL自增长&#xff08;Auto-Increment&#xff09; 是一种字段属性&#xff0c;用于为表中的记录自动生成唯一的连续整数&#xff0c;常作为主键或唯一标识字段使用&#xff0c;避免手动输入重复值。 核心特性 1. 自动赋值&#xff1a…

《UE5_C++多人TPS完整教程》学习笔记44 ——《P45 倾斜与侧向移动(Leaning And Strafing)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P45 倾斜与侧向移动&#xff08;Leaning And Strafing&#xff09;》 的学习笔记&#xff0c;该系列教学视频为计算机工程师、程序员、游戏开发者、作家&#xff08;Engineer, Programmer, Game Developer, Author&…

使用docker搭建嵌入式Linux开发环境

文章目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言 在日常开发全志、rk等不同平台时&#xff0c;大多数时候只有一个编译主机&#xff0c;但不同sdk所需要的编译环境可能不同。所以本文将记录使用docker为每个平台创建独立的开发环境。 2、安装docker # 1…

【开题答辩全过程】以基于Android的校园跳蚤市场交易系统的设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

【学习笔记】GB 42250-2022标准解析

随着数字化转型的加速推进和网络安全威胁的日益复杂化&#xff0c;网络安全专用产品作为保护关键信息基础设施的第一道防线&#xff0c;其安全性和可靠性受到国家的高度重视。GB 42250-2022《信息安全技术 网络安全专用产品安全技术要求》作为一项强制性国家标准&#xff0c;于…

QML开发踩坑记:从MVVM到QWidget的挣扎

如题&#xff1a;最近这一周在开发的时候被qml不友好的前端框架打败了。首先&#xff0c;我没深入&#xff08;系统的&#xff09;学习过前端的内容&#xff0c;就是在学习Qt的时候了解到了qwidget&#xff0c;后来发现美化不太足的样子&#xff0c;外加AI十分推崇基于QML的MVV…

[Mysql数据库] 知识点总结5

1. 什么是“最少权限原则”&#xff1f;答&#xff1a;应用最少权限原则就是仅为用户授予高效地完成任务所需的权限&#xff0c;除此之外的任何权限均不能授 予&#xff0c;这可以降低用户修改或查看&#xff08;无意或恶意&#xff09;他们无权修改或查看的数据的机率&#xf…

储能变流器学习之MPPT

MPPT最大功率点追踪技术详解 引言 在可再生能源系统中&#xff0c;最大化能量捕获效率是核心目标。无论是光伏发电系统还是储能变流器&#xff08;PCS&#xff09;&#xff0c;最大功率点追踪&#xff08;MPPT&#xff09; 技术都是实现这一目标的关键。本文将深入探讨MPPT技术…

qData 数据中台完整功能介绍 —— 商业版与开源版功能对比

一、qData 数据中台概览 在数字化转型的大背景下&#xff0c;数据已经成为企业最核心、最具价值的资产。qData 数据中台&#xff0c;作为企业数据治理与应用的关键平台&#xff0c;凭借高性能与创新理念脱颖而出。它秉持 “高效、安全、灵活、开放” 的设计原则&#xff0c;致力…

Xshell 自动化脚本大赛技术文章大纲

一、引言1.1 大赛背景与意义介绍 Xshell 在运维、开发等领域的广泛应用&#xff0c;强调自动化脚本对于提升效率、减少错误的重要性。阐述大赛旨在激发用户创新&#xff0c;挖掘 Xshell 自动化脚本更多潜力&#xff0c;促进技术交流与共享。1.2 目标受众明确文章面向熟悉基本 L…

Python 数据分析学习笔记:Pandas 逻辑运算

&#x1f539; DA9&#xff1a;2020年毕业且使用Java的用户&#x1f4cc; 题目描述筛选出 2020年毕业 且 常用语言为 Java 的用户&#xff0c;输出他们的全部信息&#xff0c;并设置显示选项以完整显示数据。✅ 正确代码import pandas as pd# 读取数据 Nowcoder pd.read_csv(N…

图像边缘检测

目录 一.图像边缘检测 1.图像边缘检测概述 2.Sobel算子原理与实现 3.Scharr算子 4.Laplacian算子 5.Canny边缘检测&#xff08;重点&#xff09; 6.效果对比 一.图像边缘检测 1.图像边缘检测概述 2.Sobel算子原理与实现 代码是实现步骤&#xff1a; 边缘检测是图像处…

zookeeper-znode解析

一. 数据模型&#xff1a;ZK拥有一个命名空间就像一个精简的文件系统&#xff0c;不同的是它的命名空间中的每个节点拥有它自己或者它下面子节点相关联的数据。ZK中必须使用绝对路径也就是使用“/”开头。二. znode&#xff1a;zk目录树中每个节点对应一个znode。每个znode维护…

Redis 高可用篇

主从复制是怎么实现的&#xff1f; 如果服务器发生了宕机&#xff0c;由于数据恢复是需要点时间&#xff0c;那么这个期间是无法服务新的请求的&#xff1b;如果这台服务器的硬盘出现了故障&#xff0c;可能数据就都丢失了。 要避免这种单点故障&#xff0c;最好的办法是将数据…

C++ 指针与引用面试深度解析

C 指针与引用面试深度解析面试官考察指针和引用&#xff0c;不仅是考察语法&#xff0c;更是在考察你对C中 “别名” (Aliasing) 与 “地址” (Addressing) 这两种间接访问机制的理解&#xff0c;以及你对 “代码安全” 和 “接口设计” 的思考深度。第一部分&#xff1a;核心知…

LinuxC语言线程的同步与互斥

一.线程的同步与互斥1. 基础概念:1.1 互斥&#xff1a;对共享资源的访问&#xff0c;同一时刻只允许一个访问者进行访问&#xff0c;互斥具有唯一和排他性&#xff0c;互斥无法保证对共享资源的访问顺序1.2 同步: 在互斥的基础上&#xff0c;实现对共享资源的有序访问。2. 互斥…

Centos 7.6离线安装docker

在内网环境下&#xff0c;一般不能联网在线部署&#xff0c;这时候就需要以离线的方式安装docker。本节内容主要总结一下在CentOS 7.6环境中离线安装docker的步骤。 1、下载docker安装包 https://pan.baidu.com/share/init?surlPaUllQZ-dwpgJ7quA5IkcQ&pwd4sfc 2、上传到服…

生成式推荐模型的长序列特征:离线存储

文章目录长序列特征的例子1. Event-level features2. Sequence-level featuresAggregation FeaturesSession-based FeaturesTemporal Order Features3. User-level features4. Interaction features (between user and item/context)how to store the long term user behaviro …