探究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 相关文章推荐
node.js中的path.normalize方法使用说明
Dec 08 Javascript
javascript为按钮注册回车事件(设置默认按钮)的方法
May 09 Javascript
JS实现网页上随机产生超链接地址的方法
Nov 09 Javascript
JavaScript DOM 学习总结(五)
Nov 24 Javascript
使用postMesssage()实现iframe跨域页面间的信息传递
Mar 29 Javascript
详解react-webpack2-热模块替换[HMR]
Aug 03 Javascript
angular2系列之路由转场动画的示例代码
Nov 09 Javascript
基于JavaScript实现每日签到打卡轨迹功能
Nov 29 Javascript
利用Webpack实现小程序多项目管理的方法
Feb 25 Javascript
vue实现文字加密功能
Sep 27 Javascript
解决Idea、WebStorm下使用Vue cli脚手架项目无法使用Webpack别名的问题
Oct 11 Javascript
javascript使用Blob对象实现的下载文件操作示例
Apr 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
PHP 批量删除 sql语句
2009/06/05 PHP
php5.3 废弃函数小结
2010/05/16 PHP
php实现专业获取网站SEO信息类实例
2015/04/02 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
2016/02/14 PHP
jquery下组织javascript代码(js函数化)
2010/08/25 Javascript
QUnit jQuery的TDD框架
2010/11/04 Javascript
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
2010/11/21 Javascript
js 实现 input type=&quot;file&quot; 文件上传示例代码
2013/08/07 Javascript
Bootstrap入门书籍之(零)Bootstrap简介
2016/02/17 Javascript
jQuery悬停文字提示框插件jquery.tooltipster.js用法示例【附demo源码下载】
2016/07/19 Javascript
Bootstrap基本插件学习笔记之标签切换(17)
2016/12/08 Javascript
AngularJS 文件上传控件 ng-file-upload详解
2017/01/13 Javascript
微信小程序 视图容器组件的详解及实例代码
2017/01/19 Javascript
jQuery多选框选择数量限制方法
2017/02/08 Javascript
Angular使用 ng-img-max 调整浏览器中的图片的示例代码
2017/08/17 Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
2018/05/18 Javascript
基于Vue组件化的日期联动选择器功能的实现代码
2018/11/30 Javascript
Vue设置长时间未操作登录自动到期返回登录页
2020/01/22 Javascript
Node.js API详解之 Error模块用法实例分析
2020/05/14 Javascript
[54:15]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第二场2月1日
2021/03/11 DOTA
python selenium 获取标签的属性值、内容、状态方法
2018/06/22 Python
用python3 返回鼠标位置的实现方法(带界面)
2019/07/05 Python
pytorch 共享参数的示例
2019/08/17 Python
python使用pandas抽样训练数据中某个类别实例
2020/02/28 Python
Python实现读取并写入Excel文件过程解析
2020/05/27 Python
使用pytorch实现论文中的unet网络
2020/06/24 Python
HTML 5 input placeholder 属性如何完美兼任ie
2014/05/12 HTML / CSS
Crocs波兰官方商店:女鞋、男鞋、童鞋、洞洞鞋
2019/10/08 全球购物
C/C++程序员常见面试题一
2012/12/08 面试题
公务员政审个人鉴定
2014/02/25 职场文书
优秀员工获奖感言
2014/03/01 职场文书
市场营销专业求职信
2014/06/17 职场文书
党的群众路线教育实践活动先进个人材料
2014/12/24 职场文书
小学生教师节广播稿
2015/08/19 职场文书
Python爬取英雄联盟MSI直播间弹幕并生成词云图
2021/06/01 Python
Redis全局ID生成器的实现
2022/06/05 Redis