虚拟DOM和DOM是什么?有什么区别?虚拟DOM的优点是什么?

article/2025/6/15 23:54:45

虚拟DOM与真实DOM的概念

虚拟DOM(Virtual DOM)是一种对真实DOM的抽象表示,其结构通常为一个JavaScript对象,保存了DOM节点的标签、属性、子节点等信息。真实DOM则是浏览器中的实际文档对象模型,由HTML代码解析生成,用于描述页面的结构和内容。

虚拟DOM的设计理念源于对真实DOM操作性能问题的反思。由于真实DOM的操作通常需要频繁地进行重绘与重排,这会消耗大量资源且性能开销较大。而虚拟DOM能够在内存中高效地进行更新与比较,从而在数据发生改变时,只对需要更新的部分进行真正的DOM操作。


虚拟DOM与真实DOM的区别

  1. 实现方式

    • 真实DOM是由HTML代码解析生成的树形结构,直接与浏览器交互。
    • 虚拟DOM是一个JavaScript对象,不依赖于具体的平台环境,可以跨平台使用。
  2. 操作效率

    • 操作真实DOM会导致浏览器重新计算布局并渲染页面,性能较低。
    • 虚拟DOM通过在内存中完成差异计算,仅更新必要的部分到真实DOM,效率更高。
  3. 适用场景

    • 真实DOM适用于简单的静态页面或少量动态内容的更新。
    • 虚拟DOM适用于复杂的动态页面,尤其是像Vue、React这样的前端框架中,能够显著提升性能。

虚拟DOM的优点

  1. 性能优化
    虚拟DOM通过“ diff 算法”计算出新旧虚拟DOM之间的差异,并将这些差异应用到真实DOM上,减少了不必要的DOM操作。

  2. 跨平台能力
    由于虚拟DOM是基于JavaScript对象的,因此它可以在不同的环境中运行,例如浏览器、Node.js或Weex等。

  3. 开发体验提升
    在Vue等框架中,开发者无需手动操作DOM,框架会自动根据虚拟DOM的变化更新视图,降低了开发复杂度。


示例代码

以下是一个使用Vue框架创建虚拟DOM的示例:

// 手动创建虚拟DOM
import { h, createApp } from 'vue';const vnode = h('div', { id: 'app' }, [h('h1', {}, '这是一个标题'),h('p', {}, '这是段落内容'),
]);// 将虚拟DOM挂载到真实DOM
createApp({ render: () => vnode }).mount('#root');

上述代码中,h函数用于创建虚拟DOM节点,最终通过createApp方法将虚拟DOM渲染到页面上的#root元素中。

如果需要手动实现一个简单的虚拟DOM更新逻辑,可以参考以下代码:

// 创建虚拟DOM
function createVNode(tag, props, children) {return { tag, props, children };
}// 渲染虚拟DOM到真实DOM
function render(vnode, container) {const el = document.createElement(vnode.tag);if (vnode.props) {Object.keys(vnode.props).forEach(key => {el.setAttribute(key, vnode.props[key]);});}if (vnode.children) {vnode.children.forEach(child => {if (typeof child === 'string') {el.appendChild(document.createTextNode(child));} else {render(child, el);}});}container.appendChild(el);
}// 使用示例
const virtualDom = createVNode('div', { id: 'example' }, [createVNode('h1', {}, 'Hello World'),'这是一个段落',
]);
render(virtualDom, document.getElementById('root'));

在这里插入图片描述


http://www.hkcw.cn/article/GYDNgPayor.shtml

相关文章

电赛TIMSPM0G3507 CCS环境安装在D盘的方法

前言 安装TI的环境内存占用还是比较大的,但是大家默认安装到C盘,本篇就教大家从0到一安装到D盘 先把3个要下载的下载了 1.安装SDK 登录LP-MSPM0G3507 评估板 | TI.com.cn这个网站 选择Windows的下载 2.下载图形配置软件 登录SYSCONFIG IDE、配置、编译器…

电力高空作业安全检测(3)RT-DETR模型

背景与挑战 YOLO 系列模型长期以来在实时目标检测领域占据主导地位,因其在速度与精度之间取得了良好的平衡。然而,这些模型在处理多尺度特征时,往往依赖于非极大值抑制(NMS)后处理步骤,这不仅增加了计算…

项目架构初始化,底部导航页面切换

引言 在移动端应用开发中,底部导航栏是一种常见的用户界面元素,用于在不同的页面之间进行快速切换。本文将介绍如何初始化一个 Vue.js 项目,并实现底部导航栏页面切换的功能。 🤍 前端开发工程师、技术日更博主、已过CET6 &…

51c大模型~合集133

我自己的原文哦~ https://blog.51cto.com/whaosoft/13948969 #用Veo 3Suno做了个AI Rapper 吊打音乐节上的流量明星 太疯狂了!AI生成的嘻哈歌手唱Rap以假乱真,网友直呼「看不出破绽」。 来来来,眼尖的朋友请告诉我,下面这个…

俄称控制定居点 乌称打击俄纵深目标 双方战事持续升级

俄罗斯国防部5月31日发布战报称,俄军控制了苏梅州沃多拉哈和顿涅茨克地区诺沃波利居民点。在过去24小时内,俄军在苏梅、哈尔科夫、顿涅茨克、扎波罗热、赫尔松等方向打退乌军多次进攻并发动多次攻势。乌克兰武装部队总司令瑟尔斯基同一天表示,乌军在5月使用远程精确武器打击…

机器学习知识图谱——K-means++聚类算法

