content.vue 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <script lang="ts" setup>
  2. import type { RouteLocationNormalizedLoaded } from 'vue-router';
  3. import { preferences, usePreferences } from '@vben-core/preferences';
  4. import { Spinner } from '@vben-core/shadcn-ui';
  5. import { storeToRefs, useTabsStore } from '@vben-core/stores';
  6. import { IFrameRouterView } from '../../iframe';
  7. import { useContentSpinner } from './use-content-spinner';
  8. defineOptions({ name: 'LayoutContent' });
  9. const { keepAlive } = usePreferences();
  10. const tabsStore = useTabsStore();
  11. const { onTransitionEnd, spinning } = useContentSpinner();
  12. const { getCacheTabs, getExcludeTabs, renderRouteView } =
  13. storeToRefs(tabsStore);
  14. // 页面切换动画
  15. function getTransitionName(route: RouteLocationNormalizedLoaded) {
  16. // 如果偏好设置未设置,则不使用动画
  17. const { tabbar, transition } = preferences;
  18. const transitionName = transition.name;
  19. if (!transitionName || !transition.enable) {
  20. return;
  21. }
  22. // 标签页未启用或者未开启缓存,则使用全局配置动画
  23. if (!tabbar.enable || !keepAlive) {
  24. return transitionName;
  25. }
  26. // 如果页面已经加载过,则不使用动画
  27. // if (route.meta.loaded) {
  28. // return;
  29. // }
  30. // 已经打开且已经加载过的页面不使用动画
  31. const inTabs = getCacheTabs.value.includes(route.name as string);
  32. return inTabs && route.meta.loaded ? undefined : transitionName;
  33. }
  34. </script>
  35. <template>
  36. <div class="relative h-full">
  37. <Spinner
  38. v-if="preferences.transition.loading"
  39. :spinning="spinning"
  40. class="h-[var(--vben-content-client-height)]"
  41. />
  42. <IFrameRouterView />
  43. <RouterView v-slot="{ Component, route }">
  44. <Transition
  45. :name="getTransitionName(route)"
  46. appear
  47. mode="out-in"
  48. @transitionend="onTransitionEnd"
  49. >
  50. <KeepAlive
  51. v-if="keepAlive"
  52. :exclude="getExcludeTabs"
  53. :include="getCacheTabs"
  54. >
  55. <component
  56. :is="Component"
  57. v-if="renderRouteView"
  58. v-show="!route.meta.iframeSrc"
  59. :key="route.fullPath"
  60. />
  61. </KeepAlive>
  62. <component :is="Component" v-else :key="route.fullPath" />
  63. </Transition>
  64. </RouterView>
  65. </div>
  66. </template>