引言

你可能听说在Vue.js 2.0已经发布,并且在其中新添加如了一些新功能。其中一个功能就是“Virtual DOM”。

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编程,您可以创建工厂式的功能来建立虚拟节点。

相关参考:

https://medium.com/js-dojo/whats-new-in-vue-js-2-0-virtual-dom-dc4b5b827f40#.wb6hc5yz9

最新文章

  1. 情报收集:Metasploit命令、查询网站和测试网站
  2. PHP使用empty检查函数返回结果时报Fatal error: Can&#39;t use function return value in write context的问题
  3. swift-06-字符串,字符以及元组类型
  4. VC 项目支撑文件解释
  5. luoguP2267 琪琪的项链
  6. ARM9嵌入式学习笔记(1)-Linux命令
  7. 蜗牛爱课 -- iOS 设置UIButton的字体的大小、显示位置、大小
  8. Android应用性能测试之CPU和内存占用
  9. MyEclipse修改项目名称后,部署到tomcat问题。
  10. 201521123109《java程序设计》第九周学习总结
  11. 二分查找算法的C++和PHP实现
  12. win10 anaconda+tensorflow+keras
  13. git 撤回放到暂存区的文件
  14. Callable和Future、FutureTask的使用
  15. Data - References
  16. C#关闭子窗口而不释放子窗口对象的问题解决
  17. java设计模式-Iterator
  18. Windows上安装tensorflow 详细教程
  19. (转)Centos7 修改硬件时间和系统时间
  20. 上传项目到git

热门文章

  1. GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级
  2. 多线程的通信和同步(Java并发编程的艺术--笔记)
  3. ASP.NET MVC5+EF6+EasyUI 后台管理系统(64)-补充WebApi与Unity注入-配置文件
  4. WebGIS中等值线前端生成绘制简析
  5. 编写自己的PHP MVC框架笔记
  6. 计算Div标签内Checkbox个数或已被disabled的个数
  7. Unicode 和 UTF-8 有何区别?
  8. iOS之开发中一些相关的路径以及获取路径的方法
  9. Java实现多线程断点下载(下载过程中可以暂停)
  10. 最小生成树(Kruskal算法-边集数组)