Vue.js 2.0窥探之Virtual DOM到底是什么?

发布时间 - 2026-01-10 22:58:50    点击率:

Virtual DOM是什么?

在之前,React和Ember早就开始用虚拟DOM技术来提高页面更新的速度了。 若想了解它是如何工作的,就要先认清这几个概念:

1.更新DOM是非常昂贵的操作

当我们使用Javascript来修改我们的页面,浏览器已经做了一些工作,以找到DOM节点进行更改,例如:

document.getElementById('myId').appendChild(myNewNode);

在现代的应用中,会有成千上万数量个DOM节点。所以因更新的时候产生的计算非常昂贵。琐碎且频繁的更新会使页面缓慢,同时这也是不可避免的。

2.我们可以用JavaScript对象来代替DOM节点

DOM节点在HTML文档中的表现通常是这样的:

<ul id='myId'>
 <li>Item 1</li>
 <li>Item 2</li>
<ul>

DOM节点也可以表示为一个JavaScript对象,就像这样:

//用Javascript代码表示DOM节点的伪代码
Let domNode = {
 tag: 'ul'
 attributes: { id: 'myId' }
 children: [
//这里是 li
 ]
};

这就是虚拟的DOM节点,很好理解吧。

3.更新虚拟节点, 并不昂贵贵

//更新虚拟DOM的代码
domNode.children.push('<ul>Item 3</ul>');

如果我们用一个虚拟DOM,而不是直接调用像.getElementById的方法,这样只操作JavaScript对象,这样是相当便宜的。

然后,再把更改的部分更新到真正的DOM,方法如下:

//这个方法是调用DOM API来更改真正DOM的
//它会分批执行从而获取更高的效率
sync(originalDomNode, domNode);

Vue.js在2.0 版本中引入虚拟DOM是一个正确的选择吗 ?

引入虚拟DOM实际上有优点也缺点。

1、尺寸

更多的功能意味着更多的代码。幸运的是Vue.js 2.0仍然是相当小的(21.4kb当前版本)。

2、内存

虚拟DOM需要在内存中的维护一份DOM的副本。在DOM更新速度和使用内存空间之间取得平衡。

3、不是适合所有情况

如果虚拟DOM大量更改,这是合适的。但是单一的,频繁的更新的话,虚拟DOM将会花费更多的时间处理计算的工作。
所以,如果你有一个DOM节点相对较少页面,用虚拟DOM,它实际上有可能会更慢。
但对于大多数单页面应用,这应该都会更快。

除了性能提升外还有什么

引入虚拟DOM,这不仅仅是一种性能增强,这同时意味着更多的功能。

例如,您可以在虚拟DOM中的 render() 方法直接创建新的节点:

new Vue({
 el: '#app',
 data: {
 message: 'hello world'
 },
 render() {
 var node = this.$createElement;
 return node(
 'div', 
 { attrs: { id: 'myId' } }, 
 this.message
 );
 }
});

输出:

<div id='app'>
 <div id='myId'>hello world</div>
</div>

为什么这样做?你可以用全编程语言JavaScript编程,您可以创建工厂式的功能来建立虚拟节点。

总结

以上就是在这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。


# vue  # virtual  # dom  # vue获取dom  # 在vue中获取dom元素内容的方法  # Vue实现virtual-dom的原理简析  # vue的Virtual Dom实现snabbdom解密  # vue动态生成dom并且自动绑定事件  # 利用vue.js插入dom节点的方法  # Vue获取DOM元素样式和样式更改示例  # vue指令以及dom操作详解  # 详解在Vue中通过自定义指令获取dom元素  # 探究Vue.js 2.0新增的虚拟DOM  # Vue AST源码解析第一篇  # 可以用  # 上有  # 您可以  # 的是  # 是一个  # 这是  # 如果你  # 很好  # 会有  # 就像  # 将会  # 是这样  # 这就是  # 它是  # 更高  # 这样做  # 仅仅是  # 更快  # 不可避免  # 会使 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何创建自定义Artisan命令?(代码示例)  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  php结合redis实现高并发下的抢购、秒杀功能的实例  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  ,怎么在广州志愿者网站注册?  Python高阶函数应用_函数作为参数说明【指导】  Laravel如何实现API版本控制_Laravel版本化API设计方案  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  Python正则表达式进阶教程_复杂匹配与分组替换解析  零基础网站服务器架设实战:轻量应用与域名解析配置指南  高端网站建设与定制开发一站式解决方案 中企动力  如何用免费手机建站系统零基础打造专业网站?  如何在不使用负向后查找的情况下匹配特定条件前的换行符  如何在 Pandas 中基于一列条件计算另一列的分组均值  长沙企业网站制作哪家好,长沙水业集团官方网站?  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  香港服务器部署网站为何提示未备案?  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  IOS倒计时设置UIButton标题title的抖动问题  太平洋网站制作公司,网络用语太平洋是什么意思?  🚀拖拽式CMS建站能否实现高效与个性化并存?  Android自定义控件实现温度旋转按钮效果  C++用Dijkstra(迪杰斯特拉)算法求最短路径  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  微信小程序 input输入框控件详解及实例(多种示例)  高防服务器租用指南:配置选择与快速部署攻略  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  免费网站制作appp,免费制作app哪个平台好?  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  5种Android数据存储方式汇总  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  制作电商网页,电商供应链怎么做?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  EditPlus中的正则表达式实战(6)  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  如何解决hover在ie6中的兼容性问题  如何在云主机上快速搭建多站点网站?  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  使用spring连接及操作mongodb3.0实例  javascript基本数据类型及类型检测常用方法小结  Laravel如何为API编写文档_Laravel API文档生成与维护方法  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  如何在IIS中新建站点并配置端口与IP地址?  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  js实现获取鼠标当前的位置  济南网站建设制作公司,室内设计网站一般都有哪些功能?