【Vue源码】带你解读Keep-alive源码

136 阅读2分钟

学习keep-alive

首先要了解什么是keep-alive官网的定义呢是一个内置组件

image.png 接下来我们要了解一下keep-alive这个组件的基本用法。这个组件的功能只有一个那就是缓存组件,可以让其包裹的组件不销毁,起到一个缓存的作用。 接受可选的三个参数

  • max 缓存的最大组件数量,支持数字和字符串
  • include 需要缓存的数据,支持字符串,数组,正则
  • exclude 不需要缓存的数据,支持字符串,数组,正则

keep-alive 的 max 属性,用于限制可以缓存多少组件实例,一旦这个数字达到了上限,在新实例被创建之前,已缓存组件中最久没有被访问的实例会被销毁掉,而这里所运用到的缓存机制就是* LRU 算法*

LRU 缓存淘汰算法

LRU( least recently used)根据数据的历史记录来淘汰数据,重点在于保护最近被访问/使用过的数据,淘汰现阶段最久未被访问的数据

image.png 1.新数据插入到链表尾部;

2.每当缓存命中(即缓存数据被访问),则将数据移到链表尾部

3.当链表满的时候,将链表头部的数据丢弃。

创建和销毁时期

我们先来看看keep-alive在创建和销毁时期都做了那些事情

image.png 由以上源码可以看出在创建时期created钩子函数会创建一个cache对象,用来保存node节点。

在销毁阶段:destroyed 钩子则会调用pruneCacheEntry方法清除cache缓存中的所有组件实例。

pruneCacheEntry函数

刚才说了在destroyed函数中删除了所有的缓存数据,接下来让我们看看pruneCacheEntry函数在其中都做了什么

image.png 总结一下就是做了三件事:

  • 1、遍历集合,执行所有缓存组件的$destroy方法
  • 2、将cache对应key的内容设置为null
  • 3、删除keys中对应的元素

render函数

image.png

  • 首先通过插槽获取第一个缓存的组件
  • 拿出当前组件的options选项,获取组件的名称并且判断类型
  • 获取组件传过来的props包含和未包含的缓存内容。、
  • 通过上文提到的LRU缓存淘汰算法进行判断若没有缓存则缓存改组件
  • 当超过最大缓存组件数量时则删掉。

以上就是我对于Keep-alive组件源码的理解,如有错误还望各位大佬指出。