keep-alive是vue的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,不会销毁它们。在组件切换过程中,将状态保留在内存中。
优点
1.防止重复渲染DOM
2.减少加载时间及性能消耗
3.提高用户体验性
参数
- include: 只有名称匹配的组件会被缓存
- exclude: 任何名称匹配的组件都不会被缓存
- max: 数组。最多可以缓存多少个实例组件
使用
include
exclude 使用方法相同
<keep-alive>
<router-view /> //需要缓存的组件
</keep-alive>
<!-- 逗号分隔字符串 -->
<keep-alive include="a,b">
<router-view :is="view" />
</keep-alive>
<!-- 正则表达式 (使用 `v-bind`) -->
<keep-alive :include="/a|b/">
<router-view :is="view" />
</keep-alive>
<!-- 数组 (使用 `v-bind`) -->
<keep-alive :include="['a', 'b']">
<router-view :is="view" />
</keep-alive>
<!-- 只缓存组件name为name1或者name1的组件 -->
<keep-alive include="a,b">
<router-view />
</keep-alive>
include的值,是组件页面中name的值,不是路由router中设置name的值。
如果同时使用include和exclude,则exclude得优先级大于include,下面例子只缓存A,max最多只能缓存5个组件,如果达到这个数组,则在新实例被创建前,以前很久没有访问到的,则自动销毁。
<keep-alive include="A,B" exclude="B" max="5">
<router-view />
</keep-alive>
使用keep-alive后,就会有两个新的生命周期钩子activated和deactivated。
activated
在keep-alive组件激活时调用;
deactivated
在keep-alive组件停用时调用;
直接使用v-if进行判断是否需要缓存
有时候在App.vue页面中,created中获取不到$route,就需要在watch中进行获取。
watch: {
'$route':function(val) {
// val 就是路由内的相关信息。有path,name,fullpage
console.log(val)
}
}
获取到信息后,可以通过判断实现需要缓存的组件,如果使用其他框架搭建项目,导致项目中没有meta,可自己进行获取。
<keep-alive>
<route-view v-if="defaPath === '/home/index'" />
</keep-alive>
<route-view v-if="defaPath !== 'homl/index'" :key="key" />
key可以对页面进行刷新,只要地址栏进行改变,当前页面就会重新渲染,执行created中的方法。
computed: {
key() {
return this.$route.fullPath
}
}
如果还是不能达到所需的效果,要注意查看项目中是否存在两个
<route-view>,是否都绑定了key值。