学习keep-alive
首先要了解什么是keep-alive官网的定义呢是一个内置组件
接下来我们要了解一下keep-alive这个组件的基本用法。这个组件的功能只有一个那就是缓存组件,可以让其包裹的组件不销毁,起到一个缓存的作用。
接受可选的三个参数
- max 缓存的最大组件数量,支持数字和字符串
- include 需要缓存的数据,支持字符串,数组,正则
- exclude 不需要缓存的数据,支持字符串,数组,正则
keep-alive
的 max
属性,用于限制可以缓存多少组件实例,一旦这个数字达到了上限,在新实例被创建之前,已缓存组件中最久没有被访问的实例会被销毁掉,而这里所运用到的缓存机制就是* LRU 算法*
LRU 缓存淘汰算法
LRU( least recently used)根据数据的历史记录来淘汰数据,重点在于保护最近被访问/使用过的数据,淘汰现阶段最久未被访问的数据
1.新数据插入到链表尾部;
2.每当缓存命中(即缓存数据被访问),则将数据移到链表尾部
3.当链表满的时候,将链表头部的数据丢弃。
创建和销毁时期
我们先来看看keep-alive在创建和销毁时期都做了那些事情
由以上源码可以看出在创建时期created钩子函数会创建一个cache对象,用来保存node节点。
在销毁阶段:destroyed 钩子则会调用pruneCacheEntry方法清除cache缓存中的所有组件实例。
pruneCacheEntry函数
刚才说了在destroyed函数中删除了所有的缓存数据,接下来让我们看看pruneCacheEntry函数在其中都做了什么
总结一下就是做了三件事:
- 1、遍历集合,执行所有缓存组件的$destroy方法
- 2、将cache对应key的内容设置为null
- 3、删除keys中对应的元素
render函数
- 首先通过插槽获取第一个缓存的组件
- 拿出当前组件的options选项,获取组件的名称并且判断类型
- 获取组件传过来的props包含和未包含的缓存内容。、
- 通过上文提到的LRU缓存淘汰算法进行判断若没有缓存则缓存改组件
- 当超过最大缓存组件数量时则删掉。
以上就是我对于Keep-alive组件源码的理解,如有错误还望各位大佬指出。