一、vue实现页面缓存
在vue中,许多组件需要实时刷新,譬如详情页。但有时候某些组件不需要重复渲染,譬如信息列表页。此时,我们可以使用<keep-alive>标签,实现组件缓存。写法如下,在app.vue文件中:
<template>
<div id="app">
<keep-alive>
<router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>
</div>
</template>
在router文件夹下的index.js中,给list页面的路由meta配置对应参数keepAlive值为true,即可针对性缓存list页面:
const routers = [
{
path: '/list',
meta: {title: '列表页',keepAlive:true},
component: (resolve) => require(['../pages/list'], resolve),
},
{
path: '/detail',
meta: {title: '详情页'},
component: (resolve) => require(['../pages/detail'], resolve),
},
];
export default routers;
二、实现列表页的进入刷新,返回不刷新与按需刷新
在缓存了列表页进入详情页之后,进入详情页修改了列表页数据,此时再返回列表页时,就需要对列表页进行刷新。
我们可以通过beforeRouteEnter以及beforeRouteLeave两个钩子来实现需求。在详情页执行以下代码:
beforeRouteEnter:function(to,from,next){
// 页面状态初始化
to.meta.refresh = false;//默认返回列表页时,列表页不执行刷新
from.meta.keepAlive = true;//列表页默认缓存
console.log(to.meta);
console.log(from.meta);
next();
},
beforeRouteLeave:function(to,from,next){
if(from.meta.refresh) to.meta.keepAlive = false;//默认返回列表页时,列表页执行刷新
console.log(to.meta);
console.log(from.meta);
next();
},
methods: {
reload(){
this.$route.meta.refresh = true;//返回列表页时,列表页执行刷新
},
}
当进入详情页时,初始化页面状态,处于默认返回列表页时,列表页不执行刷新、列表页默认缓存状态。当在详情页执行了数据操作后,调用reload()方法,将列表页的缓存状态改为false,即可实现返回列表页后刷新。
三、其他方式
我们也可以使用<keep-alive>标签的key值,实现页面缓存及刷新。当我们需要刷新列表时,在跳转时多传一个随机字符串,页面就能重新加载了。在app.vue中:
<template>
<div id="app">
<keep-alive>
<router-view v-if="$route.meta.keepAlive" :key="$route.fullPath"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>
</div>
</template>
在详情页中:
methods: {
goBack(){
this.$router.push({
path: '/list',
query: {'random': Math.random()},
})
},
}
返回上一页时,调用goBack()方法即可,这个方法更加简单快捷。而缺陷是:会在url中看到随机字符串,而且会缓存多个不同key的列表页,会占用更多内存。