本文摘自PHP中文网,作者不言,侵删。
本篇文章给大家带来的内容是关于vue keep-alive组件的使用以及原理介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
keep-alive
keep-alive是vue.js的内置组件,它能够把不活动的组件的实例保存在内存中,而不是直接的销毁,它是一个抽象组件,不会被渲染到真实DOM中,也不会出现在父组件链中。
它提供了exclude和include两个属性,允许组件有条件的缓存。
使用
1 2 3 | <keep-alive>
<comment></comment>
</keep-alive>
|
上面的comment组件会被缓存起来。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <keep-alive>
<coma v- if = "test" ></coma>
<comb v- else ></comb>
</keep-alive>
<button @click= "abc" ></button>
export default {
data(){
reurn{
test:true
}
},
methods:{
abc(){
this.test=!this.test;
}
}
}
|
点击button的时候coma组件和comb组件会发生切换,但这时候两个组件的状态会被缓存起来,假如说a和b组件中都有一个input标签,这时切换input标签的值不会改变。
props
keep-alive组件提供了include和exclude两个属性来进行有条件的缓存,二者都可以用逗号分隔字符串、正则表达式或则数组表示。
1 2 3 4 5 6 7 8 9 | <keep-alive include = "a" >
<component></component>
</keep-alive>
<keep-alive exclude= "a" >
<component></component>
</keep-alive>
|
生命钩子
keep-alive提供了两个生命钩子,actived与deactived。
因为keep-alive会把组件保存到内存中,并不会销毁或则重新构建,所以不会调用组件的creted等方法,需要使用actived和deactived两个钩子判断组件是否处于活动状态。
深入keep-alive组件的实现
created和destroyed钩子
created钩子会创建一个cache对象,用来作为缓存容器,保存Vnode节点。
1 2 3 | created{
this.cache=Object.create(null);
}
|
destroyed钩子则在组件销毁的时候清除cache缓存中的所有组件实例。
1 2 3 4 5 6 | destroyed () {
for ( const key in this.cache) {
pruneCacheEntry(this.cache[key])
}
},
|
接下来是render函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | render () {
const vnode: VNode = getFirstComponentChild(this. $slots . default )
const componentOptions: ?VNodeComponentOptions = vnode && vnode.componentOptions
if (componentOptions) {
const name: ?string = getComponentName(componentOptions)
if (name && (
(this. include && !matches(this. include , name)) ||
(this.exclude && matches(this.exclude, name))
)) {
return vnode
}
const key: ?string = vnode.key == null
? componentOptions.Ctor.cid + (componentOptions.tag ? `::${componentOptions.tag}` : '' )
: vnode.key
if (this.cache[key]) {
vnode.componentInstance = this.cache[key].componentInstance
} else {
this.cache[key] = vnode
}
vnode.data.keepAlive = true
}
return vnode
}
|
首先通过getFirstComponentChild获取第一个子组件,获取该组件的name(存在组件名则直接使用组件名,否则会使用tag)。接下来会将这个name通过include与exclude属性进行匹配,匹配不成功(说明不需要进行缓存)则不进行任何操作直接返回vnode。
阅读剩余部分
相关阅读 >>
node批量下载文件到本地的方法介绍(附代码)
javascript是什么类型的语言
javascript未知错误怎么查
ajax和javascript的区别是什么
javascript中判断变量是否为数字的3种方法(附代码)
array中 foreach() 和 map() 的区别
web程序员必备 console 对象里的九个方法
javascript怎么获取请求参数
javascript向php传递中文乱码怎么办
详解javascript中动态合并两个对象的属性
更多相关阅读请进入《javascript》频道 >>
人民邮电出版社
本书对 Vue.js 3 技术细节的分析非常可靠,对于需要深入理解 Vue.js 3 的用户会有很大的帮助。——尤雨溪,Vue.js作者
转载请注明出处:木庄网络博客 » vue keep-alive组件的使用以及原理介绍