目录 一、图解K-means++ 聚类算法知识图谱 二、K-means 是什么? 三、K-means++ 是什么? 四、K-means++ 算法流程 第一步:选择初始质心(核心改进) 第二步:执行 K-means 正式流程 五、算法图示 六、优点 vs 缺点 七、常用场景 八、Python 代码示例 (使用 sklear…

Java SE 2.数据类型与变量

Java是一门强类型语言,数据类型和变量是构建程序的基石。理解数据类型的选择和变量的定义方式,直接影响代码的性能和可读性。就一句话:数据类型和变量很重要! 1. 字面常量 我们刚接触Java时,曾写过一个简单的程序&am…

数据结构-算法学习C++(入门)

目录 03二进制和位运算04 选择、冒泡、插入排序05 对数器06 二分搜索07 时间复杂度和空间复杂度08 算法和数据结构09 单双链表09.1单双链表及反转09.2合并链表09.2两数相加09.2分隔链表 013队列、栈、环形队列013.1队列013.2栈013.3循环队列 014栈-队列的相互转换014.1用栈实现…

【前端】SPA v.s. MPA

链接:页面结构 误区 页面结构管理有两种常见方式:路由形式 和 组件形式。路由形式 对应MPA ,组件形式对应SPA ❌ 误区 1:路由形式 MPA❌ 路由是 SPA 和 MPA 共有的概念,区别在于路由映射的对象: MPA 的…

国米0-5创欧冠决赛最大分差 巴黎青春风暴横扫夺冠

在安联球场举行的欧冠决赛中,巴黎圣日耳曼以5比0横扫国际米兰,创造了欧冠决赛历史上的最大分差纪录。此前欧冠决赛的最大分差为四球,最近一次是1993-1994赛季AC米兰对巴萨的4比0。恩里克带领下的巴黎圣日耳曼首次赢得欧冠冠军,他们的表现令人震惊。比赛开始后不久,巴黎便迅…

樊振东加盟德甲 俱乐部披露幕后 签约过程震撼乒坛

FC萨尔布吕肯俱乐部宣布,奥运冠军樊振东将加盟球队。当樊振东在社交媒体上发布观看欧冠的照片时,另一条消息也震惊了乒乓球圈:他将在新赛季代表萨尔布吕肯出战德国乒乓球甲级联赛(TTBL)。俱乐部官方公告中提到,前世界排名第一的樊振东将在新赛季为萨尔布吕肯效力。这位28…

Yunxi期中

Misc 谍影重重plus(misc) 随波逐流修复伪加密 零宽字符解密,???需要爆破 import itertools import stringdef generate_symmetric_passwords():# 扩展字符集:大小写字母 数字 符号chars st…

2024年ESWA SCI1区TOP,自适应学习灰狼算法ALGWO+无线传感器网络覆盖优化,深度解析+性能实测

目录 1.端午快乐2.摘要3.灰狼算法GWO原理4.改进策略5.结果展示6.参考文献7.代码获取8.读者交流 1.端午快乐 今天端午节,祝各位朋友端午安康,阖家平安! 2.摘要 无线传感器网络(WSNs)是一种被广泛应用的新兴技术&…

YOLOv8 移动端升级:借助 GhostNetv2 主干网络,实现高效特征提取

文章目录 引言GhostNetv2概述GhostNet回顾GhostNetv2创新 YOLOv8主干网络改进原YOLOv8主干分析GhostNetv2主干替换方案整体架构设计关键模块实现 完整主干网络实现YOLOv8集成与训练模型集成训练技巧 性能对比与分析计算复杂度对比优势分析 部署优化建议结论与展望 引言 目标检…

【Oracle】TCL语言

个人主页:Guiat 归属专栏:Oracle 文章目录 1. TCL概述1.1 什么是TCL?1.2 TCL的核心功能 2. 事务基础概念2.1 事务的ACID特性2.2 事务的生命周期 3. COMMIT语句详解3.1 COMMIT基础语法3.2 自动提交与手动提交3.3 提交性能优化 4. ROLLBACK语句…

设计模式——单例设计模式(创建型)

摘要 本文详细介绍了单例设计模式,包括其定义、结构、实现方法及适用场景。单例模式是一种创建型设计模式,确保一个类只有一个实例并提供全局访问点。其要点包括唯一性、私有构造函数、全局访问点和线程安全。文章还展示了单例设计模式的类图和时序图&a…

STM32F103C8T6,bxCAN收发配置实例,包含ID过滤

文章目录 引言bxCAN简介bxCAN主要特点代码示例引言 bxCAN简介 bxCAN是基本扩展CAN(Basic Extended CAN)的缩写,它支持CAN协议2.0A和2.0B。它的设计目标是,以最小的CPU负荷来高效处理大量收到的报文。它也支持报文发送的优先级要求(优先级特性可软件配置)。 对于安全紧要的应…

使用 HTML + JavaScript 实现可拖拽的任务看板系统

本文将介绍如何使用 HTML、CSS 和 JavaScript 创建一个交互式任务看板系统。该系统支持拖拽任务、添加新任务以及动态创建列,适用于任务管理和团队协作场景。 效果演示 页面结构 HTML 部分主要包含三个默认的任务列(待办、进行中、已完成)和…

进程间通信II·命名管道

目录 原理 创建过程 特性 代码练习 客户端与服务端交互 小知识 原理 原理:两个进程各自的struct file 指向相同的inode和文件缓冲区(这里的inode和文件缓冲区也应用了引用计数)。 命名管道创建的是磁盘上的一种不刷新数据到缓冲区的常规…

Redis--缓存工具封装

经过前面的学习,发现缓存中的问题,无论是缓存穿透,缓存雪崩,还是缓存击穿,这些问题的解决方案业务代码逻辑都很复杂,我们也不应该每次都来重写这些逻辑,我们可以将其封装成工具。而在封装的时候…