2024-05-19 21:20:42 +08:00
|
|
|
<script lang="ts" setup>
|
2026-02-27 16:04:01 +08:00
|
|
|
import type { RouteLocationNormalizedLoadedGeneric } from 'vue-router';
|
2024-07-28 14:29:05 +08:00
|
|
|
|
2026-02-27 16:04:01 +08:00
|
|
|
import { unref } from 'vue';
|
2024-07-28 14:29:05 +08:00
|
|
|
import { RouterView } from 'vue-router';
|
2024-06-08 19:49:06 +08:00
|
|
|
|
2026-02-27 16:04:01 +08:00
|
|
|
import { usePreferences } from '@vben/preferences';
|
2025-05-18 10:33:02 +08:00
|
|
|
import { getTabKey, storeToRefs, useTabbarStore } from '@vben/stores';
|
2024-05-19 21:20:42 +08:00
|
|
|
|
2026-02-27 16:04:01 +08:00
|
|
|
import { transformComponent, useLayoutHook } from '../../hooks';
|
2024-05-19 21:20:42 +08:00
|
|
|
import { IFrameRouterView } from '../../iframe';
|
2026-02-27 16:04:01 +08:00
|
|
|
import { RouteCachedPage, RouteCachedView } from '../../route-cached';
|
2024-05-19 21:20:42 +08:00
|
|
|
|
|
|
|
|
defineOptions({ name: 'LayoutContent' });
|
|
|
|
|
|
2024-07-30 21:10:28 +08:00
|
|
|
const tabbarStore = useTabbarStore();
|
2024-06-23 23:18:55 +08:00
|
|
|
const { keepAlive } = usePreferences();
|
2024-06-23 19:39:44 +08:00
|
|
|
|
2024-07-10 00:50:41 +08:00
|
|
|
const { getCachedTabs, getExcludeCachedTabs, renderRouteView } =
|
|
|
|
|
storeToRefs(tabbarStore);
|
2024-05-19 21:20:42 +08:00
|
|
|
|
2026-02-27 16:04:01 +08:00
|
|
|
const { getEnabledTransition, getTransitionName } = useLayoutHook();
|
2024-07-28 14:29:05 +08:00
|
|
|
|
|
|
|
|
/**
|
2026-02-27 16:04:01 +08:00
|
|
|
* 是否显示component
|
|
|
|
|
* @param route
|
2024-07-28 14:29:05 +08:00
|
|
|
*/
|
2026-02-27 16:04:01 +08:00
|
|
|
const showComponent = (route: RouteLocationNormalizedLoadedGeneric) => {
|
|
|
|
|
return !route.meta.domCached && unref(renderRouteView);
|
|
|
|
|
};
|
2024-05-19 21:20:42 +08:00
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<template>
|
2024-06-23 19:39:44 +08:00
|
|
|
<div class="relative h-full">
|
|
|
|
|
<IFrameRouterView />
|
2026-02-27 16:04:01 +08:00
|
|
|
<RouteCachedView />
|
2024-06-23 19:39:44 +08:00
|
|
|
<RouterView v-slot="{ Component, route }">
|
2026-02-27 16:04:01 +08:00
|
|
|
<RouteCachedPage
|
|
|
|
|
:component="Component"
|
|
|
|
|
:route="route"
|
|
|
|
|
v-if="route.meta.domCached"
|
|
|
|
|
/>
|
2025-04-08 20:27:03 +08:00
|
|
|
<Transition
|
|
|
|
|
v-if="getEnabledTransition"
|
|
|
|
|
:name="getTransitionName(route)"
|
|
|
|
|
appear
|
|
|
|
|
mode="out-in"
|
|
|
|
|
>
|
2024-06-23 19:39:44 +08:00
|
|
|
<KeepAlive
|
|
|
|
|
v-if="keepAlive"
|
2024-07-10 00:50:41 +08:00
|
|
|
:exclude="getExcludeCachedTabs"
|
|
|
|
|
:include="getCachedTabs"
|
2024-06-23 19:39:44 +08:00
|
|
|
>
|
|
|
|
|
<component
|
2024-07-28 14:29:05 +08:00
|
|
|
:is="transformComponent(Component, route)"
|
2026-02-27 16:04:01 +08:00
|
|
|
v-if="showComponent(route)"
|
2024-06-23 19:39:44 +08:00
|
|
|
v-show="!route.meta.iframeSrc"
|
2025-05-18 10:33:02 +08:00
|
|
|
:key="getTabKey(route)"
|
2024-06-23 19:39:44 +08:00
|
|
|
/>
|
|
|
|
|
</KeepAlive>
|
2024-07-05 23:15:46 +08:00
|
|
|
<component
|
|
|
|
|
:is="Component"
|
2026-02-27 16:04:01 +08:00
|
|
|
v-else-if="showComponent(route)"
|
2025-05-18 10:33:02 +08:00
|
|
|
:key="getTabKey(route)"
|
2024-07-05 23:15:46 +08:00
|
|
|
/>
|
2024-06-23 19:39:44 +08:00
|
|
|
</Transition>
|
2025-04-08 20:27:03 +08:00
|
|
|
<template v-else>
|
|
|
|
|
<KeepAlive
|
|
|
|
|
v-if="keepAlive"
|
|
|
|
|
:exclude="getExcludeCachedTabs"
|
|
|
|
|
:include="getCachedTabs"
|
|
|
|
|
>
|
|
|
|
|
<component
|
|
|
|
|
:is="transformComponent(Component, route)"
|
2026-02-27 16:04:01 +08:00
|
|
|
v-if="showComponent(route)"
|
2025-04-08 20:27:03 +08:00
|
|
|
v-show="!route.meta.iframeSrc"
|
2025-05-18 10:33:02 +08:00
|
|
|
:key="getTabKey(route)"
|
2025-04-08 20:27:03 +08:00
|
|
|
/>
|
|
|
|
|
</KeepAlive>
|
|
|
|
|
<component
|
|
|
|
|
:is="Component"
|
2026-02-27 16:04:01 +08:00
|
|
|
v-else-if="showComponent(route)"
|
2025-05-18 10:33:02 +08:00
|
|
|
:key="getTabKey(route)"
|
2025-04-08 20:27:03 +08:00
|
|
|
/>
|
|
|
|
|
</template>
|
2024-06-23 19:39:44 +08:00
|
|
|
</RouterView>
|
|
|
|
|
</div>
|
2024-05-19 21:20:42 +08:00
|
|
|
</template>
|