探究Vue.js 2.0新增的虚拟DOM


Posted in Javascript onOctober 20, 2016

你可能早就已经听说了 Vue.js 2.0。一个主要的令人兴奋的新特性就是更新页面的"虚拟DOM"的加入。

虚拟 DOM 可以做什么?

React 和 Ember 都使用了虚拟DOM来提升页面的刷新速度。为了理解其如何工作,让我们先讨论一下几个概念:

更新DOM的花费时间非常长

当我们使用 JavaScript 来改变页面的时候,浏览器不得不做一些工作来找到需要的DOM节点,并且做出类似这样的改变:

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

在如今的应用程序的DOM中大概有成千上万的节点,因此更新所花费的时间就更长了。有很多不可避免的很小很频繁的更新拖慢了页面的速度。

我们可以使用 JavaScript 将DOM节点虚拟化表示

在一个HTML中,DOM节点通常表示如下:

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

DOM 节点也可以表示 JavaScript 中的对象,像这样:

// Pseudo-code of a DOM node represented as Javascript
Let domNode = {
tag: 'ul'
attributes: { id: 'myId' }
children: [
// where the LI's would go
]
};

这就是我们的“虚拟”DOM。

更新虚拟节点的开销不大

// This might be how we update the virtual DOM
domNode.children.push('<ul>Item 3</ul>');

如果我们使用虚拟DOM,而不是直接在代码中调用类似 .getElementById 的 DOM API 方法,操作就会像改变 JS 对象一样非常的简单省时。

接下来,就是同步的把我们做的改变更新到真实DOM 中去,我们使用了一个很有效率的函数:

// This function would call the DOM API and make changes
// to the "real" DOM. It would do it in batches and with
// more efficiency than it would with arbitrary updates.
sync(originalDomNode, domNode);

Vue.js 在版本2中加入了虚拟DOM,这挺好的…对吧?

就像在生活和 Web 开发中的每一件事,虚拟DOM有利也有弊。

大小 - 其中之一就是更多的功能意味着代码包中更多行的代码。幸运的是,Vue.js 2.0 依旧比较小(当前版本 21.4kb),并且也正在删除很多东西。

内存 -同样,虚拟DOM需要将现有的DOM拷贝后保存在内存中,这是一个在DOM更新速度和内存使用中的权衡。

并不适用所有情况 -如果虚拟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带来了全编程能力。你可以通过使用JavaScript的数组方法来创建工厂化函数来搭建你的虚拟节点等等,这些用模板语法处理起来可能会更复杂。

以上所述是小编给大家介绍的Vue.js 2.0新增的虚拟DOM的知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
如何实现浏览器上的右键菜单
Jul 10 Javascript
jquery之Document元素选择器篇
Aug 14 Javascript
浅谈关于JavaScript的语言特性分析
Apr 11 Javascript
基于jquery的禁用右键、文本选择功能、复制按键的实现代码
Aug 27 Javascript
js replace替换所有匹配的字符串
Feb 13 Javascript
深入理解Javascript里的依赖注入
Mar 19 Javascript
使用OpenLayers3 添加地图鼠标右键菜单
Dec 29 Javascript
js实现三级联动效果(简单易懂)
Mar 27 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
May 17 Javascript
Vue导出页面为PDF格式的实现思路
Jul 31 Javascript
Vue中使用vux配置代码详解
Sep 16 Javascript
帮你提高开发效率的JavaScript20个技巧
Jun 18 Javascript
Javascript 创建类并动态添加属性及方法的简单实现
Oct 20 #Javascript
javascript匀速动画和缓冲动画详解
Oct 20 #Javascript
js设置和获取自定义属性的方法
Oct 20 #Javascript
js阻止冒泡和默认事件(默认行为)详解
Oct 20 #Javascript
浅谈JS中String()与 .toString()的区别
Oct 20 #Javascript
详解javascript事件绑定使用方法
Oct 20 #Javascript
angular源码学习第一篇 setupModuleLoader方法
Oct 20 #Javascript
You might like
15种PHP Encoder的比较
2007/04/17 PHP
php教程 插件机制在PHP中实现方案
2012/11/02 PHP
深入PHP数据缓存的使用说明
2013/05/10 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
PHP yield关键字功能与用法分析
2019/01/03 PHP
JS 自动完成 AutoComplete(Ajax 查询)
2009/07/07 Javascript
基于jquery的下拉框改变动态添加和删除表格实现代码
2020/09/12 Javascript
Javascript中 关于prototype属性实现继承的原理图
2013/04/16 Javascript
Jquery对select的增、删、改、查操作
2015/02/06 Javascript
JavaScript面向对象的实现方法小结
2015/04/14 Javascript
Javascript实现字数统计
2015/07/03 Javascript
js实现网页定位导航功能
2017/03/07 Javascript
Angular2环境搭建具体操作步骤(推荐)
2017/08/04 Javascript
浅谈React的最大亮点之虚拟DOM
2018/05/29 Javascript
VeeValidate 的使用场景以及配置详解
2019/01/11 Javascript
JavaScript中的this原理及6种常见使用场景详解
2020/02/14 Javascript
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
python简单实现获取当前时间
2016/08/27 Python
完美解决python遍历删除字典里值为空的元素报错问题
2016/09/11 Python
SVM基本概念及Python实现代码
2017/12/27 Python
Python3实现腾讯云OCR识别
2018/11/27 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
python爬虫模块URL管理器模块用法解析
2020/02/03 Python
Django通过json格式收集主机信息
2020/05/29 Python
python+requests实现接口测试的完整步骤
2020/10/27 Python
HTML5时代CSS设置漂亮字体取代图片
2014/09/04 HTML / CSS
Columbia美国官网:美国著名的户外服装品牌
2016/11/24 全球购物
行政助理岗位职责
2013/11/10 职场文书
演讲稿怎么写才完美
2014/01/02 职场文书
十一国庆节“向国旗敬礼”主题班会活动方案
2014/09/27 职场文书
2014年无财产无子女离婚协议书范本
2014/10/09 职场文书
莫言获奖感言(全文)
2015/07/31 职场文书
Java实现房屋出租系统详解
2021/10/05 Java/Android
详解在OpenCV中如何使用图像像素
2022/03/03 Python