需求为从列表页进入详情页后返回列表页可以保留页面上的数据、筛选器选择等等
直接在router设置keepalive,实际并不能满足需求,所以使用include + watch 动态改变缓存列表
<template>
<router-view v-slot="{ Component }">
<keep-alive :include="cachePages">
<component :is="Component" :key="route.name"/>
</keep-alive>
</router-view>
</template>
<script lang="ts" setup>
const route = useRoute()
const router = useRouter()
const cachePages = ref(['List'])
watch(
() => router.currentRoute.value.name,
(to, from) => {
// 在这里可以执行路由变化时需要做的任何逻辑
// 从详情页返回时,确保列表页在缓存中
if (to === 'List' && from === 'Detail') {
if (!cachePages.value.includes('List')) {
cachePages.value.push('List')
}
}
// 从其他页面进入列表页时,移除缓存强制刷新
else if (to === 'List' && from !== 'Detail') {
const index = cachePages.value.indexOf('List')
if (index > -1) {
cachePages.value.splice(index, 1)
}
// 短暂延迟后重新添加缓存,为了下次返回时能缓存
setTimeout(() => {
if (!cachePages.value.includes('List')) {
cachePages.value.push('List')
}
}, 100)
}
},
{ deep: true, immediate: true }
)
</script>
<style scoped>
</style>