diff --git a/src/design/transition/base.less b/src/design/transition/base.less index c5edb8c60ab..34786e77363 100644 --- a/src/design/transition/base.less +++ b/src/design/transition/base.less @@ -1,11 +1,11 @@ .transition-default() { &-enter-active, &-leave-active { - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1) !important; + transition: 0.2s cubic-bezier(0.25, 0.8, 0.5, 1) !important; } &-move { - transition: transform 0.6s; + transition: transform 0.5s; } } diff --git a/src/design/transition/breadcrumb.less b/src/design/transition/breadcrumb.less index 677f73057cb..5b75b1f2c0d 100644 --- a/src/design/transition/breadcrumb.less +++ b/src/design/transition/breadcrumb.less @@ -1,6 +1,6 @@ .breadcrumb-enter-active, .breadcrumb-leave-active { - transition: all 0.38s; + transition: all 0.24s; } .breadcrumb-enter-from, diff --git a/src/design/transition/fade.less b/src/design/transition/fade.less index f97589ca4ce..ebb0cec00e0 100644 --- a/src/design/transition/fade.less +++ b/src/design/transition/fade.less @@ -1,6 +1,6 @@ .fade-enter-active, .fade-leave-active { - transition: opacity 0.28s ease-in-out; + transition: opacity 0.2s ease-in-out; } .fade-enter-from, @@ -11,7 +11,7 @@ // side-fade .slide-fade-enter-active, .slide-fade-leave-active { - transition: opacity 0.35s, transform 0.4s; + transition: opacity 0.3s, transform 0.35s; } .slide-enter-from, @@ -32,7 +32,7 @@ // Speed: 1x .fade-bottom-enter-active, .fade-bottom-leave-active { - transition: opacity 0.3s, transform 0.35s; + transition: opacity 0.2s, transform 0.25s; } .fade-bottom-enter-from, @@ -53,7 +53,7 @@ // Speed: 1x .fade-top-enter-active, .fade-top-leave-active { - transition: opacity 0.3s, transform 0.35s; + transition: opacity 0.2s, transform 0.25s; } .fade-top-enter-from { diff --git a/src/design/transition/zoom.less b/src/design/transition/zoom.less index 38e5cb5a546..1fb7295d3b8 100644 --- a/src/design/transition/zoom.less +++ b/src/design/transition/zoom.less @@ -1,7 +1,7 @@ // zoom-out .zoom-out-enter-active, .zoom-out-leave-active { - transition: opacity 0.35s ease-in-out, transform 0.45s ease-out; + transition: opacity 0.2 ease-in-out, transform 0.2s ease-out; } .zoom-out-enter-from, @@ -13,7 +13,7 @@ // zoom-fade .zoom-fade-enter-active, .zoom-fade-leave-active { - transition: transform 0.35s, opacity 0.35s ease-out; + transition: transform 0.2s, opacity 0.2s ease-out; } .zoom-fade-enter-from { diff --git a/src/hooks/web/useTabs.ts b/src/hooks/web/useTabs.ts index a9d17e5ae3e..646bbbda8e6 100644 --- a/src/hooks/web/useTabs.ts +++ b/src/hooks/web/useTabs.ts @@ -1,5 +1,9 @@ +import { useTimeout } from '/@/hooks/core/useTimeout'; +import { PageEnum } from '/@/enums/pageEnum'; import { TabItem, tabStore } from '/@/store/modules/tab'; import { appStore } from '/@/store/modules/app'; +import router from '/@/router'; + type Fn = () => void; type RouteFn = (tabItem: TabItem) => void; @@ -66,5 +70,12 @@ export function useTabs() { closeOther: () => canIUseFn() && closeOther(tabStore.getCurrentTab), closeCurrent: () => canIUseFn() && closeCurrent(tabStore.getCurrentTab), resetCache: () => canIUseFn() && resetCache(), + addTab: (path: PageEnum, goTo = false) => { + useTimeout(() => { + tabStore.addTabByPathAction(path); + }, 0); + + goTo && router.push(path); + }, }; } diff --git a/src/layouts/default/LayoutMenu.tsx b/src/layouts/default/LayoutMenu.tsx index e323751c106..6e4c1df7127 100644 --- a/src/layouts/default/LayoutMenu.tsx +++ b/src/layouts/default/LayoutMenu.tsx @@ -5,7 +5,6 @@ import { computed, defineComponent, unref, ref, onMounted, watch } from 'vue'; import { BasicMenu } from '/@/components/Menu/index'; import Logo from '/@/layouts/Logo.vue'; -import { PageEnum } from '/@/enums/pageEnum'; import { MenuModeEnum, MenuSplitTyeEnum, MenuTypeEnum } from '/@/enums/menuEnum'; // store @@ -20,10 +19,11 @@ import { getFlatChildrenMenus, getCurrentParentPath, } from '/@/router/menus/index'; -import { useGo } from '/@/hooks/web/usePage'; import { useRouter } from 'vue-router'; import { useThrottle } from '/@/hooks/core/useThrottle'; import { permissionStore } from '/@/store/modules/permission'; +import { useTabs } from '/@/hooks/web/useTabs'; +import { PageEnum } from '/@/enums/pageEnum'; // import export default defineComponent({ @@ -54,6 +54,7 @@ export default defineComponent({ const menusRef = ref([]); const flatMenusRef = ref([]); const { currentRoute } = useRouter(); + const { addTab } = useTabs(); const getProjectConfigRef = computed(() => { return appStore.getProjectConfig; @@ -63,7 +64,6 @@ export default defineComponent({ return unref(getProjectConfigRef).menuSetting.mode === MenuModeEnum.HORIZONTAL; }); - const go = useGo(); onMounted(() => { genMenus(); }); @@ -144,7 +144,7 @@ export default defineComponent({ if (splitType === MenuSplitTyeEnum.TOP) { menuStore.commitCurrentTopSplitMenuPathState(path); } - go(path as PageEnum); + addTab(path as PageEnum, true); } } diff --git a/src/layouts/default/multitabs/index.tsx b/src/layouts/default/multitabs/index.tsx index 0bf394e3629..6f923bb3fb6 100644 --- a/src/layouts/default/multitabs/index.tsx +++ b/src/layouts/default/multitabs/index.tsx @@ -2,7 +2,7 @@ import type { TabContentProps } from './tab.data'; import type { TabItem } from '/@/store/modules/tab'; import type { AppRouteRecordRaw } from '/@/router/types'; -import { defineComponent, watch, computed, ref, unref } from 'vue'; +import { defineComponent, watch, computed, ref, unref, onMounted } from 'vue'; import { Tabs } from 'ant-design-vue'; import TabContent from './TabContent'; @@ -16,12 +16,21 @@ import './index.less'; import { tabStore } from '/@/store/modules/tab'; import { closeTab } from './useTabDropdown'; import router from '/@/router'; +import { useTabs } from '/@/hooks/web/useTabs'; +import { PageEnum } from '/@/enums/pageEnum'; + export default defineComponent({ name: 'MultiTabs', setup() { let isAddAffix = false; const go = useGo(); const { currentRoute } = useRouter(); + + onMounted(() => { + const { addTab } = useTabs(); + addTab(unref(currentRoute).path as PageEnum); + }); + // 当前激活tab const activeKeyRef = ref(''); // 当前tab列表 @@ -38,7 +47,9 @@ export default defineComponent({ } activeKeyRef.value = path; - tabStore.commitAddTab((unref(currentRoute) as unknown) as AppRouteRecordRaw); + // 监听路由的话虽然可以,但是路由切换的时间会造成卡顿现象? + // 使用useTab的addTab的话,当用户手动调转,需要自行调用addTab + // tabStore.commitAddTab((unref(currentRoute) as unknown) as AppRouteRecordRaw); }, { immediate: true, diff --git a/src/router/guard/pageLoadingGuard.ts b/src/router/guard/pageLoadingGuard.ts index 03d28519a56..36fb04f54e8 100644 --- a/src/router/guard/pageLoadingGuard.ts +++ b/src/router/guard/pageLoadingGuard.ts @@ -6,6 +6,9 @@ import { userStore } from '/@/store/modules/user'; export function createPageLoadingGuard(router: Router) { let isFirstLoad = true; router.beforeEach(async (to) => { + console.log('======================'); + console.log(2); + console.log('======================'); const { openKeepAlive, openRouterTransition, @@ -21,6 +24,7 @@ export function createPageLoadingGuard(router: Router) { } if (show && openKeepAlive && !isFirstLoad) { const tabList = tabStore.getTabsState; + const isOpen = tabList.some((tab) => tab.path === to.path); appStore.setPageLoadingAction(!isOpen); } else { diff --git a/src/store/modules/tab.ts b/src/store/modules/tab.ts index 869207e307c..b5ab10fd9c0 100644 --- a/src/store/modules/tab.ts +++ b/src/store/modules/tab.ts @@ -180,6 +180,14 @@ class Tab extends VuexModule { } } + @Action + addTabByPathAction(path: string): void { + if (!path) return; + const routes = router.getRoutes(); + const to = routes.find((item) => item.path === path); + to && this.commitAddTab((to as unknown) as AppRouteRecordRaw); + } + @Action closeRightTabAction(route: AppRouteRecordRaw | TabItem): void { const index = this.tabsState.findIndex((item) => item.path === route.path); diff --git a/src/views/demo/feat/tabs/index.vue b/src/views/demo/feat/tabs/index.vue index edb3ecec55c..89cbe9597b4 100644 --- a/src/views/demo/feat/tabs/index.vue +++ b/src/views/demo/feat/tabs/index.vue @@ -11,19 +11,40 @@ 关闭其他 关闭当前 刷新当前 + 打开图标界面tab