在 Vue.js 中,<keep-alive>
是一个内置的抽象组件,主要用于缓存不活跃的组件实例,避免重复渲染带来的性能损耗。以下是详细说明和使用指南:
核心作用
- 状态保留:缓存组件状态(如数据、DOM 结构、滚动位置等)
- 性能优化:避免组件频繁创建/销毁的开销
- 生命周期控制:提供
activated
和deactivated
生命周期钩子
基础用法
1. 包裹动态组件
<template>
<keep-alive>
<component :is="currentComponent"></component>
</keep-alive>
</template>
2. 包裹路由视图(Vue Router)
<template>
<keep-alive>
<router-view></router-view>
</keep-alive>
</template>
高级配置
1. 指定缓存范围
<keep-alive :include="/A|B/" :exclude="['C']" :max="10">
<router-view></router-view>
</keep-alive>
- include:匹配组件
name
的正则表达式/数组/字符串(支持,
分隔) - exclude:排除不需要缓存的组件
- max:最大缓存实例数(LRU 策略淘汰旧实例)
2. 生命周期钩子
export default {
activated() {
// 组件被激活时触发(从缓存中重新进入)
console.log('组件激活');
},
deactivated() {
// 组件离开时触发(进入缓存)
console.log('组件缓存');
}
}
典型应用场景
- Tab 切换页面:保持每个 Tab 页的状态
- 表单页:避免重复填写
- 长列表:保留滚动位置
- 数据加载耗时组件:避免重复请求
注意事项
- 组件命名:被缓存组件必须设置
name
选项 - 内存管理:避免滥用导致内存压力
- 数据更新:缓存组件不会触发
created/mounted
,需在activated
中处理数据刷新 - 路由配置:需配合
vue-router
的meta
字段实现条件缓存
示例:条件缓存路由
// router.js
{
path: '/detail/:id',
component: DetailPage,
meta: { keepAlive: true } // 通过 meta 控制是否缓存
}
<template>
<keep-alive>
<router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>
</template>
通过合理使用 <keep-alive>
,可以显著提升复杂 SPA 的用户体验和性能表现。建议根据具体业务场景选择性地缓存组件,并注意内存使用的平衡。