fix(transition): fix transition not work
| | |
| | | import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent'; |
| | | export const Loading = createAsyncComponent(() => import('./src/index.vue')); |
| | | // import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent'; |
| | | // export const Loading = createAsyncComponent(() => import('./src/index.vue')); |
| | | |
| | | import Loading from './src/index.vue'; |
| | | |
| | | export { Loading }; |
| | | export { useLoading } from './src/useLoading'; |
| | | export { createLoading } from './src/createLoading'; |
| | |
| | | }, |
| | | { |
| | | immediate: true, |
| | | deep: true, |
| | | } |
| | | ); |
| | | } |
| | |
| | | const { prefixCls } = useDesign('layout-content'); |
| | | const { getOpenPageLoading } = useTransitionSetting(); |
| | | const { getLayoutContentMode, getPageLoading } = useRootSetting(); |
| | | |
| | | return { |
| | | prefixCls, |
| | | getOpenPageLoading, |
| | |
| | | <template> |
| | | <div> |
| | | <div v-if="showFrame"> |
| | | <template v-for="frame in getFramePages" :key="frame.path"> |
| | | <FramePage |
| | | v-if="frame.meta.frameSrc && hasRenderFrame(frame.name)" |
| | |
| | | </div> |
| | | </template> |
| | | <script lang="ts"> |
| | | import { defineComponent } from 'vue'; |
| | | import { defineComponent, unref, computed } from 'vue'; |
| | | import FramePage from '/@/views/sys/iframe/index.vue'; |
| | | |
| | | import { useFrameKeepAlive } from './useFrameKeepAlive'; |
| | |
| | | name: 'FrameLayout', |
| | | components: { FramePage }, |
| | | setup() { |
| | | return { ...useFrameKeepAlive() }; |
| | | const { getFramePages, hasRenderFrame, showIframe } = useFrameKeepAlive(); |
| | | |
| | | const showFrame = computed(() => { |
| | | return unref(getFramePages).length > 0; |
| | | }); |
| | | |
| | | return { getFramePages, hasRenderFrame, showIframe, showFrame }; |
| | | }, |
| | | }); |
| | | </script> |
| | |
| | | <div> |
| | | <router-view> |
| | | <template v-slot="{ Component, route }"> |
| | | <keep-alive v-if="openCache" :include="getCaches"> |
| | | <component :is="Component" :key="route.fullPath" /> |
| | | </keep-alive> |
| | | <component v-else :is="Component" :key="route.fullPath" /> |
| | | <transition |
| | | :name=" |
| | | getTransitionName({ |
| | | route, |
| | | openCache: openCache, |
| | | enableTransition: getEnableTransition, |
| | | cacheTabs: getCaches, |
| | | def: getBasicTransition, |
| | | }) |
| | | " |
| | | mode="out-in" |
| | | appear |
| | | > |
| | | <keep-alive v-if="openCache" :include="getCaches"> |
| | | <component :is="Component" :key="route.fullPath" /> |
| | | </keep-alive> |
| | | <component v-else :is="Component" :key="route.fullPath" /> |
| | | </transition> |
| | | </template> |
| | | </router-view> |
| | | </div> |
| | |
| | | |
| | | import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting'; |
| | | import { useCache } from './useCache'; |
| | | import { getTransitionName } from './transition'; |
| | | |
| | | export default defineComponent({ |
| | | parentView: true, |
| | |
| | | getBasicTransition, |
| | | openCache, |
| | | getEnableTransition, |
| | | getTransitionName, |
| | | }; |
| | | }, |
| | | }); |
| | |
| | | import type { FunctionalComponent } from 'vue'; |
| | | import type { DefaultContext } from './transition'; |
| | | |
| | | import { computed, defineComponent, unref, Transition, KeepAlive } from 'vue'; |
| | | import { RouterView, RouteLocation } from 'vue-router'; |
| | |
| | | import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting'; |
| | | import { useCache } from './useCache'; |
| | | import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting'; |
| | | import { getTransitionName } from './transition'; |
| | | // import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent'; |
| | | |
| | | interface DefaultContext { |
| | |
| | | |
| | | return () => { |
| | | return ( |
| | | <div> |
| | | <> |
| | | <RouterView> |
| | | {{ |
| | | default: ({ Component, route }: DefaultContext) => { |
| | | // No longer show animations that are already in the tab |
| | | const cacheTabs = unref(getCaches); |
| | | const isInCache = cacheTabs.includes(route.name as string); |
| | | const name = |
| | | isInCache && route.meta.loaded && unref(getEnableTransition) |
| | | ? 'fade-slide' |
| | | : null; |
| | | |
| | | const name = getTransitionName({ |
| | | route, |
| | | openCache: unref(openCache), |
| | | enableTransition: unref(getEnableTransition), |
| | | cacheTabs, |
| | | def: unref(getBasicTransition), |
| | | }); |
| | | |
| | | // When the child element is the parentView, adding the key will cause the component to be executed multiple times. When it is not parentView, you need to add a key, because it needs to be compatible with the same route carrying different parameters |
| | | const isParentView = Component?.type.parentView; |
| | |
| | | return PageContent; |
| | | } |
| | | return ( |
| | | <Transition |
| | | name={name || route.meta.transitionName || unref(getBasicTransition)} |
| | | mode="out-in" |
| | | appear={true} |
| | | > |
| | | <Transition name={name} mode="out-in" appear={true}> |
| | | {() => PageContent} |
| | | </Transition> |
| | | ); |
| | |
| | | }} |
| | | </RouterView> |
| | | {unref(getCanEmbedIFramePage) && <FrameLayout />} |
| | | </div> |
| | | </> |
| | | ); |
| | | }; |
| | | }, |
New file |
| | |
| | | import type { FunctionalComponent } from 'vue'; |
| | | import type { RouteLocation } from 'vue-router'; |
| | | |
| | | export interface DefaultContext { |
| | | Component: FunctionalComponent & { type: Indexable }; |
| | | route: RouteLocation; |
| | | } |
| | | |
| | | export function getTransitionName({ |
| | | route, |
| | | openCache, |
| | | cacheTabs, |
| | | enableTransition, |
| | | def, |
| | | }: Pick<DefaultContext, 'route'> & { |
| | | enableTransition: boolean; |
| | | openCache: boolean; |
| | | def: string; |
| | | cacheTabs: string[]; |
| | | }) { |
| | | const isInCache = cacheTabs.includes(route.name as string); |
| | | const transitionName = 'fade-slide'; |
| | | let name: string | null = transitionName; |
| | | |
| | | if (openCache) { |
| | | name = isInCache && route.meta.loaded && enableTransition ? transitionName : null; |
| | | } |
| | | return name || route.meta.transitionName || def; |
| | | } |
| | |
| | | |
| | | export function createGuard(router: Router) { |
| | | createPageGuard(router); |
| | | createPageLoadingGuard(router); |
| | | createHttpGuard(router); |
| | | createScrollGuard(router); |
| | | createMessageGuard(router); |
| | | createTitleGuard(router); |
| | | createPageLoadingGuard(router); |
| | | createProgressGuard(router); |
| | | createPermissionGuard(router); |
| | | } |