|
@@ -1,9 +1,64 @@
|
|
|
<script setup lang="ts">
|
|
|
+type RouteName = string[]
|
|
|
+/***
|
|
|
+ * 需要缓存滚动条的配置
|
|
|
+ * 1、在router路由配置文件中设置name属性;
|
|
|
+ * 2、在相应组件文件下定义defineOptions({name: string})
|
|
|
+ */
|
|
|
+const keepAlives: RouteName = ['HandleCenter', 'Notice', 'MyDailyLogs']
|
|
|
+const keepAliveIncludes = ref<RouteName>([])
|
|
|
+let scrollTopMap = ref<Record<string, number>>({})
|
|
|
+
|
|
|
+const router = useRouter()
|
|
|
+let timer: any = null;
|
|
|
+
|
|
|
+window.addEventListener("scroll", () => {
|
|
|
+ const routeName: string = router.currentRoute.value.name as string;
|
|
|
+ if (keepAliveIncludes.value.includes(routeName)) {
|
|
|
+ const top: number = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop
|
|
|
+ scrollTopMap.value[routeName] = top;
|
|
|
+ }
|
|
|
+})
|
|
|
+watch(
|
|
|
+ () => router.currentRoute.value,
|
|
|
+ (newValue: any) => {
|
|
|
+ if (timer != null) {
|
|
|
+ clearTimeout(timer);
|
|
|
+ timer = null;
|
|
|
+ }
|
|
|
+ const routeName = newValue.name;
|
|
|
+ if (routeName === 'Home') {
|
|
|
+ keepAliveIncludes.value = []
|
|
|
+ scrollTopMap.value = {}
|
|
|
+ return
|
|
|
+ } else {
|
|
|
+ if (!keepAliveIncludes.value.includes(routeName)) {
|
|
|
+ keepAliveIncludes.value.push(routeName);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (keepAlives.includes(routeName)) {
|
|
|
+ if (timer == null) {
|
|
|
+ timer = setTimeout(() => {
|
|
|
+ window.scrollTo({
|
|
|
+ top: (scrollTopMap.value[routeName] && scrollTopMap.value[routeName] > 0) ? scrollTopMap.value[routeName] : 0
|
|
|
+ });
|
|
|
+ }, 0)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+)
|
|
|
+
|
|
|
</script>
|
|
|
|
|
|
<template>
|
|
|
<div class="app">
|
|
|
- <RouterView />
|
|
|
+ <RouterView>
|
|
|
+ <template #default="{ Component, route }">
|
|
|
+ <keep-alive :include="keepAliveIncludes">
|
|
|
+ <component :is="Component" :key="route.fullPath" />
|
|
|
+ </keep-alive>
|
|
|
+ </template>
|
|
|
+ </RouterView>
|
|
|
</div>
|
|
|
</template>
|
|
|
|