认识
一、认识
<keepAlivbe></KeepAlive>
缓存包裹在其中的动态切换组件, 主要用于保留组件状态或避免重新渲染。<keep-alive>
包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 <transition>
相似,<keep-alive>
是一个抽象组件; 它自身不会渲染一个 DOM
元素,也不会出现在组件的父组件链中。
-
任何时候都只能有一个活跃组件实例作为
<KeepAlive>
的直接子节点。 -
当一个组件在
<KeepAlive>
中被切换时,它的activated
和deactivated
生命周期钩子将被调用,用来替代mounted
和unmounted
。这适用于<KeepAlive>
的直接子节点及其所有子孙节点。
<KeepAlive>
组件是一个抽象组件,它的实现通过自定义 render
函数并且利用了插槽,并且知道了 <KeepAlive>
缓存 vnode
,了解组件包裹的子元素——也就是插槽是如何做更新的。且在 patch
过程中对于已缓存的组件不会执行 mounted
,所以不会有一般的组件的生命周期函数但是又提供了 activated
和 deactivated
钩子函数。另外我们还知道了 <KeepAive>
的 props
除了 include
和 exclude
还有文档中没有提到的 max
,它能控制我们缓存的个数。
二、属性
2.1 max
max
最多可以缓存多少组件实例。一旦这个数字达到了,在新实例被创建之前,已缓存组件中最久没有被访问的实例会被销毁掉。
<keep-alive :max="10">
<component :is="view"></component>
</keep-alive>
2.2 include
include
允许组件有条件地缓存。二者都可以用逗号分隔字符串、正则表达式或一个数组来表示
<!-- 逗号分隔字符串 -->
<keep-alive include="a,b">
<component :is="view"></component>
</keep-alive>
<!-- 正则表达式 (使用 `v-bind`) -->
<keep-alive :include="/a|b/">
<component :is="view"></component>
</keep-alive>
<!-- 数组 (使用 `v-bind`) -->
<keep-alive :include="['a', 'b']">
<component :is="view"></component>
</keep-alive>
匹配首先检查组件自身的 name
选项,如果 name
选项不可用,则匹配它的局部注册名称 (父组件 components
选项的键值)。匿名组件不能被匹配。
2.3 exclude
exclude
允许组件有条件地缓存。二者都可以用逗号分隔字符串、正则表达式或一个数组来表示
<!-- 逗号分隔字符串 -->
<keep-alive exclude="a,b">
<component :is="view"></component>
</keep-alive>
<!-- 正则表达式 (使用 `v-bind`) -->
<keep-alive :exclude="/a|b/">
<component :is="view"></component>
</keep-alive>
<!-- 数组 (使用 `v-bind`) -->
<keep-alive :exclude="['a', 'b']">
<component :is="view"></component>
</keep-alive>
匹配首先检查组件自身的 name
选项,如果 name
选项不可用,则匹配它的局部注册名称 (父组件 components
选项的键值)。匿名组件不能被匹配。
三、生命周期
3.1 onActivated
onActivated
调用时机为 组件首次挂载 和 每次从缓存中被重新插入时
3.2 onDeactivated
onDeactivated
调用时机为从 DOM
上移除、进入缓存 以及 组件卸载时调用。