13.5 准备工作
上一节对keep-alive
组件的分析,是从我画的一个流程图开始的。如果不想回过头看上一节的内容,可以参考以下的简单总结。
keep-alive
是源码内部定义的组件选项配置,它会先注册为全局组件供开发者全局使用,其中render
函数定义了它的渲染过程- 和普通组件一致,当父在创建真实节点的过程中,遇到
keep-alive
的组件会进行组件的初始化和实例化。 - 实例化会执行挂载
$mount
的过程,这一步会执行keep-alive
选项中的render
函数。 render
函数在初始渲染时,会将渲染的子Vnode
进行缓存。同时对应的子真实节点也会被缓存起来。
那么,当再次需要渲染到已经被渲染过的组件时,keep-alive
的处理又有什么不同呢?
13.5.1 基础使用
为了文章的完整性,我依旧把基础的使用展示出来,其中加入了生命周期的使用,方便后续对keep-alive
生命周期的分析。
<div id="app">
<button @click="changeTabs('child1')">child1</button>
<button @click="changeTabs('child2')">child2</button>
<keep-alive>
<component :is="chooseTabs">
</component>
</keep-alive>
</div>
var child1 = {
template: '<div><button @click="add">add</button><p>{{num}}</p></div>',
data() {
return {
num: 1
}
},
methods: {
add() {
this.num++
}
},
mounted() {
console.log('child1 mounted')
},
activated() {
console.log('child1 activated')
},
deactivated() {
console.log('child1 deactivated')
},
destoryed() {
console.log('child1 destoryed')
}
}
var child2 = {
template: '<div>child2</div>',
mounted() {
console.log('child2 mounted')
},
activated() {
console.log('child2 activated')
},
deactivated() {
console.log('child2 deactivated')
},
destoryed() {
console.log('child2 destoryed')
}
}
var vm = new Vue({
el: '#app',
components: {
child1,
child2,
},
data() {
return {
chooseTabs: 'child1',
}
},
methods: {
changeTabs(tab) {
this.chooseTabs = tab;
}
}
})
13.5.2 流程图
和首次渲染的分析一致,再次渲染的过程我依旧画了一个简单的流程图。