news 2026/6/23 2:41:20

Vue2-虚拟DOM树和虚拟节点

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue2-虚拟DOM树和虚拟节点

虚拟DOM树和虚拟节点

虚拟 DOM 树与虚拟节点(VNode):核心概念与解析

虚拟 DOM(Virtual DOM)是前端框架(如 Vue、React)的核心机制,本质是用 JavaScript 对象模拟真实 DOM 结构,通过对比虚拟 DOM 的差异(Diff 算法)来最小化真实 DOM 操作,提升页面更新性能。其中,虚拟节点(VNode) 是构成虚拟 DOM 树的基本单元,虚拟 DOM 树则是由多个 VNode 嵌套组成的树形结构。


一、虚拟节点(VNode):DOM 节点的 “JS 替身”

1. 定义

虚拟节点是一个普通 JavaScript 对象,包含描述真实 DOM 节点的所有关键信息(标签名、属性、子节点、内容等),是对真实 DOM 的抽象描述。

2. 核心结构(以 Vue 为例)

一个典型的 VNode 结构如下(简化版):

const vnode = { // 核心属性 tag: 'div', // 标签名(如div、span,组件则为组件对象) props: { // 节点属性(如class、style、onClick) class: 'container', style: { color: 'red' } }, children: [ // 子虚拟节点(数组,嵌套VNode) { tag: 'p', children: ['Hello Virtual DOM'] } ], text: null, // 文本节点内容(与children互斥) el: null, // 对应的真实DOM节点(渲染后赋值) key: 'unique-key', // 用于Diff算法的唯一标识 shapeFlag: 1, // Vue优化标识(标记节点类型:元素/文本/组件等) };

3. VNode 的类型

类型

说明

示例

元素 VNode

对应普通 DOM 元素(div/span 等)

{ tag: 'div', ... }

文本 VNode

对应纯文本节点

{ text: 'Hello', tag: null }

组件 VNode

对应组件实例

{ tag: MyComponent, ... }

注释 VNode

对应注释节点

{ comment: true, text: '注释' }

空 VNode

空节点(用于占位 / 删除)

createEmptyVNode()

二、虚拟 DOM 树:VNode 的嵌套组合

1. 定义

虚拟 DOM 树是以根 VNode 为起点,所有子 VNode 嵌套组成的树形结构,完全映射真实 DOM 的层级关系。

2. 示例:真实 DOM vs 虚拟 DOM 树

真实 DOM 结构
<div class="app"> <h1>虚拟DOM示例</h1> <ul> <li>节点1</li> <li>节点2</li> </ul> </div>
对应的虚拟 DOM 树(简化版)
const vdomTree = { tag: 'div', props: { class: 'app' }, children: [ { tag: 'h1', children: [{ text: '虚拟DOM示例' }] }, { tag: 'ul', children: [ { tag: 'li', children: [{ text: '节点1' }] }, { tag: 'li', children: [{ text: '节点2' }] } ] } ] };

3. 虚拟 DOM 树的核心特性

轻量:仅保留 DOM 的关键信息,比真实 DOM(包含大量浏览器内置属性)更简洁;

易操作:JS 层面修改虚拟 DOM 树无 DOM 重排 / 重绘,性能开销极低;

跨平台:可将虚拟 DOM 树渲染到不同平台(如浏览器 DOM、小程序、Canvas)。


三、虚拟 DOM 树的核心工作流程

框架中虚拟 DOM 的完整生命周期:

生成:首次渲染时,将模板 / JSX 转换为虚拟 DOM 树;

渲染:将虚拟 DOM 树转换为真实 DOM,挂载到页面;

更新:数据变化时,生成新的虚拟 DOM 树;

对比(Diff):对比新旧虚拟 DOM 树的差异(只对比同层级节点,降低复杂度);

打补丁(Patch):只将差异部分更新到真实 DOM,而非重绘整个页面。


四、关键优势与注意事项

优势

性能优化:减少真实 DOM 操作(DOM 操作是前端性能瓶颈);

跨平台:虚拟 DOM 与平台无关,可适配浏览器、移动端、SSR 等;

抽象化:开发者无需直接操作 DOM,专注业务逻辑。

注意事项

虚拟 DOM 本身有开销(JS 对象创建、Diff 对比),简单场景下(如静态页面)可能不如直接操作 DOM;

Diff 算法的效率决定虚拟 DOM 的性能(如 Vue/React 的 Diff 都做了分层、key 优化)。

总结

简单来说,无论是虚拟DOM树或者虚拟节点,都是前端框架为了模拟真实DOM框架的手段。核心目的都是为了利用JS对象来代替真实的DOM操作

虚拟节点(VNode):包含了一个DOM节点的一切关键信息,并通过一种特定的结构罗列出来

虚拟树:多个VNode通过嵌套叠加起来的集合

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 3:29:35

从开发到部署:Open-AutoGLM应用适配全流程拆解(仅限资深工程师查看)

第一章&#xff1a;Open-AutoGLM 应用适配概述在构建基于大语言模型的自动化系统时&#xff0c;Open-AutoGLM 作为新一代开源智能代理框架&#xff0c;提供了灵活的任务调度、上下文感知与多工具集成能力。为确保其在不同部署环境中的兼容性与高效性&#xff0c;应用适配过程需…

作者头像 李华
网站建设 2026/6/23 1:32:30

Linly-Talker支持LoRa远距离低功耗通信

Linly-Talker 支持 LoRa 远距离低功耗通信 在智慧农业的田间地头&#xff0c;一台搭载数字人系统的导览终端静静伫立。没有网线&#xff0c;也未连接蜂窝网络&#xff0c;它依靠电池供电&#xff0c;在阳光下持续运行数月。当管理员通过手持设备发出“请讲解今日病虫害防治要点…

作者头像 李华
网站建设 2026/6/23 23:19:05

Linly-Talker支持语音克隆,打造个性化虚拟主播不是梦

Linly-Talker&#xff1a;用语音克隆打造你的专属虚拟主播 在直播带货、AI客服、在线教育日益普及的今天&#xff0c;一个共通的痛点浮现出来&#xff1a;内容生产效率跟不上需求增长。真人出镜成本高、时间受限&#xff1b;传统数字人又千篇一律&#xff0c;缺乏个性和温度。有…

作者头像 李华
网站建设 2026/6/23 21:12:13

为什么你的Open-AutoGLM集成总失败?6大常见坑点全面解析

第一章&#xff1a;Open-AutoGLM 新应用适配开发流程在构建基于 Open-AutoGLM 的新应用时&#xff0c;开发者需遵循一套标准化的适配流程&#xff0c;以确保模型能力与业务场景高效融合。该流程强调模块化设计、接口一致性以及自动化测试机制&#xff0c;从而提升开发效率并降低…

作者头像 李华
网站建设 2026/6/23 21:31:50

Linly-Talker支持多人协作编辑,团队共创数字人内容

Linly-Talker&#xff1a;用AI打破数字人创作的孤岛&#xff0c;开启团队协作新范式 在一场线上发布会的筹备会议上&#xff0c;市场团队正为宣传视频发愁——主讲人出差无法录音&#xff0c;动画师手头积压三个项目&#xff0c;脚本反复修改却始终达不到“自然感”。这种内容生…

作者头像 李华
网站建设 2026/6/23 9:28:11

P6365 [传智杯 #2 初赛] 众数出现的次数(C++)

原题链接&#xff1a;P6365 [传智杯 #2 初赛] 众数出现的次数 - 洛谷 题目描述 传智专修学员的课堂上&#xff0c;为了活跃气氛&#xff0c;并巩固位运算的知识&#xff0c;同学们玩起了一个游戏。 班级里有 n(n≤106) 名同学&#xff0c;每位同学都获得了两张卡&#xff0c…

作者头像 李华