Commit f4621cc66411d8ff4ca852b548a79cd3da9be1ce
1 parent
0c2e72d2
perf: perf loading logic
Showing
25 changed files
with
131 additions
and
182 deletions
CHANGELOG.zh_CN.md
@@ -11,6 +11,10 @@ | @@ -11,6 +11,10 @@ | ||
11 | - i18n 支持 vscode `i18n-ally`插件 | 11 | - i18n 支持 vscode `i18n-ally`插件 |
12 | - 新增多级路由缓存示例 | 12 | - 新增多级路由缓存示例 |
13 | 13 | ||
14 | +### ⚡ Performance Improvements | ||
15 | + | ||
16 | +- 页面切换 loading 逻辑修改。对于已经加载过的页面不管有没有关闭,再次打开不会在显示 loading(已经打开过的页面在此打开速度比较快),刷新后恢复。 | ||
17 | + | ||
14 | ### 🎫 Chores | 18 | ### 🎫 Chores |
15 | 19 | ||
16 | - 首屏 loading 修改 | 20 | - 首屏 loading 修改 |
src/components/Loading/src/index.vue
src/hooks/setting/useMultipleTabSetting.ts
@@ -7,8 +7,6 @@ import { appStore } from '/@/store/modules/app'; | @@ -7,8 +7,6 @@ import { appStore } from '/@/store/modules/app'; | ||
7 | export function useMultipleTabSetting() { | 7 | export function useMultipleTabSetting() { |
8 | const getMultipleTabSetting = computed(() => appStore.getProjectConfig.multiTabsSetting); | 8 | const getMultipleTabSetting = computed(() => appStore.getProjectConfig.multiTabsSetting); |
9 | 9 | ||
10 | - const getMax = computed(() => unref(getMultipleTabSetting).max); | ||
11 | - | ||
12 | const getShowMultipleTab = computed(() => unref(getMultipleTabSetting).show); | 10 | const getShowMultipleTab = computed(() => unref(getMultipleTabSetting).show); |
13 | 11 | ||
14 | const getShowQuick = computed(() => unref(getMultipleTabSetting).showQuick); | 12 | const getShowQuick = computed(() => unref(getMultipleTabSetting).showQuick); |
@@ -21,7 +19,6 @@ export function useMultipleTabSetting() { | @@ -21,7 +19,6 @@ export function useMultipleTabSetting() { | ||
21 | setMultipleTabSetting, | 19 | setMultipleTabSetting, |
22 | 20 | ||
23 | getMultipleTabSetting, | 21 | getMultipleTabSetting, |
24 | - getMax, | ||
25 | getShowMultipleTab, | 22 | getShowMultipleTab, |
26 | getShowQuick, | 23 | getShowQuick, |
27 | }; | 24 | }; |
src/hooks/setting/useTransitionSetting.ts
@@ -11,8 +11,8 @@ export function useTransitionSetting() { | @@ -11,8 +11,8 @@ export function useTransitionSetting() { | ||
11 | 11 | ||
12 | const getOpenNProgress = computed(() => unref(getTransitionSetting)?.openNProgress); | 12 | const getOpenNProgress = computed(() => unref(getTransitionSetting)?.openNProgress); |
13 | 13 | ||
14 | - const getOpenPageLoading = computed(() => { | ||
15 | - return unref(getTransitionSetting)?.openPageLoading && unref(getEnableTransition); | 14 | + const getOpenPageLoading = computed((): boolean => { |
15 | + return !!unref(getTransitionSetting)?.openPageLoading; | ||
16 | }); | 16 | }); |
17 | 17 | ||
18 | const getBasicTransition = computed(() => unref(getTransitionSetting)?.basicTransition); | 18 | const getBasicTransition = computed(() => unref(getTransitionSetting)?.basicTransition); |
src/hooks/web/usePage.ts
@@ -11,10 +11,7 @@ export type RouteLocationRawEx = Omit<RouteLocationRaw, 'path'> & { path: PageEn | @@ -11,10 +11,7 @@ export type RouteLocationRawEx = Omit<RouteLocationRaw, 'path'> & { path: PageEn | ||
11 | 11 | ||
12 | function handleError(e: Error) { | 12 | function handleError(e: Error) { |
13 | console.error(e); | 13 | console.error(e); |
14 | - // 101是为了 大于 打开时候设置的100延时防止闪动 | ||
15 | - setTimeout(() => { | ||
16 | - appStore.commitPageLoadingState(false); | ||
17 | - }, 101); | 14 | + appStore.commitPageLoadingState(false); |
18 | } | 15 | } |
19 | 16 | ||
20 | // page switch | 17 | // page switch |
src/layouts/default/content/index.less
src/layouts/default/content/index.tsx
@@ -5,7 +5,7 @@ import { Loading } from '/@/components/Loading'; | @@ -5,7 +5,7 @@ import { Loading } from '/@/components/Loading'; | ||
5 | 5 | ||
6 | import { useRootSetting } from '/@/hooks/setting/useRootSetting'; | 6 | import { useRootSetting } from '/@/hooks/setting/useRootSetting'; |
7 | import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting'; | 7 | import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting'; |
8 | -import PageLayout from '/@/layouts/page/index.vue'; | 8 | +import PageLayout from '/@/layouts/page/index'; |
9 | export default defineComponent({ | 9 | export default defineComponent({ |
10 | name: 'LayoutContent', | 10 | name: 'LayoutContent', |
11 | setup() { | 11 | setup() { |
@@ -16,7 +16,12 @@ export default defineComponent({ | @@ -16,7 +16,12 @@ export default defineComponent({ | ||
16 | return ( | 16 | return ( |
17 | <div class={['layout-content', unref(getLayoutContentMode)]}> | 17 | <div class={['layout-content', unref(getLayoutContentMode)]}> |
18 | {unref(getOpenPageLoading) && ( | 18 | {unref(getOpenPageLoading) && ( |
19 | - <Loading loading={unref(getPageLoading)} absolute class="layout-content__loading" /> | 19 | + <Loading |
20 | + loading={unref(getPageLoading)} | ||
21 | + background="rgba(240, 242, 245, 0.6)" | ||
22 | + absolute | ||
23 | + class="layout-content__loading" | ||
24 | + /> | ||
20 | )} | 25 | )} |
21 | <PageLayout /> | 26 | <PageLayout /> |
22 | </div> | 27 | </div> |
src/layouts/default/setting/SettingDrawer.tsx
@@ -465,7 +465,6 @@ export default defineComponent({ | @@ -465,7 +465,6 @@ export default defineComponent({ | ||
465 | baseHandler(HandlerEnum.OPEN_PAGE_LOADING, e); | 465 | baseHandler(HandlerEnum.OPEN_PAGE_LOADING, e); |
466 | }, | 466 | }, |
467 | def: unref(getOpenPageLoading), | 467 | def: unref(getOpenPageLoading), |
468 | - disabled: !unref(getEnableTransition), | ||
469 | })} | 468 | })} |
470 | 469 | ||
471 | {renderSwitchItem(t('layout.setting.switchAnimation'), { | 470 | {renderSwitchItem(t('layout.setting.switchAnimation'), { |
src/layouts/parent/index.vue renamed to src/layouts/page/ParentView.vue
@@ -4,23 +4,18 @@ | @@ -4,23 +4,18 @@ | ||
4 | <template> | 4 | <template> |
5 | <div> | 5 | <div> |
6 | <router-view> | 6 | <router-view> |
7 | - <template #default="{ Component, route }"> | ||
8 | - <transition v-bind="transitionEvent" :name="getName(route)" mode="out-in" appear> | ||
9 | - <keep-alive v-if="openCache" :include="getCaches"> | ||
10 | - <component :max="getMax" :is="Component" :key="route.fullPath" /> | ||
11 | - </keep-alive> | ||
12 | - <component v-else :max="getMax" :is="Component" :key="route.fullPath" /> | ||
13 | - </transition> | 7 | + <template v-slot="{ Component, route }"> |
8 | + <keep-alive v-if="openCache" :include="getCaches"> | ||
9 | + <component :is="Component" :key="route.fullPath" /> | ||
10 | + </keep-alive> | ||
11 | + <component v-else :is="Component" :key="route.fullPath" /> | ||
14 | </template> | 12 | </template> |
15 | </router-view> | 13 | </router-view> |
16 | </div> | 14 | </div> |
17 | </template> | 15 | </template> |
18 | <script lang="ts"> | 16 | <script lang="ts"> |
19 | import { computed, defineComponent, unref } from 'vue'; | 17 | import { computed, defineComponent, unref } from 'vue'; |
20 | - import { RouteLocationNormalized } from 'vue-router'; | ||
21 | 18 | ||
22 | - import { useTransition } from './useTransition'; | ||
23 | - import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; | ||
24 | import { useRootSetting } from '/@/hooks/setting/useRootSetting'; | 19 | import { useRootSetting } from '/@/hooks/setting/useRootSetting'; |
25 | import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting'; | 20 | import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting'; |
26 | 21 | ||
@@ -28,43 +23,20 @@ | @@ -28,43 +23,20 @@ | ||
28 | import { useCache } from './useCache'; | 23 | import { useCache } from './useCache'; |
29 | 24 | ||
30 | export default defineComponent({ | 25 | export default defineComponent({ |
31 | - props: { | ||
32 | - isPage: { | ||
33 | - type: Boolean, | ||
34 | - }, | ||
35 | - }, | ||
36 | - setup(props) { | ||
37 | - const { getCaches } = useCache(props.isPage); | 26 | + setup() { |
27 | + const { getCaches } = useCache(false); | ||
38 | 28 | ||
39 | - const { getShowMenu } = useMenuSetting(); | 29 | + const { getShowMultipleTab } = useMultipleTabSetting(); |
40 | 30 | ||
41 | const { getOpenKeepAlive } = useRootSetting(); | 31 | const { getOpenKeepAlive } = useRootSetting(); |
42 | 32 | ||
43 | const { getBasicTransition, getEnableTransition } = useTransitionSetting(); | 33 | const { getBasicTransition, getEnableTransition } = useTransitionSetting(); |
44 | 34 | ||
45 | - const { getMax } = useMultipleTabSetting(); | ||
46 | - | ||
47 | - const transitionEvent = useTransition(); | ||
48 | - | ||
49 | - const openCache = computed(() => unref(getOpenKeepAlive) && unref(getShowMenu)); | ||
50 | - | ||
51 | - function getName(route: RouteLocationNormalized) { | ||
52 | - if (!unref(getEnableTransition)) { | ||
53 | - return null; | ||
54 | - } | ||
55 | - const cacheTabs = unref(getCaches); | ||
56 | - const isInCache = cacheTabs.includes(route.name as string); | ||
57 | - const name = isInCache && route.meta.inTab ? 'fade-slide' : null; | ||
58 | - | ||
59 | - return name || route.meta.transitionName || unref(getBasicTransition); | ||
60 | - } | 35 | + const openCache = computed(() => unref(getOpenKeepAlive) && unref(getShowMultipleTab)); |
61 | 36 | ||
62 | return { | 37 | return { |
63 | getCaches, | 38 | getCaches, |
64 | - getMax, | ||
65 | - transitionEvent, | ||
66 | getBasicTransition, | 39 | getBasicTransition, |
67 | - getName, | ||
68 | openCache, | 40 | openCache, |
69 | getEnableTransition, | 41 | getEnableTransition, |
70 | }; | 42 | }; |
src/layouts/page/index.tsx
0 → 100644
1 | +import type { FunctionalComponent } from 'vue'; | ||
2 | + | ||
3 | +import { computed, defineComponent, unref, Transition, KeepAlive } from 'vue'; | ||
4 | +import { RouterView, RouteLocation } from 'vue-router'; | ||
5 | + | ||
6 | +import FrameLayout from '/@/layouts/iframe/index.vue'; | ||
7 | + | ||
8 | +import { useRootSetting } from '/@/hooks/setting/useRootSetting'; | ||
9 | + | ||
10 | +import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting'; | ||
11 | +import { useCache } from './useCache'; | ||
12 | +import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting'; | ||
13 | + | ||
14 | +interface DefaultContext { | ||
15 | + Component: FunctionalComponent; | ||
16 | + route: RouteLocation; | ||
17 | +} | ||
18 | + | ||
19 | +export default defineComponent({ | ||
20 | + name: 'PageLayout', | ||
21 | + setup() { | ||
22 | + const { getCaches } = useCache(true); | ||
23 | + const { getShowMultipleTab } = useMultipleTabSetting(); | ||
24 | + | ||
25 | + const { getOpenKeepAlive, getCanEmbedIFramePage } = useRootSetting(); | ||
26 | + | ||
27 | + const { getBasicTransition, getEnableTransition } = useTransitionSetting(); | ||
28 | + | ||
29 | + const openCache = computed(() => unref(getOpenKeepAlive) && unref(getShowMultipleTab)); | ||
30 | + | ||
31 | + return () => { | ||
32 | + return ( | ||
33 | + <> | ||
34 | + <RouterView> | ||
35 | + {{ | ||
36 | + default: ({ Component, route }: DefaultContext) => { | ||
37 | + // No longer show animations that are already in the tab | ||
38 | + const cacheTabs = unref(getCaches); | ||
39 | + const isInCache = cacheTabs.includes(route.name as string); | ||
40 | + const name = | ||
41 | + isInCache && route.meta.loaded && unref(getEnableTransition) | ||
42 | + ? 'fade-slide' | ||
43 | + : null; | ||
44 | + | ||
45 | + const renderComp = () => <Component key={route.fullPath} />; | ||
46 | + | ||
47 | + const PageContent = unref(openCache) ? ( | ||
48 | + <KeepAlive>{renderComp()}</KeepAlive> | ||
49 | + ) : ( | ||
50 | + renderComp() | ||
51 | + ); | ||
52 | + | ||
53 | + return unref(getEnableTransition) ? ( | ||
54 | + <Transition | ||
55 | + name={name || route.meta.transitionName || unref(getBasicTransition)} | ||
56 | + mode="out-in" | ||
57 | + appear={true} | ||
58 | + > | ||
59 | + {() => PageContent} | ||
60 | + </Transition> | ||
61 | + ) : ( | ||
62 | + PageContent | ||
63 | + ); | ||
64 | + }, | ||
65 | + }} | ||
66 | + </RouterView> | ||
67 | + {unref(getCanEmbedIFramePage) && <FrameLayout />} | ||
68 | + </> | ||
69 | + ); | ||
70 | + }; | ||
71 | + }, | ||
72 | +}); |
src/layouts/page/index.vue deleted
100644 → 0
1 | -<template> | ||
2 | - <ParentLayout :isPage="true" /> | ||
3 | - <FrameLayout v-if="getCanEmbedIFramePage" /> | ||
4 | -</template> | ||
5 | -<script lang="ts"> | ||
6 | - import { defineComponent } from 'vue'; | ||
7 | - | ||
8 | - import FrameLayout from '/@/layouts/iframe/index.vue'; | ||
9 | - | ||
10 | - import { useRootSetting } from '/@/hooks/setting/useRootSetting'; | ||
11 | - | ||
12 | - import ParentLayout from '/@/layouts/parent/index.vue'; | ||
13 | - export default defineComponent({ | ||
14 | - components: { ParentLayout, FrameLayout }, | ||
15 | - setup() { | ||
16 | - const { getCanEmbedIFramePage } = useRootSetting(); | ||
17 | - | ||
18 | - return { getCanEmbedIFramePage }; | ||
19 | - }, | ||
20 | - }); | ||
21 | -</script> |
src/layouts/parent/useCache.ts renamed to src/layouts/page/useCache.ts
@@ -10,9 +10,8 @@ export function useCache(isPage: boolean) { | @@ -10,9 +10,8 @@ export function useCache(isPage: boolean) { | ||
10 | const name = ref(''); | 10 | const name = ref(''); |
11 | const { currentRoute } = useRouter(); | 11 | const { currentRoute } = useRouter(); |
12 | 12 | ||
13 | - tryTsxEmit((instance: any) => { | ||
14 | - const routeName = instance.ctx.$options.name; | ||
15 | - | 13 | + tryTsxEmit((instance) => { |
14 | + const routeName = instance.type.name; | ||
16 | if (routeName && ![ParentLayoutName].includes(routeName)) { | 15 | if (routeName && ![ParentLayoutName].includes(routeName)) { |
17 | name.value = routeName; | 16 | name.value = routeName; |
18 | } else { | 17 | } else { |
@@ -22,6 +21,7 @@ export function useCache(isPage: boolean) { | @@ -22,6 +21,7 @@ export function useCache(isPage: boolean) { | ||
22 | name.value = matched[len - 2].name as string; | 21 | name.value = matched[len - 2].name as string; |
23 | } | 22 | } |
24 | }); | 23 | }); |
24 | + | ||
25 | const { getOpenKeepAlive } = useRootSetting(); | 25 | const { getOpenKeepAlive } = useRootSetting(); |
26 | 26 | ||
27 | const getCaches = computed((): string[] => { | 27 | const getCaches = computed((): string[] => { |
src/layouts/parent/useTransition.ts deleted
100644 → 0
1 | -import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting'; | ||
2 | - | ||
3 | -import { appStore } from '/@/store/modules/app'; | ||
4 | -import { tryOnUnmounted } from '/@/utils/helper/vueHelper'; | ||
5 | - | ||
6 | -export function useTransition() { | ||
7 | - function handleAfterEnter() { | ||
8 | - const { getOpenPageLoading, getEnableTransition } = useTransitionSetting(); | ||
9 | - if (!getOpenPageLoading.value || !getEnableTransition.value) return; | ||
10 | - // Close loading after the route switching animation ends | ||
11 | - appStore.setPageLoadingAction(false); | ||
12 | - } | ||
13 | - | ||
14 | - tryOnUnmounted(() => { | ||
15 | - handleAfterEnter(); | ||
16 | - stop(); | ||
17 | - }); | ||
18 | - | ||
19 | - return { | ||
20 | - onAfterEnter: handleAfterEnter, | ||
21 | - }; | ||
22 | -} |
src/router/constant.ts
1 | import type { AppRouteRecordRaw } from '/@/router/types'; | 1 | import type { AppRouteRecordRaw } from '/@/router/types'; |
2 | -import ParentLayout from '/@/layouts/parent/index.vue'; | 2 | +import ParentLayout from '/@/layouts/page/ParentView.vue'; |
3 | 3 | ||
4 | const EXCEPTION_COMPONENT = () => import('../views/sys/exception/Exception'); | 4 | const EXCEPTION_COMPONENT = () => import('../views/sys/exception/Exception'); |
5 | 5 | ||
@@ -11,11 +11,6 @@ export const LAYOUT = () => import('/@/layouts/default/index'); | @@ -11,11 +11,6 @@ export const LAYOUT = () => import('/@/layouts/default/index'); | ||
11 | /** | 11 | /** |
12 | * @description: page-layout | 12 | * @description: page-layout |
13 | */ | 13 | */ |
14 | -export const PAGE_LAYOUT_COMPONENT = () => import('/@/layouts/page/index.vue'); | ||
15 | - | ||
16 | -/** | ||
17 | - * @description: page-layout | ||
18 | - */ | ||
19 | export const getParentLayout = (name: string) => { | 14 | export const getParentLayout = (name: string) => { |
20 | return () => | 15 | return () => |
21 | new Promise((resolve) => { | 16 | new Promise((resolve) => { |
src/router/guard/index.ts
1 | -import type { Router } from 'vue-router'; | 1 | +import { isNavigationFailure, Router } from 'vue-router'; |
2 | 2 | ||
3 | import { Modal, notification } from 'ant-design-vue'; | 3 | import { Modal, notification } from 'ant-design-vue'; |
4 | 4 | ||
@@ -8,7 +8,7 @@ import { createPageLoadingGuard } from './pageLoadingGuard'; | @@ -8,7 +8,7 @@ import { createPageLoadingGuard } from './pageLoadingGuard'; | ||
8 | 8 | ||
9 | import { useGlobSetting, useProjectSetting } from '/@/hooks/setting'; | 9 | import { useGlobSetting, useProjectSetting } from '/@/hooks/setting'; |
10 | 10 | ||
11 | -import { getIsOpenTab, getRoute } from '/@/router/helper/routeHelper'; | 11 | +import { getRoute } from '/@/router/helper/routeHelper'; |
12 | import { setTitle } from '/@/utils/browser'; | 12 | import { setTitle } from '/@/utils/browser'; |
13 | import { AxiosCanceler } from '/@/utils/http/axios/axiosCancel'; | 13 | import { AxiosCanceler } from '/@/utils/http/axios/axiosCancel'; |
14 | 14 | ||
@@ -24,13 +24,10 @@ export function createGuard(router: Router) { | @@ -24,13 +24,10 @@ export function createGuard(router: Router) { | ||
24 | if (removeAllHttpPending) { | 24 | if (removeAllHttpPending) { |
25 | axiosCanceler = new AxiosCanceler(); | 25 | axiosCanceler = new AxiosCanceler(); |
26 | } | 26 | } |
27 | + const loadedPageMap = new Map<string, boolean>(); | ||
27 | 28 | ||
28 | - createPageLoadingGuard(router); | ||
29 | router.beforeEach(async (to) => { | 29 | router.beforeEach(async (to) => { |
30 | - // Determine whether the tab has been opened | ||
31 | - const isOpen = getIsOpenTab(to.fullPath); | ||
32 | - to.meta.inTab = isOpen; | ||
33 | - | 30 | + to.meta.loaded = !!loadedPageMap.get(to.path); |
34 | // Notify routing changes | 31 | // Notify routing changes |
35 | tabStore.commitLastChangeRouteState(getRoute(to)); | 32 | tabStore.commitLastChangeRouteState(getRoute(to)); |
36 | 33 | ||
@@ -47,11 +44,17 @@ export function createGuard(router: Router) { | @@ -47,11 +44,17 @@ export function createGuard(router: Router) { | ||
47 | return true; | 44 | return true; |
48 | }); | 45 | }); |
49 | 46 | ||
50 | - router.afterEach((to) => { | 47 | + router.afterEach((to, from, failure) => { |
48 | + loadedPageMap.set(to.path, true); | ||
51 | const { t } = useI18n(); | 49 | const { t } = useI18n(); |
52 | // change html title | 50 | // change html title |
53 | to.name !== REDIRECT_NAME && setTitle(t(to.meta.title), globSetting.title); | 51 | to.name !== REDIRECT_NAME && setTitle(t(to.meta.title), globSetting.title); |
52 | + | ||
53 | + if (isNavigationFailure(failure)) { | ||
54 | + console.error('router navigation failed:', failure); | ||
55 | + } | ||
54 | }); | 56 | }); |
57 | + createPageLoadingGuard(router); | ||
55 | createProgressGuard(router); | 58 | createProgressGuard(router); |
56 | createPermissionGuard(router); | 59 | createPermissionGuard(router); |
57 | } | 60 | } |
src/router/guard/pageLoadingGuard.ts
1 | import type { Router } from 'vue-router'; | 1 | import type { Router } from 'vue-router'; |
2 | -import { tabStore } from '/@/store/modules/tab'; | ||
3 | import { appStore } from '/@/store/modules/app'; | 2 | import { appStore } from '/@/store/modules/app'; |
4 | import { userStore } from '/@/store/modules/user'; | 3 | import { userStore } from '/@/store/modules/user'; |
5 | -import { getParams } from '/@/router/helper/routeHelper'; | ||
6 | import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting'; | 4 | import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting'; |
7 | import { unref } from 'vue'; | 5 | import { unref } from 'vue'; |
8 | 6 | ||
9 | -const { getOpenPageLoading, getEnableTransition } = useTransitionSetting(); | 7 | +const { getOpenPageLoading } = useTransitionSetting(); |
10 | export function createPageLoadingGuard(router: Router) { | 8 | export function createPageLoadingGuard(router: Router) { |
11 | - let isFirstLoad = true; | ||
12 | router.beforeEach(async (to) => { | 9 | router.beforeEach(async (to) => { |
13 | - const { openKeepAlive, multiTabsSetting: { show } = {} } = appStore.getProjectConfig; | ||
14 | if (!userStore.getTokenState) { | 10 | if (!userStore.getTokenState) { |
15 | return true; | 11 | return true; |
16 | } | 12 | } |
17 | - | ||
18 | - if (!unref(getEnableTransition) && unref(getOpenPageLoading)) { | ||
19 | - appStore.commitPageLoadingState(true); | 13 | + if (to.meta.loaded) { |
20 | return true; | 14 | return true; |
21 | } | 15 | } |
22 | 16 | ||
23 | - if (show && openKeepAlive && !isFirstLoad) { | ||
24 | - const tabList = tabStore.getTabsState; | ||
25 | - | ||
26 | - const isOpen = tabList.some((tab) => tab.path === to.path); | ||
27 | - appStore.setPageLoadingAction(!isOpen); | ||
28 | - } else { | 17 | + if (unref(getOpenPageLoading)) { |
29 | appStore.setPageLoadingAction(true); | 18 | appStore.setPageLoadingAction(true); |
19 | + return true; | ||
30 | } | 20 | } |
21 | + | ||
31 | return true; | 22 | return true; |
32 | }); | 23 | }); |
33 | - router.afterEach(async (to, from) => { | ||
34 | - const realToPath = to.path.replace(getParams(to), ''); | ||
35 | - const realFormPath = from.path.replace(getParams(from), ''); | ||
36 | - if ( | ||
37 | - (!unref(getEnableTransition) && unref(getOpenPageLoading)) || | ||
38 | - isFirstLoad || | ||
39 | - to.meta.afterCloseLoading || | ||
40 | - realToPath === realFormPath | ||
41 | - ) { | 24 | + router.afterEach(async () => { |
25 | + if (unref(getOpenPageLoading)) { | ||
42 | setTimeout(() => { | 26 | setTimeout(() => { |
43 | appStore.commitPageLoadingState(false); | 27 | appStore.commitPageLoadingState(false); |
44 | - }, 110); | ||
45 | - isFirstLoad = false; | 28 | + }, 300); |
46 | } | 29 | } |
47 | - | ||
48 | return true; | 30 | return true; |
49 | }); | 31 | }); |
50 | } | 32 | } |
src/router/guard/progressGuard.ts
@@ -10,12 +10,14 @@ const { getOpenNProgress } = useTransitionSetting(); | @@ -10,12 +10,14 @@ const { getOpenNProgress } = useTransitionSetting(); | ||
10 | 10 | ||
11 | export function createProgressGuard(router: Router) { | 11 | export function createProgressGuard(router: Router) { |
12 | router.beforeEach(async (to) => { | 12 | router.beforeEach(async (to) => { |
13 | - !to.meta.inTab && unref(getOpenNProgress) && NProgress.start(); | 13 | + if (to.meta.loaded) return true; |
14 | + unref(getOpenNProgress) && NProgress.start(); | ||
14 | return true; | 15 | return true; |
15 | }); | 16 | }); |
16 | 17 | ||
17 | router.afterEach(async (to) => { | 18 | router.afterEach(async (to) => { |
18 | - !to.meta.inTab && unref(getOpenNProgress) && NProgress.done(); | 19 | + if (to.meta.loaded) return true; |
20 | + unref(getOpenNProgress) && NProgress.done(); | ||
19 | return true; | 21 | return true; |
20 | }); | 22 | }); |
21 | } | 23 | } |
src/router/helper/routeHelper.ts
1 | import type { AppRouteModule, AppRouteRecordRaw } from '/@/router/types'; | 1 | import type { AppRouteModule, AppRouteRecordRaw } from '/@/router/types'; |
2 | import type { RouteLocationNormalized, RouteRecordNormalized } from 'vue-router'; | 2 | import type { RouteLocationNormalized, RouteRecordNormalized } from 'vue-router'; |
3 | 3 | ||
4 | -import { appStore } from '/@/store/modules/app'; | ||
5 | -import { tabStore } from '/@/store/modules/tab'; | ||
6 | import { getParentLayout, LAYOUT } from '/@/router/constant'; | 4 | import { getParentLayout, LAYOUT } from '/@/router/constant'; |
7 | import dynamicImport from './dynamicImport'; | 5 | import dynamicImport from './dynamicImport'; |
8 | import { cloneDeep } from 'lodash-es'; | 6 | import { cloneDeep } from 'lodash-es'; |
@@ -48,20 +46,6 @@ export function transformObjToRoute<T = AppRouteModule>(routeList: AppRouteModul | @@ -48,20 +46,6 @@ export function transformObjToRoute<T = AppRouteModule>(routeList: AppRouteModul | ||
48 | return (routeList as unknown) as T[]; | 46 | return (routeList as unknown) as T[]; |
49 | } | 47 | } |
50 | 48 | ||
51 | -/** | ||
52 | - * Determine whether the tab has been opened | ||
53 | - * @param toPath | ||
54 | - */ | ||
55 | -export function getIsOpenTab(toPath: string) { | ||
56 | - const { openKeepAlive, multiTabsSetting: { show } = {} } = appStore.getProjectConfig; | ||
57 | - | ||
58 | - if (show && openKeepAlive) { | ||
59 | - const tabList = tabStore.getTabsState; | ||
60 | - return tabList.some((tab) => tab.path === toPath); | ||
61 | - } | ||
62 | - return false; | ||
63 | -} | ||
64 | - | ||
65 | export function getParams(data: any = {}) { | 49 | export function getParams(data: any = {}) { |
66 | const { params = {} } = data; | 50 | const { params = {} } = data; |
67 | let ret = ''; | 51 | let ret = ''; |
src/router/index.ts
@@ -33,4 +33,8 @@ export function setupRouter(app: App<Element>) { | @@ -33,4 +33,8 @@ export function setupRouter(app: App<Element>) { | ||
33 | createGuard(router); | 33 | createGuard(router); |
34 | } | 34 | } |
35 | 35 | ||
36 | +router.onError((error) => { | ||
37 | + console.error(error); | ||
38 | +}); | ||
39 | + | ||
36 | export default router; | 40 | export default router; |
src/router/types.d.ts
@@ -27,8 +27,6 @@ export interface RouteMeta { | @@ -27,8 +27,6 @@ export interface RouteMeta { | ||
27 | 27 | ||
28 | // close loading | 28 | // close loading |
29 | afterCloseLoading?: boolean; | 29 | afterCloseLoading?: boolean; |
30 | - // Is it in the tab | ||
31 | - inTab?: boolean; | ||
32 | // Carrying parameters | 30 | // Carrying parameters |
33 | carryParam?: boolean; | 31 | carryParam?: boolean; |
34 | 32 |
src/settings/projectSetting.ts
@@ -119,8 +119,6 @@ const setting: ProjectConfig = { | @@ -119,8 +119,6 @@ const setting: ProjectConfig = { | ||
119 | canDrag: true, | 119 | canDrag: true, |
120 | // Turn on quick actions | 120 | // Turn on quick actions |
121 | showQuick: true, | 121 | showQuick: true, |
122 | - // Maximum number of tab cache | ||
123 | - max: 12, | ||
124 | }, | 122 | }, |
125 | 123 | ||
126 | // Transition Setting | 124 | // Transition Setting |
src/store/modules/app.ts
@@ -105,7 +105,7 @@ class App extends VuexModule { | @@ -105,7 +105,7 @@ class App extends VuexModule { | ||
105 | // Prevent flicker | 105 | // Prevent flicker |
106 | timeId = setTimeout(() => { | 106 | timeId = setTimeout(() => { |
107 | this.commitPageLoadingState(loading); | 107 | this.commitPageLoadingState(loading); |
108 | - }, 100); | 108 | + }, 50); |
109 | } else { | 109 | } else { |
110 | this.commitPageLoadingState(loading); | 110 | this.commitPageLoadingState(loading); |
111 | clearTimeout(timeId); | 111 | clearTimeout(timeId); |
src/store/modules/user.ts
1 | -import { appStore } from './app'; | ||
2 | import type { | 1 | import type { |
3 | LoginParams, | 2 | LoginParams, |
4 | GetUserInfoByUserIdModel, | 3 | GetUserInfoByUserIdModel, |
@@ -107,12 +106,7 @@ class User extends VuexModule { | @@ -107,12 +106,7 @@ class User extends VuexModule { | ||
107 | 106 | ||
108 | // const name = FULL_PAGE_NOT_FOUND_ROUTE.name; | 107 | // const name = FULL_PAGE_NOT_FOUND_ROUTE.name; |
109 | // name && router.removeRoute(name); | 108 | // name && router.removeRoute(name); |
110 | - goHome && | ||
111 | - (await router.push(PageEnum.BASE_HOME).then(() => { | ||
112 | - setTimeout(() => { | ||
113 | - appStore.commitPageLoadingState(false); | ||
114 | - }, 30); | ||
115 | - })); | 109 | + goHome && router.push(PageEnum.BASE_HOME); |
116 | return userInfo; | 110 | return userInfo; |
117 | } catch (error) { | 111 | } catch (error) { |
118 | return null; | 112 | return null; |
src/types/config.d.ts
@@ -29,8 +29,6 @@ export interface MultiTabsSetting { | @@ -29,8 +29,6 @@ export interface MultiTabsSetting { | ||
29 | // 开启快速操作 | 29 | // 开启快速操作 |
30 | showQuick: boolean; | 30 | showQuick: boolean; |
31 | canDrag: boolean; | 31 | canDrag: boolean; |
32 | - // 缓存最大数量 | ||
33 | - max: number; | ||
34 | } | 32 | } |
35 | 33 | ||
36 | export interface HeaderSetting { | 34 | export interface HeaderSetting { |
src/views/sys/redirect/index.vue
@@ -4,15 +4,11 @@ | @@ -4,15 +4,11 @@ | ||
4 | <script lang="ts"> | 4 | <script lang="ts"> |
5 | import { defineComponent, unref } from 'vue'; | 5 | import { defineComponent, unref } from 'vue'; |
6 | 6 | ||
7 | - import { appStore } from '/@/store/modules/app'; | ||
8 | - | ||
9 | import { useRouter } from 'vue-router'; | 7 | import { useRouter } from 'vue-router'; |
10 | - import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting'; | ||
11 | export default defineComponent({ | 8 | export default defineComponent({ |
12 | name: 'Redirect', | 9 | name: 'Redirect', |
13 | setup() { | 10 | setup() { |
14 | const { currentRoute, replace } = useRouter(); | 11 | const { currentRoute, replace } = useRouter(); |
15 | - const { getOpenPageLoading, getEnableTransition } = useTransitionSetting(); | ||
16 | 12 | ||
17 | const { params, query } = unref(currentRoute); | 13 | const { params, query } = unref(currentRoute); |
18 | const { path } = params; | 14 | const { path } = params; |
@@ -21,12 +17,7 @@ | @@ -21,12 +17,7 @@ | ||
21 | path: '/' + _path, | 17 | path: '/' + _path, |
22 | query, | 18 | query, |
23 | }); | 19 | }); |
24 | - // close loading | ||
25 | - if (unref(getEnableTransition) && unref(getOpenPageLoading)) { | ||
26 | - setTimeout(() => { | ||
27 | - appStore.setPageLoadingAction(false); | ||
28 | - }, 0); | ||
29 | - } | 20 | + |
30 | return {}; | 21 | return {}; |
31 | }, | 22 | }, |
32 | }); | 23 | }); |