app.vue(或其它入口页)使用keep-alive的include动态设置缓存
注意:有嵌套的页面需要在嵌套内部的router-view上添加keep-alive
<template>
<router-view v-slot="{ Component}">
<keep-alive :include="cacheList">
<component :is="Component" />
</keep-alive>
</router-view>
</template>
<script setup lang="ts">
import { cacheStore } from "@/stores";
const store = cacheStore();
// 在store中定义一个cacheList用在存放缓存页面
const cacheList = computed(() => {
return store.cacheList;
});
</script>
stores的index.ts:使用pinia调控缓存页面的数组
import { defineStore } from "pinia";
import { cacheState } from './types';
const cacheStore = defineStore("cache", {
state: (): cacheState => ({
cacheList:[] // keep-alive缓存列表
}),
actions: {
pushCaches(item:string) {
let set = new Set(this.cacheList);
set.add(item);
this.cacheList = Array.from(set);
},
popCaches(item:string) {
let set = new Set(this.cacheList);
if (set.has(item)) {
set.delete(item);
}
this.cacheList = Array.from(set);
},
},
});
export default cacheStore;
list.vue(列表页)
注意:vue3的setup模式使用defineOptions为页面路由命名
<script lang="ts" setup>
import { ref } from "vue";
import { onBeforeRouteLeave} from "vue-router";
import { cacheStore } from "@/stores";
const store = cacheStore();
//路由命名(非组件名)
defineOptions({ name: "list" });
//离开页面守卫
onBeforeRouteLeave((to, _from, next) => {
// 若跳转的是详情页缓存本页面,否则清除本页缓存
if (to.name === "detail") {
store.pushCaches("list");
} else {
store.popCaches("list");
}
next();
});
</script>
detail.vue(详情页)
<script lang="ts" setup>
//路由命名
defineOptions({ name: "detail" });
</script>