Keep-Alive 原理与用法
1. 面试题
Q: Keep-Alive 的作用是什么?include 和 exclude 是怎么匹配的?缓存淘汰策略是什么?
2. 核心解答
Keep-Alive 是一个 Vue 内置的抽象组件。
它的主要作用是缓存不活动的组件实例,避免在切换路由或组件时频繁销毁和重建。
(1) 适用场景
- Tab 切换:在 A, B, C 三个 Tab 间切换,保持之前的状态(如表单填写内容)。
- 列表详情页:从列表进详情再返回列表,列表应停留在刚才滚动的距离,不刷新数据。
(2) 生命周期
被缓存的组件不会触发 created / mounted / unmounted。
它有专属的生命周期:
- activated: 组件被激活(进入)时调用。
- deactivated: 组件被停用(离开)时调用。
(3) 配置参数
- include: 只有匹配 name 的组件才缓存 (字符串/正则/数组)。
- exclude: 匹配 name 的组件都不缓存。
- max: 最大缓存数量。
(4) LRU 缓存策略 (核心算法)
Vue 在内部维护了一个 keys 数组和一个 cache 对象。
采用 LRU (Least Recently Used) 最近最少使用算法:
- 命中缓存:将该 key 移到 keys 数组的最后(表示最近刚用过)。
- 未命中且已满:销毁 keys 数组第一个组件(最早访问的,也就是最近最少使用的),然后放入新组件。
3. 注意事项
- include 匹配的是什么? 匹配的是组件选项中的
name 属性,不是路由的 name。如果要用 exclude,组件必须显式声明 name。
- 配合 Router:
<!-- Vue 3 -->
<router-view v-slot="{ Component }">
<keep-alive>
<component :is="Component" />
</keep-alive>
</router-view>