- createApp() & mount()
- setup()
- render() h()
- Virtual Dom
- 生命周期hooks
- Proxy代理
- reactive() ref()
- computed()
- watch()
- provide() inject()
- directives()
- components()
什么是Virtual Dom?
英文全称Virtual Document Object Model
,直译:虚拟的文档对象模型。
简而言之,就是使用js 对象去描述一个dom节点,有很多相关的文章描述,这里不再赘述。
我们可以像这样理解一个Virtual Dom
。
<div id="app">my vdom</div>
const vdom = {
tag:'div',
text:'my vdom',
attributes:{
id:'app'
},
children:[]
}
而在vue中,有一种自己独特的Virtual Dom
——VNode
,在Virtual Dom
的思想基础上,添加了一些vue运行编译所需要的属性,一个初始VNode模板在源码中是这样定义的:
// packages/runtime-core/src/vnode.ts
const vnode: VNode = {
__v_isVNode: true, // 区分VNode与普通js object的标志
[ReactiveFlags.SKIP]: true,
type,
props,
key: props && normalizeKey(props),
ref: props && normalizeRef(props),
scopeId: currentScopeId,
children: null,
component: null,
suspense: null,
ssContent: null,
ssFallback: null,
dirs: null,
transition: null,
el: null,
anchor: null,
target: null,
targetAnchor: null,
staticCount: 0,
shapeFlag,
patchFlag,
dynamicProps,
dynamicChildren: null,
appContext: null
}
为什么要使用Virtual Dom?
一个面试的常见问题:请谈谈你对虚拟dom的理解
初级回答:
操作虚拟dom比操作真实dom元素性能好。
进阶版:
将dom元素抽象为js对象,结合dom diff算法在更新视图时起到性能优化的效果。
高级版:
1.将页面元素抽象为对象,不再局限于浏览器的Dom
,奠定了跨平台渲染的基础,打开了函数式UI编程的大门。
2.浏览器不会对Dom
操作进行缓存 => 批量处理
。意味着你操作了Dom
多少次,浏览器就会渲染多少次。而引入了Virtual Dom
的概念后,我们可以将多次Dom
更新都先体现在Virtual Dom
上,再统一映射到真实Dom
节点,避免掉了一部分重复渲染工作。
*注:由于兼容性原因,MutationObserver
的方式已被废弃
3.不仅如此,在将VNode
转化为Dom
元素时还采用了优化后的diff
算法:不再递归遍历整颗树,而是采用深度优先的方式逐层比较同级的树节点;还可以为Dom
元素设置key
值,加强节点的可复用性。
由此可见,Virtula Dom
的理想使用场景是:
Dom
结构繁杂- 需要频繁的操作
Dom
- 多端渲染
反过来,这些情况下则不适用Virtual Dom
:
Dom
结构简单- 几乎不需要对
Dom
进行修改
在页面的首次渲染中,相较于Dom.innerHTML
,Virtual Dom
多了一步转化VNode
的过程,速度有可能会慢于Dom.innerHTML
;而在后续的Dom
更新过程中,每次都要执行diff
计算,而且内存中要始终维护一份树结构的备份。
所以要仔细斟酌,使用Virtual Dom
所带来的提升是否能cover住所牺牲的部分。
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!