123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- <script lang="ts" setup>
- import type { RouteLocationNormalizedLoaded } from 'vue-router';
- import { preferences, usePreferences } from '@vben-core/preferences';
- import { Spinner } from '@vben-core/shadcn-ui';
- import { storeToRefs, useCoreTabbarStore } from '@vben-core/stores';
- import { IFrameRouterView } from '../../iframe';
- import { useContentSpinner } from './use-content-spinner';
- defineOptions({ name: 'LayoutContent' });
- const tabbarStore = useCoreTabbarStore();
- const { keepAlive } = usePreferences();
- const { spinning } = useContentSpinner();
- const { getCachedTabs, getExcludeCachedTabs, renderRouteView } =
- storeToRefs(tabbarStore);
- function getTransitionName(route: RouteLocationNormalizedLoaded) {
-
- const { tabbar, transition } = preferences;
- const transitionName = transition.name;
- if (!transitionName || !transition.enable) {
- return;
- }
-
- if (!tabbar.enable || !keepAlive) {
- return transitionName;
- }
-
-
-
-
-
- const inTabs = getCachedTabs.value.includes(route.name as string);
- return inTabs && route.meta.loaded ? undefined : transitionName;
- }
- </script>
- <template>
- <div class="relative h-full">
- <Spinner
- v-if="preferences.transition.loading"
- :spinning="spinning"
- class="h-[var(--vben-content-client-height)]"
- />
- <IFrameRouterView />
- <RouterView v-slot="{ Component, route }">
- <Transition :name="getTransitionName(route)" appear mode="out-in">
- <KeepAlive
- v-if="keepAlive"
- :exclude="getExcludeCachedTabs"
- :include="getCachedTabs"
- >
- <component
- :is="Component"
- v-if="renderRouteView"
- v-show="!route.meta.iframeSrc"
- :key="route.fullPath"
- />
- </KeepAlive>
- <component
- :is="Component"
- v-else-if="renderRouteView"
- :key="route.fullPath"
- />
- </Transition>
- </RouterView>
- </div>
- </template>
|