Vue.js实例方法
虚拟DOM简介
虚拟DOM是什么?
Vue通过简历一个虚拟DOM树对真实DOM发生的变化保持追踪
真实DOM树:解析CSS样式和DOM树,将其合成一颗渲染树,再通过布局算法计算每个节点在浏览器中的位置,最终输出到显示器上
虚拟DOM:保存了一颗DOM树被渲染签所包含的所有信息,这些信息可以通过对象的形式一直保存在内存中,并通过JS的操作进行维护
虚拟DOM处理变化的DOM节点的过程:
- 通过树的形式保存旧的DOM节点信息,这些信息可能在页面第一次加载时被渲染到浏览器中,但仍通过虚拟DOM创建
- 检测到数据更新,需要更新DOM,现在JS中将需要修改的节点全部修改完
- 将最终生成的虚拟DOM更新到视图中去
这样只需要进行一次DOM交互,避免了多次DOM交互
另外,为了避免不必要的DOM操作,在虚拟DOM映射到视图的过程中,会将虚拟节点与上一次渲染所用的旧节点进行对比,找出需要更新的节点来进行DOM操作,避免操作无需改动的DOM
简言之,虚拟DOM做两件事:1.提供与真实DOM节点相对应的虚拟节点VNode。将虚拟节点VNode与旧虚拟节点oldVnode做对比,如果有不同,更改不同就可以
为什么要使用虚拟DOM?
浏览器显示网页的过程
1.解析标签,生成元素树(DOM树)
2.解析样式,生成样式树
3.生成元素与样式的关系
4.生成元素的显示坐标
5.显示页面
若修改真实的元素,就需要重复一次次地进行上述过程
如果使用虚拟DOM,虚拟DOM存储在内存中,对每个元素的修改是在虚拟DOM中进行,修改完之后有差异只需更新一次即可
虚拟DOM的优点如下:
- 保证性能下限:虽然框架的虚拟DOM需要适配上层API导致性能并非最优;但是比起粗暴的DOM操作性能要好很多
- 无需手动操作DOM:只需要编写好View-Model的代码逻辑,框架会根据虚拟DOM和数据双向绑定,以可预期的方式更新视图,极大提高开发效率
- 跨平台,虚拟DOM本质上是JS对象,而DOM与平台强相关,虚拟DOM可以更方便地跨平台操作:服务端渲染、weex开发等
虚拟DOM的diff算法
两个核心函数
patch(container,vnode):初次渲染的时候,将虚拟DOM渲染成真正的DOM,然后插入到容器里
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23function createElement(vnode){
var tag = vnode.tag;
var attrs = vnode.attrs||{}
var children = vnode.children||[]
if(!tag){
return null
}
//创建真实的DOM元素
var vm = document.createElement(tag);
//属性
var attrName
for(attrName in attrs){
if(attrs.hasOwnProperty(attrName)){
vm.setAttribute(attrName,attrs[attrName])
}
}
children.forEach(function(childVnode){
//给vm添加子元素,如果还有子节点,则递归地生成子节点
vm.appendChild(createElement(childVnode))
})
//返回真实的DOM元素
return vm
}
未完待续…
Vue.js实例方法
https://blog-theta-ten.vercel.app/2021/09/07/Vue-js实例方法/