You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.5 KiB
98 lines
2.5 KiB
<script setup lang="ts">
|
|
import { computed, unref, watch } from 'vue';
|
|
import { useRoute } from 'vue-router';
|
|
|
|
import { preferences } from '@vben/preferences';
|
|
import { getTabKey, storeToRefs, useTabbarStore } from '@vben/stores';
|
|
|
|
import { transformComponent, useLayoutHook } from '../hooks';
|
|
|
|
const route = useRoute();
|
|
|
|
const tabbarStore = useTabbarStore();
|
|
|
|
const { getTabs, getCachedRoutes, getExcludeCachedTabs } =
|
|
storeToRefs(tabbarStore);
|
|
const { removeCachedRoute } = tabbarStore;
|
|
|
|
const { getEnabledTransition, getTransitionName } = useLayoutHook();
|
|
|
|
/**
|
|
* 是否启用tab
|
|
*/
|
|
const enableTabbar = computed(() => preferences.tabbar.enable);
|
|
|
|
const computedCachedRouteKeys = computed(() => {
|
|
if (!unref(enableTabbar)) {
|
|
return [];
|
|
}
|
|
return unref(getTabs)
|
|
.filter((item) => item.meta.domCached)
|
|
.map((item) => getTabKey(item));
|
|
});
|
|
|
|
/**
|
|
* 监听缓存路由变化,删除不存在的缓存路由
|
|
*/
|
|
watch(computedCachedRouteKeys, (keys) => {
|
|
unref(getCachedRoutes).forEach((item) => {
|
|
if (!keys.includes(item.key)) {
|
|
removeCachedRoute(item.key);
|
|
}
|
|
});
|
|
});
|
|
|
|
/**
|
|
* 所有缓存的route
|
|
*/
|
|
const computedCachedRoutes = computed(() => {
|
|
if (!unref(enableTabbar)) {
|
|
return [];
|
|
}
|
|
// 刷新路由可刷新缓存
|
|
const excludeCachedTabKeys = unref(getExcludeCachedTabs);
|
|
return [...unref(getCachedRoutes).values()].filter((item) => {
|
|
const componentType: any = item.component.type || {};
|
|
let componentName = componentType.name;
|
|
if (!componentName) {
|
|
componentName = item.route.name;
|
|
}
|
|
return !excludeCachedTabKeys.includes(componentName);
|
|
});
|
|
});
|
|
|
|
/**
|
|
* 是否显示
|
|
*/
|
|
const computedShowView = computed(() => unref(computedCachedRoutes).length > 0);
|
|
|
|
const computedCurrentRouteKey = computed(() => {
|
|
return getTabKey(route);
|
|
});
|
|
</script>
|
|
|
|
<template>
|
|
<template v-if="computedShowView">
|
|
<template v-for="item in computedCachedRoutes" :key="item.key">
|
|
<Transition
|
|
v-if="getEnabledTransition"
|
|
appear
|
|
mode="out-in"
|
|
:name="getTransitionName(item.route)"
|
|
>
|
|
<component
|
|
v-show="item.key === computedCurrentRouteKey"
|
|
:is="transformComponent(item.component, item.route)"
|
|
/>
|
|
</Transition>
|
|
<template v-else>
|
|
<component
|
|
v-show="item.key === computedCurrentRouteKey"
|
|
:is="transformComponent(item.component, item.route)"
|
|
/>
|
|
</template>
|
|
</template>
|
|
</template>
|
|
</template>
|
|
|
|
<style scoped></style>
|
|
|