keep-alive源码根据自己的理解

126 阅读3分钟

keep-alive 首先他是干什么的呢?

keepAlive 是一个内置组件,它的功能是在多个组件间动态切换时缓存被移除的组件实例。

包含/排出

keepalive默认会缓存内部的所有组件实例,但我们可以通过 includueexclude 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源码

image.png

他首先抛出了一个对象,可以理解为抛出一个组件。首先他这个name代表组件名称 abstract 代表提取和抽离的意思。如果为true代表就是提取出来的。他这个props里面接收三个参数,接收 include和 exclude 还有max这三个参数 第一个 include代表包含,exclude 代表不包含,max 代表最大缓存数。

第一首先create先执行 image.png

1.他定义了一个对象因为null就是一个对象嘛他这个null里面就是个什么都没有的空对象通过 Object.create创建他是纯对象, 2.this.keys=[] 就是定义了一个空数组

2.执行render函数

image.png

1.获取插槽的一个默认元素,keep-alive是可以拿到插槽的元素的。

2.getFirstComponentChild()他这个函数是获取第一个子组件但是他这里面做了什么事呢 他会拿出的是第一个符合条件的元素 首先判断他是不是一个数组如果他是一个数组他就会循环遍历 如果for里面有第一个组件,他就是直接吧这个组件返回

image.png

3.componentOptions

componentOptions三木运算符 判断如果他有vnode的情况他就会把当前组件的options给 componentOptions

4.getComponentName获取组件名称

getComponentName()函数他都做了什么事呢,

image.png 有name我就取name,如果没有name就取tag的标签了

  1. const { include exclude} = this 获取出来获取的重props 传过来的,判断他 include 包含没不包含 matches 做了什么呢?

image.png

metches 判断 他pattern是不是一个数组 返回的是包含name 如果等于字符串的情况下 返回的是一个包含进去的数组, 判断一个正则如果有就把正则包含进去

image.png

  1. 把const { cache, keys} = this 取出来

判断cache[key] else this.vnodeTocache=vnode //缓存了当前组件的实例

this.keyToCache=key //缓存当前组件的key

最后的他返回组件实例 返回插槽第一个元素 image.png image.png

3.mounted做了什么?

image.png

image.png

image.png