<keep-alive></keep-alive>
是Vue的内置组件,能在组件切换过程中将状态保留在内存中,防止重新渲染DOM。
<keep-alive>
包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和<transition>
相似,<keep-alive>
是一个抽象组件:它自身不会渲染一个DOM元素,也不会出现在父组件链中。
prop:
-
include
:字符串或正则表达式。只有匹配的组件会被缓存。 -
exclude
:字符串或正则表达式。任何匹配的组件都不会被缓存,其他组件都会被缓存。
常见用法
export default {
name: 'test-keep-alive',
data () {
return {
includedComponents: "test-keep-alive"
}
}
}
<keep-alive include="test-keep-alive">
<!-- 将缓存name为test-keep-alive的组件 -->
<component></component>
</keep-alive>
<keep-alive include="a,b">
<!-- 将缓存name为a或者b的组件,结合动态组件使用 -->
<component :is="view"></component>
</keep-alive>
<keep-alive include="/a|b/">
<!-- 使用正则表达式,需使用v-bind -->
<component :is="view"></component>
</keep-alive>
<keep-alive exclude="test-keep-alive">
<!-- 将不缓存name为test-keep-alive的组件 -->
<component></component>
</keep-alive>
结合router,缓存部分页面
使用$route.meta
的keepAlive
属性:
<keep-alive>
<router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>
需要在router
中设置router
的原信息meta
:
// router.js
export default new Router({
routes: [{
path: '/',
name: 'Hello',
component: Hello,
meta: {
keepAlive: true
}
}, {
path: '/',
name: 'Hello',
component: Hello,
meta: {
keepAlive: true
}
}]
})
要求:
- 首页是A页面
- B页面跳转到A页面,A页面需要缓存
- C页面跳转到A页面,A页面不需要缓存
思路是在每个路由的beforeRouteLeave(to, from, next)
钩子中设置to.meta.keepAlive
:
// A的路由
{
path: '/',
name: 'A',
component: A,
meta: {
keepAlive: true // 需要被缓存
}
}
// B 跳转到 A 时,让 A 缓存,即不刷新
export default {
data() {
return {};
},
methods: {},
beforeRouteLeave(to, from, next) {
// 设置下一个路由的 meta
to.meta.keepAlive = true; // B 跳转到 A 时,让 A 缓存,即不刷新
next();
}
};
// C 跳转到 A 时让 A 不缓存,即刷新
export default {
data() {
return {};
},
methods: {},
beforeRouteLeave(to, from, next) {
// 设置下一个路由的 meta
to.meta.keepAlive = false; // C 跳转到 A 时让 A 不缓存,即刷新
next();
}
};