Browse Source

fix: fix the disappearance of tab switching parameters (#56)

vben 4 years ago
parent
commit
6bffdb5c64

+ 4 - 3
src/layouts/default/LayoutHeader.tsx

@@ -22,12 +22,13 @@ import { useModal } from '/@/components/Modal/index';
 import { errorStore } from '/@/store/modules/error';
 import { errorStore } from '/@/store/modules/error';
 import { useWindowSizeFn } from '/@/hooks/event/useWindowSize';
 import { useWindowSizeFn } from '/@/hooks/event/useWindowSize';
 import NoticeAction from './actions/notice/NoticeActionItem.vue';
 import NoticeAction from './actions/notice/NoticeActionItem.vue';
-
+import { useRouter } from 'vue-router';
 export default defineComponent({
 export default defineComponent({
   name: 'DefaultLayoutHeader',
   name: 'DefaultLayoutHeader',
   setup() {
   setup() {
     const widthRef = ref(200);
     const widthRef = ref(200);
-    const { refreshPage, addTab } = useTabs();
+    const { refreshPage } = useTabs();
+    const { push } = useRouter();
     const [register, { openModal }] = useModal();
     const [register, { openModal }] = useModal();
     const { toggleFullscreen, isFullscreenRef } = useFullscreen();
     const { toggleFullscreen, isFullscreenRef } = useFullscreen();
 
 
@@ -70,7 +71,7 @@ export default defineComponent({
 
 
     function handleToErrorList() {
     function handleToErrorList() {
       errorStore.commitErrorListCountState(0);
       errorStore.commitErrorListCountState(0);
-      addTab('/exception/error-log', true);
+      push('/exception/error-log');
     }
     }
 
 
     /**
     /**

+ 6 - 5
src/layouts/default/LayoutMenu.tsx

@@ -22,8 +22,8 @@ import {
 import { useRouter } from 'vue-router';
 import { useRouter } from 'vue-router';
 import { useThrottle } from '/@/hooks/core/useThrottle';
 import { useThrottle } from '/@/hooks/core/useThrottle';
 import { permissionStore } from '/@/store/modules/permission';
 import { permissionStore } from '/@/store/modules/permission';
-import { useTabs } from '/@/hooks/web/useTabs';
-import { PageEnum } from '/@/enums/pageEnum';
+// import { useTabs } from '/@/hooks/web/useTabs';
+// import { PageEnum } from '/@/enums/pageEnum';
 
 
 // import
 // import
 export default defineComponent({
 export default defineComponent({
@@ -53,8 +53,8 @@ export default defineComponent({
   setup(props) {
   setup(props) {
     const menusRef = ref<Menu[]>([]);
     const menusRef = ref<Menu[]>([]);
     const flatMenusRef = ref<Menu[]>([]);
     const flatMenusRef = ref<Menu[]>([]);
-    const { currentRoute } = useRouter();
-    const { addTab } = useTabs();
+    const { currentRoute, push } = useRouter();
+    // const { addTab } = useTabs();
 
 
     const getProjectConfigRef = computed(() => {
     const getProjectConfigRef = computed(() => {
       return appStore.getProjectConfig;
       return appStore.getProjectConfig;
@@ -144,7 +144,8 @@ export default defineComponent({
         if (splitType === MenuSplitTyeEnum.TOP) {
         if (splitType === MenuSplitTyeEnum.TOP) {
           menuStore.commitCurrentTopSplitMenuPathState(path);
           menuStore.commitCurrentTopSplitMenuPathState(path);
         }
         }
-        addTab(path as PageEnum, true);
+        push(path);
+        // addTab(path as PageEnum, true);
       }
       }
     }
     }
 
 

+ 23 - 15
src/layouts/default/multitabs/index.tsx

@@ -27,6 +27,7 @@ import { useTabs } from '/@/hooks/web/useTabs';
 // import { PageEnum } from '/@/enums/pageEnum';
 // import { PageEnum } from '/@/enums/pageEnum';
 
 
 import './index.less';
 import './index.less';
+import { userStore } from '/@/store/modules/user';
 export default defineComponent({
 export default defineComponent({
   name: 'MultiTabs',
   name: 'MultiTabs',
   setup() {
   setup() {
@@ -60,24 +61,27 @@ export default defineComponent({
 
 
     watch(
     watch(
       () => unref(currentRoute).path,
       () => unref(currentRoute).path,
-      (path) => {
-        if (activeKeyRef.value !== path) {
-          activeKeyRef.value = path;
+      () => {
+        if (!userStore.getTokenState) return;
+        const { path: rPath, fullPath } = unref(currentRoute);
+        if (activeKeyRef.value !== (fullPath || rPath)) {
+          activeKeyRef.value = fullPath || rPath;
         }
         }
         // 监听路由的话虽然可以,但是路由切换的时间会造成卡顿现象?
         // 监听路由的话虽然可以,但是路由切换的时间会造成卡顿现象?
         // 使用useTab的addTab的话,当用户手动调转,需要自行调用addTab
         // 使用useTab的addTab的话,当用户手动调转,需要自行调用addTab
-        // tabStore.commitAddTab((unref(currentRoute) as unknown) as AppRouteRecordRaw);
-        const { affix } = currentRoute.value.meta || {};
-        if (affix) return;
-        const hasInTab = tabStore.getTabsState.some(
-          (item) => item.fullPath === currentRoute.value.fullPath
-        );
-        if (!hasInTab) {
-          tabStore.commitAddTab((unref(currentRoute) as unknown) as AppRouteRecordRaw);
-        }
+        tabStore.commitAddTab((unref(currentRoute) as unknown) as AppRouteRecordRaw);
+
+        // const { affix } = currentRoute.value.meta || {};
+        // if (affix) return;
+        // const hasInTab = tabStore.getTabsState.some(
+        //   (item) => item.fullPath === currentRoute.value.fullPath
+        // );
+        // if (!hasInTab) {
+        //   tabStore.commitAddTab((unref(currentRoute) as unknown) as AppRouteRecordRaw);
+        // }
       },
       },
       {
       {
-        flush: 'post',
+        // flush: 'post',
         immediate: true,
         immediate: true,
       }
       }
     );
     );
@@ -115,7 +119,9 @@ export default defineComponent({
     // 关闭当前ab
     // 关闭当前ab
     function handleEdit(targetKey: string) {
     function handleEdit(targetKey: string) {
       // 新增操作隐藏,目前只使用删除操作
       // 新增操作隐藏,目前只使用删除操作
-      const index = unref(getTabsState).findIndex((item) => item.path === targetKey);
+      const index = unref(getTabsState).findIndex(
+        (item) => (item.fullPath || item.path) === targetKey
+      );
       index !== -1 && closeTab(unref(getTabsState)[index]);
       index !== -1 && closeTab(unref(getTabsState)[index]);
     }
     }
 
 
@@ -133,8 +139,10 @@ export default defineComponent({
     }
     }
     function renderTabs() {
     function renderTabs() {
       return unref(getTabsState).map((item: TabItem) => {
       return unref(getTabsState).map((item: TabItem) => {
+        const key = item.query ? item.fullPath : item.path;
+
         return (
         return (
-          <Tabs.TabPane key={item.path} closable={!(item && item.meta && item.meta.affix)}>
+          <Tabs.TabPane key={key} closable={!(item && item.meta && item.meta.affix)}>
             {{
             {{
               tab: () => <TabContent tabItem={item} />,
               tab: () => <TabContent tabItem={item} />,
             }}
             }}

+ 24 - 7
src/layouts/default/multitabs/useTabDropdown.ts

@@ -12,6 +12,7 @@ import { PageEnum } from '/@/enums/pageEnum';
 import { useGo, useRedo } from '/@/hooks/web/usePage';
 import { useGo, useRedo } from '/@/hooks/web/usePage';
 import router from '/@/router';
 import router from '/@/router';
 import { useTabs, isInitUseTab } from '/@/hooks/web/useTabs';
 import { useTabs, isInitUseTab } from '/@/hooks/web/useTabs';
+import { RouteLocationRaw } from 'vue-router';
 
 
 const { initTabFn } = useTabs();
 const { initTabFn } = useTabs();
 /**
 /**
@@ -92,7 +93,11 @@ export function useTabDropdown(tabContentProps: TabContentProps) {
     let toPath: PageEnum | string = PageEnum.BASE_HOME;
     let toPath: PageEnum | string = PageEnum.BASE_HOME;
 
 
     if (len > 0) {
     if (len > 0) {
-      toPath = unref(getTabsState)[len - 1].path;
+      const page = unref(getTabsState)[len - 1];
+      const p = page.fullPath || page.path;
+      if (p) {
+        toPath = p;
+      }
     }
     }
     // 跳到当前页面报错
     // 跳到当前页面报错
     path !== toPath && go(toPath as PageEnum, true);
     path !== toPath && go(toPath as PageEnum, true);
@@ -192,7 +197,7 @@ export function useTabDropdown(tabContentProps: TabContentProps) {
   }
   }
   return { getDropMenuList, handleMenuEvent };
   return { getDropMenuList, handleMenuEvent };
 }
 }
-export function closeTab(closedTab: TabItem) {
+export function closeTab(closedTab: TabItem | AppRouteRecordRaw) {
   const { currentRoute, replace } = router;
   const { currentRoute, replace } = router;
   // 当前tab列表
   // 当前tab列表
   const getTabsState = computed(() => {
   const getTabsState = computed(() => {
@@ -205,23 +210,35 @@ export function closeTab(closedTab: TabItem) {
     return;
     return;
   }
   }
   // 关闭的为激活atb
   // 关闭的为激活atb
-  let toPath: PageEnum | string;
+  let toObj: RouteLocationRaw = {};
   const index = unref(getTabsState).findIndex((item) => item.path === path);
   const index = unref(getTabsState).findIndex((item) => item.path === path);
 
 
   // 如果当前为最左边tab
   // 如果当前为最左边tab
   if (index === 0) {
   if (index === 0) {
     // 只有一个tab,则跳转至首页,否则跳转至右tab
     // 只有一个tab,则跳转至首页,否则跳转至右tab
     if (unref(getTabsState).length === 1) {
     if (unref(getTabsState).length === 1) {
-      toPath = PageEnum.BASE_HOME;
+      toObj = PageEnum.BASE_HOME;
     } else {
     } else {
       //  跳转至右边tab
       //  跳转至右边tab
-      toPath = unref(getTabsState)[index + 1].path;
+      const page = unref(getTabsState)[index + 1];
+      const { params, path, query } = page;
+      toObj = {
+        params,
+        path,
+        query,
+      };
     }
     }
   } else {
   } else {
     // 跳转至左边tab
     // 跳转至左边tab
-    toPath = unref(getTabsState)[index - 1].path;
+    const page = unref(getTabsState)[index - 1];
+    const { params, path, query } = page;
+    toObj = {
+      params,
+      path,
+      query,
+    };
   }
   }
   const route = (unref(currentRoute) as unknown) as AppRouteRecordRaw;
   const route = (unref(currentRoute) as unknown) as AppRouteRecordRaw;
   tabStore.commitCloseTab(route);
   tabStore.commitCloseTab(route);
-  replace(toPath);
+  replace(toObj);
 }
 }

+ 13 - 3
src/store/modules/tab.ts

@@ -98,11 +98,21 @@ class Tab extends VuexModule {
       return;
       return;
     }
     }
 
 
+    let updateIndex = -1;
     // 已经存在的页面,不重复添加tab
     // 已经存在的页面,不重复添加tab
-    const hasTab = this.tabsState.some((tab) => {
-      return tab.fullPath === fullPath;
+    const hasTab = this.tabsState.some((tab, index) => {
+      updateIndex = index;
+      return (tab.fullPath || tab.path) === (fullPath || path);
     });
     });
-    if (hasTab) return;
+    if (hasTab) {
+      const curTab = toRaw(this.tabsState)[updateIndex];
+      if (!curTab) return;
+      curTab.params = params || curTab.params;
+      curTab.query = query || curTab.query;
+      curTab.fullPath = fullPath || curTab.fullPath;
+      this.tabsState.splice(updateIndex, 1, curTab);
+      return;
+    }
 
 
     this.tabsState.push({ path, fullPath, name, meta, params, query });
     this.tabsState.push({ path, fullPath, name, meta, params, query });
     if (unref(getOpenKeepAliveRef) && name) {
     if (unref(getOpenKeepAliveRef) && name) {

+ 1 - 1
src/views/demo/feat/tab-params/index.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
   <div class="p-4">
   <div class="p-4">
     Current Param : {{ params }}
     Current Param : {{ params }}
-    <input />
+    <!-- <input /> -->
   </div>
   </div>
 </template>
 </template>
 <script lang="ts">
 <script lang="ts">