概要内容
- 实现步骤
- 第一步:利用store状态管理缓存页面
- 第二步:布局layout组件添加router-view相关配置
- 第三步:在需要缓存的页面,添加路由守卫
- 总结
实现步骤
-
第一步:利用store状态管理缓存页面
// src/store/modules/KeepAlive.ts //------------------------------------------------------------------------- const keepAliveModule = { namespaced: true, state: { caches: [], }, mutations: { ADD(state, name) { if (state.caches.indexOf(name) < 0) { state.caches.push(name) } }, REMOVE(state, name) { state.caches = state.caches.filter(item => item != name); }, CLEAN(state) { state.caches = []; } } } //------------------------------------------------------------------------- export default keepAliveModule; //-------------------------------------------------------------------------// src/store/index.ts import { createStore } from 'vuex' import keepAliveModule from './modules/KeepAlive'; //------------------------------------------------------------------------- const store = createStore({ modules: { keepAlive: keepAliveModule }, getters: { keepAlive: (state) => (state as any).keepAlive, } }); //------------------------------------------------------------------------- export default store; //------------------------------------------------------------------------- -
第二步:布局layout组件添加router-view相关配置
<template> <div class="MainWrapper"> <router-view v-slot="{ Component }"> <transition> <keep-alive :include="$store.state.keepAlive.caches"> <component :is="Component" /> </keep-alive> </transition> </router-view> </div> </template> -
第三步:在需要缓存的页面,添加路由守卫
-
beforeRouteEnter:添加缓存页面
-
beforeRouteLeave:删除缓存页面
-
提示:控制逻辑放置一块,方便管理
//src/views/variety.vue export default defineComponent({ name: "variety", components: { }, setup(props, context) { }, beforeRouteEnter(to, from, next) { if (to.path == "/product/variety") { store.commit("keepAlive/ADD", to.name); } next(); }, beforeRouteLeave(to, from, next) { if (to.name != "pic-editor") { store.commit("keepAlive/REMOVE", from.name); } next(); }, });
-
总结
- 特别提醒:keep-alive :include 使用的是页面组件name,所以一定要记得给页面组件命名
参考文献
以上:如发现有问题,欢迎留言指出,我及时更正