// 1.不缓存
<keep-alive :include="[]"></keep-alive>
// 2.缓存所有页面
<keep-alive :include="/\.*/"></keep-alive>
// 3.缓存部分页面
<keep-alive :include="['pageA', pageB]"></keep-alive>
let router = new Router({...});
router.beforeEach((to, from, next) => {
setKeepAlive(from, to);
setTimeout(_ => {
next();
}, 200);
});
function setKeepAlive(from, to) {
// 1.你的逻辑
// 2.存储到vuex中
}
{
path: 'A',
name: 'A',
meta: {
title: '列表页1',
逻辑中用到的变量: '',
},
component: resolve => require(['../page/keepalive/A.vue'], resolve)
}
配置路由信息 --> 路由时确定缓存列表 --> keep-alive中include实时获取,达到动态效果
{
path: 'A',
name: 'A',
meta: {
title: '列表页1',
requireAuth: false,
keepAlive_self: true, // 缓存自身
keepAlive_excep: ['B'] // 当与B(列表页2)切换时不缓存
},
component: resolve => require(['../page/keepalive/A.vue'], resolve)
}
{
path: 'B',
name: 'B',
meta: {
title: '列表页2',
requireAuth: false,
keepAlive_self: false, // 不缓存自身
keepAlive_excep: ['Bb'] // 当与Bb(详情页2)切换,缓存自身
},
component: resolve => require(['../page/keepalive/B.vue'], resolve)
}
{
path: 'C',
name: 'C',
meta: {
title: '缓存组件c',
requireAuth: false,
keepAlive_other: true // 二级页面切换时,缓存
},
component: resolve => require(['../page/keepalive/C.vue'], resolve)
},
]
}
{
path: '/lock',
name: 'lock',
meta: {
title: '锁屏',
requireAuth: false,
g_keepAlive_other: true // 缓存所有页面
},
component: resolve => require(['../page/keepalive/lock.vue'], resolve)
}
import Vue from 'vue'
import Router from 'vue-router'
import store from '../store/store'
Vue.use(Router);
let router = new Router({...});
router.beforeEach((to, from, next) => {
setKeepAlive(from, to);
setTimeout(_ => {
next();
}, 200);
});
function setKeepAlive(from, to) {
console.log('from,to:', from, to);
// 设置状态可在vuex中简化代码,注意规则名称与组建name有关(并非路由中的name)
if (!from.name) { // 如果没有上个页面信息(首次访问或刷新页面)
console.log('如果没有上个页面信息(首次访问或刷新页面)');
return null;
} else if (from.meta.g_keepAlive_other || to.meta.g_keepAlive_other) { // 缓存所有一级以下路由:读取/储存
console.log('缓存所有:读取/储存');
store.commit('keepAlive', /\.*/); // 缓存所有二级
store.commit('gKeepAlive', /\.*/); // 缓存所有一级
} else if (from.meta.keepAlive_other || to.meta.keepAlive_other) { // 缓存其他页面:读取/储存
console.log('缓存其他页面:读取/储存');
store.commit('gKeepAlive', []); // 不缓存一级
store.commit('keepAlive', /\.*/); // 缓存所有二级
return null;
} else {
console.log('普通跳转:from与to分别只影响自身');
// from:是否需要存储缓存
let keppSelfF = from.meta.keepAlive_self || false;
let excepListF = from.meta.keepAlive_excep || []; // 读取例外条件
let isInF = excepListF.indexOf(to.name) > -1;
let hasWrite = keppSelfF !== isInF; // 判断是否有例外
// to:是否需要读取缓存
let keppSelfT = to.meta.keepAlive_self || false;
let excepListT = to.meta.keepAlive_excep || []; // 读取例外条件
let isInT = excepListT.indexOf(from.name) > -1;
let hasRead = keppSelfT !== isInT; // 判断是否有例外
// 生成新缓存规则
let keepAlive = [];
if (hasWrite) {
keepAlive.push(from.name);
}
if (hasRead) {
keepAlive.push(to.name);
}
store.commit('gKeepAlive', []); // 不缓存一级一面
store.commit('keepAlive', keepAlive); // 缓存所有二级页面
}
}
gKeepAlive: [], // 全局默认不缓存默认不缓存
keepAlive: [] // 局部,默认不缓存
<keep-alive :include="$store.getters.gKeepAlive">-->
<router-view/>
keep-alive>
<keep-alive :include="$store.getters.keepAlive">
<router-view/>
keep-alive>
// 防止缓存
beforeRouteLeave(to, from ,next) {
this.$destroy();// 销毁缓存
next();
}
期间使用过切换的方式,弊端是已渲染的页面无法动态设置缓存。
而且from和to要分开判断,(存储与读取缓存要分开)
试图动态设置路由配置的meta信息,发现实时性不好,而且bug多。
<keep-alive>-->
<router-view v-if="$store.keep"/>
keep-alive>
<router-view v-if="!$store.keep"/>