content.vue 1.7 KB

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