探究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 相关文章推荐
基于JQuery实现鼠标点击文本框显示隐藏提示文本
Feb 23 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
Jun 24 Javascript
一个JavaScript递归实现反转数组字符串的实例
Oct 14 Javascript
js支持键盘控制的左右切换立体式图片轮播效果代码分享
Aug 26 Javascript
JavaScript里 ==与===区别详解
Aug 16 Javascript
Node.js创建HTTP文件服务器的使用示例
May 11 Javascript
详解koa2学习中使用 async 、await、promise解决异步的问题
Nov 13 Javascript
JS实现图片拖拽交换效果
Nov 30 Javascript
JS/jQuery实现获取时间的方法及常用类完整示例
Mar 07 jQuery
微信小程序全局变量GLOBALDATA的定义和调用过程解析
Sep 23 Javascript
vue 使用外部JS与调用原生API操作示例
Dec 02 Javascript
通过微信公众平台获取公众号文章的方法示例
Dec 25 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中ob_get_length缓冲与获取缓冲长度实例
2014/11/20 PHP
php实现微信公众平台账号自定义菜单类
2014/12/02 PHP
PHP读取大文件的多种方法介绍
2016/04/04 PHP
Laravel创建数据库表结构的例子
2019/10/09 PHP
PHP调用QQ互联接口实现QQ登录网站功能示例
2019/10/24 PHP
php经典趣味算法实例代码
2020/01/21 PHP
WordPress免插件实现面包屑导航的示例代码
2020/08/20 PHP
这段js代码得节约你多少时间
2011/12/20 Javascript
使用Math.floor与Math.random取随机整数的方法详解
2013/05/07 Javascript
jQuery ReferenceError: $ is not defined 错误的处理办法
2013/05/10 Javascript
仿百度输入框智能提示的js代码
2013/08/22 Javascript
在Node.js应用中使用Redis的方法简介
2015/06/24 Javascript
解析JavaScript的ES6版本中的解构赋值
2015/07/28 Javascript
jQuery入门之层次选择器实例简析
2015/12/11 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
jQGrid Table操作列中点击【操作】按钮弹出按钮层的实现代码
2016/12/05 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
2017/05/12 Javascript
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
原生JavaScript实现进度条
2021/02/19 Javascript
python中函数默认值使用注意点详解
2016/06/01 Python
浅谈Tensorflow由于版本问题出现的几种错误及解决方法
2018/06/13 Python
Python 复平面绘图实例
2019/11/21 Python
Python3实现建造者模式的示例代码
2020/06/28 Python
前端实现背景虚化但内容清晰且自适应 的实例代码
2019/08/01 HTML / CSS
加拿大鞋子连锁店:Town Shoes
2016/09/26 全球购物
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
大三预备党员入党思想汇报
2014/01/08 职场文书
拾金不昧表扬信范文
2014/01/11 职场文书
创先争优活动心得体会
2014/09/04 职场文书
乡党政领导班子群众路线教育实践活动个人对照检查材料
2014/09/20 职场文书
给老婆的道歉信
2015/01/20 职场文书
2016拓展训练心得体会范文
2016/01/12 职场文书
工作转正自我鉴定范文
2019/06/21 职场文书
90条交通安全宣传标语
2019/10/12 职场文书
Golang中interface{}转为数组的操作
2021/04/30 Golang
如何优化vue打包文件过大
2022/04/13 Vue.js