keep-alive 首先他是干什么的呢?
keepAlive 是一个内置组件,它的功能是在多个组件间动态切换时缓存被移除的组件实例。
包含/排出
keepalive默认会缓存内部的所有组件实例,但我们可以通过 includue 和 exclude prop来定制该行为。这俩个prop的值都可以是一个以英文逗号分隔的字符串、一个正则表达式,或是包含着倆种类型的一个数组:
<!-- 以英文逗号分隔的字符串 -->
<KeepAlive include="a,b">
<component :is="view" />
</KeepAlive>
<!-- 正则表达式 (需使用 `v-bind`) -->
<KeepAlive :include="/a|b/">
<component :is="view" />
</KeepAlive>
<!-- 数组 (需使用 `v-bind`) -->
<KeepAlive :include="['a', 'b']">
<component :is="view" />
</KeepAlive>
缓存实例的生命周期
当一个组件实例从 DOM 上移除但因为被 <KeepAlive> 缓存而仍作为组件树的一部分时,它将变为不活跃状态而不是被卸载。当一个组件实例作为缓存树的一部分插入到 DOM 中时,它将重新被激活。
一个持续存在的组件可以通过 activated 和 deactivated 选项来注册相应的两个状态的生命周期钩子:
export default {
activated() {
// 在首次挂载、
// 以及每次从缓存中被重新插入的时候调用
},
deactivated() {
// 在从 DOM 上移除、进入缓存
// 以及组件卸载时调用
}
}
接下来直接看源码
keepalive源码
他首先抛出了一个对象,可以理解为抛出一个组件。首先他这个name代表组件名称 abstract 代表提取和抽离的意思。如果为true代表就是提取出来的。他这个props里面接收三个参数,接收 include和 exclude 还有max这三个参数 第一个 include代表包含,exclude 代表不包含,max 代表最大缓存数。
第一首先create先执行
1.他定义了一个对象因为null就是一个对象嘛他这个null里面就是个什么都没有的空对象通过 Object.create创建他是纯对象, 2.this.keys=[] 就是定义了一个空数组
2.执行render函数
1.获取插槽的一个默认元素,keep-alive是可以拿到插槽的元素的。
2.getFirstComponentChild()他这个函数是获取第一个子组件但是他这里面做了什么事呢 他会拿出的是第一个符合条件的元素 首先判断他是不是一个数组如果他是一个数组他就会循环遍历 如果for里面有第一个组件,他就是直接吧这个组件返回
3.componentOptions
componentOptions三木运算符 判断如果他有vnode的情况他就会把当前组件的options给 componentOptions
4.getComponentName获取组件名称
getComponentName()函数他都做了什么事呢,
有name我就取name,如果没有name就取tag的标签了
- const { include exclude} = this 获取出来获取的重props 传过来的,判断他 include 包含没不包含 matches 做了什么呢?
metches 判断 他pattern是不是一个数组 返回的是包含name 如果等于字符串的情况下 返回的是一个包含进去的数组, 判断一个正则如果有就把正则包含进去
- 把const { cache, keys} = this 取出来
判断cache[key] else this.vnodeTocache=vnode //缓存了当前组件的实例
this.keyToCache=key //缓存当前组件的key
最后的他返回组件实例 返回插槽第一个元素
3.mounted做了什么?