在搭建 vue 项目时,有某些组件没必要多次渲染,所以需要将组件在内存中进行‘持久化’,此时 <keep-alive> 便可以派上用场了。 <keep-alive> 可以使被包含的组件状态维持不变,即便是组件切换了,其内的状态依旧维持在内存之中。在下一次显示时,也不会重现渲染。
<router-link>和<router-view>和<keep-alive>
主要 结合 Vue Router 配置 meta true
1.keep-alive
<!-- template -->
<keep-alive>
<router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>
//router配置
new Router({
routes: [
{
name: 'a',
path: '/a',
component: A,
meta: {
keepAlive: true
}
},
{
name: 'b',
path: '/b',
component: B
}
]
})
<!-- 一个include解决了,不需要多写一个标签,也不需要在路由元中添加keepAlive了 --> <keep-alive include='a'> <router-view></router-view> </keeo-alive>
<!-- 逗号分隔字符串,只有组件a与b被缓存。这样使用场景变得更有意义了 --> <keep-alive include="a,b"> <component :is="view"></component> </keep-alive> <!-- 正则表达式 (需要使用 v-bind,符合匹配规则的都会被缓存) --> <keep-alive :include="/a|b/"> <component :is="view"></component> </keep-alive> <!-- Array (需要使用 v-bind,被包含的都会被缓存) --> <keep-alive :include="['a', 'b']"> <component :is="view"></component>
<template>
<div>
<h1>欢迎页</h1>
<input type="text" name="" value=""><br>
<router-link to="/">回到首页</router-link>
</div>
</template>
<script>
export default {
name: 'hello',
//keep-alive钩子函数:组件被激活时调用
activated() {
console.log('欢迎页被激活');
},
//keep-alive钩子函数:组件消失,被缓存时调用
deactivated() {
console.log('欢迎页被缓存');
}
}
</script>
activated():页面组件被激活时调用。即组件第一次渲染时会被调用,之后每次 keep-alive 激活时也会被调用。通常我们可以在这个方法中实现:每次进入页面的时候获取最新的数据。
只有组件被 keep-alive 包裹时,这两个函数才会被调用。如果作为正常组件使用,是不会被调用的。
在关于页(about.vue)路由离开 这个钩子函数中设置首页不缓存:
<template>
<div>
<h1>关于页</h1>
<input type="text" name="" value=""><br>
<router-link to="/">回到首页</router-link>
</div>
</template>
<script>
export default {
name: 'hello',
//keep-alive钩子函数:组件被激活时调用
activated() {
console.log('首页被激活');
},
//keep-alive钩子函数:组件消失,被缓存时调用
deactivated() {
console.log('首页被缓存');
},
beforeRouteLeave(to, from, next) {
//设置下一个路由的meta(即首页)
to.meta.keepAlive = false; //让首页不缓存,即刷新
//to.meta.keepAlive = true; //让首页缓存,即不刷新
next();
}
}
</script>
原文出自:www.hangge.com 转载请保留原文链接:https://www.hangge.com/blog/cache/detail_2132.html
