keep-alive 的理解
1. Keep-alive 是什么
keep-alive 是 Vue 中的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染 DOM。
keep-alive 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。
keep-alive 可以设置以下 props 属性:
include:只有名称匹配的组件会被缓存。exclude:任何名称匹配的组件都不会被缓存。max:最多可以缓存多少组件实例。
基本用法:
<keep-alive>
<component :is="view" />
</keep-alive>
设置了 keep-alive 缓存的组件,会多出两个生命周期钩子(activated 与 deactivated)。
2. 使用场景:如何在路由中设置是否缓存?
在路由中设置 keepAlive 属性判断是否需要缓存:
{
path: 'list',
name: 'itemList', // 列表页
component(resolve) {
require(['@/pages/item/list'], resolve)
},
meta: {
keepAlive: true,
title: '列表页'
}
}
使用 <keep-alive>:
<div id="app" class="wrapper">
<keep-alive>
<!-- 需要缓存的视图组件 -->
<router-view v-if="$route.meta.keepAlive" />
</keep-alive>
<!-- 不需要缓存的视图组件 -->
<router-view v-if="!$route.meta.keepAlive" />
</div>
3. 缓存后如何获取数据
两种方法:
beforeRouteEnter
每次组件渲染的时候,都会执行 beforeRouteEnter:
beforeRouteEnter(to, from, next) {
next(vm => {
console.log(vm)
// 每次进入路由执行
vm.getData() // 获取数据
})
}
activated
在 keep-alive 缓存的组件被激活的时候,都会执行 activated 钩子:
activated() {
this.getData() // 获取数据
}
注意:服务器端渲染期间 activated 不被调用。
来源整理自:vue3js.cn 面试官系列



