keep-alive 作用

66 阅读2分钟

keep-alive 是 Vue.js 的内置组件,主要用于‌缓存非活动组件实例‌,避免重复渲染和销毁,从而提升应用性能和用户体验。其核心作用与应用场景如下:

核心作用

1.‌保留组件状态

  • 被包裹的组件切换时(如路由跳转或动态组件切换),其内部状态(如数据、计算属性、表单输入值等)会被保留在内存中,再次激活时直接恢复状态,避免重新初始化 。

  • 典型场景:从商品列表页进入详情页后返回,列表的筛选条件或滚动位置保持不变 。

2.‌优化性能

  • 减少 DOM 渲染开销‌:避免组件频繁切换时重复创建和销毁实例,复用已缓存的组件实例及对应的虚拟 DOM 结构 。

  • 降低资源消耗‌:跳过重复的数据请求、计算逻辑及 DOM 操作,尤其对复杂组件效果显著 。

3.‌控制缓存策略

  • 通过 include/exclude 属性指定需缓存或排除的组件(支持字符串、正则或数组)。

  • 通过 max 属性限制最大缓存实例数(采用 ‌LRU 算法‌淘汰最久未使用的实例)。

生命周期变化

被 keep-alive 包裹的组件会触发专属钩子:

  • activated‌:组件被激活(从缓存恢复)时调用,适合执行数据刷新等逻辑 。

  • deactivated‌:组件被停用(进入缓存)时调用,适合清除定时器等资源 。

注:常规的 created/mounted 仅在初次渲染时触发一次 。

适用场景

1.‌高频切换的组件

  • Tab 标签页切换、动态组件渲染(如 )。

2.‌需保持状态的页面

  • 列表页 → 详情页 → 返回列表页(保留列表状态)。

  • 多步骤表单的步骤切换 。

3.‌复杂组件的性能优化

  • 避免大数据量表格、图表等重渲染带来的卡顿 。

注意事项

  • 缓存并非万能‌:过度使用可能导致内存占用过高,需结合实际场景通过 include/exclude 精细控制 。

  • 动态组件需绑定 key‌:避免复用导致状态错乱(如:<keep-alive><component :key="route.path" /></keep-alive>)。

  • 不依赖实时更新的组件‌:需要每次渲染都获取最新数据的组件(如实时监控)不适合缓存 。

原理简述

  • 通过内置缓存对象(cache)存储组件实例,以组件标识(如 name + 路径)为 Key 。

  • 命中缓存时直接复用实例,触发 activated 钩子;未命中时新建实例并存入缓存 。

  • 缓存内容包含:虚拟 DOM 树、组件状态、DOM 节点信息 。

通过合理应用 keep-alive,可显著提升应用流畅度与用户体验,但需结合业务需求权衡缓存策略 。