diff --git a/src/layout/components/tag/index.vue b/src/layout/components/tag/index.vue index 2642110ee..a3087c786 100644 --- a/src/layout/components/tag/index.vue +++ b/src/layout/components/tag/index.vue @@ -26,7 +26,7 @@ import { import { RouteConfigs, relativeStorageType, tagsViewsType } from "../../types"; import { emitter } from "/@/utils/mitt"; import { templateRef } from "@vueuse/core"; -import { handleAliveRoute } from "/@/router"; +import { handleAliveRoute, delAliveRoutes } from "/@/router"; import { storageLocal } from "/@/utils/storage"; import { useRoute, useRouter } from "vue-router"; import { usePermissionStoreHook } from "/@/store/modules/permission"; @@ -124,7 +124,8 @@ function dynamicRouteTag(value: string, parentPath: string): void { routerArrays.push({ path: value, parentPath: `/${parentPath.split("/")[1]}`, - meta: arrItem.meta + meta: arrItem.meta, + name: arrItem.name }); relativeStorage.routesInStorage = routerArrays; } else { @@ -151,6 +152,8 @@ function onFresh() { } function deleteDynamicTag(obj: any, current: any, tag?: string) { + // 存放被删除的缓存路由 + let delAliveRouteList = []; let valueIndex: number = routerArrays.findIndex((item: any) => { return item.path === obj.path; }); @@ -171,7 +174,7 @@ function deleteDynamicTag(obj: any, current: any, tag?: string) { ]; routerArrays = relativeStorage.routesInStorage; } else { - routerArrays.splice(start, end); + delAliveRouteList = routerArrays.splice(start, end); relativeStorage.routesInStorage = routerArrays; } }; @@ -189,7 +192,9 @@ function deleteDynamicTag(obj: any, current: any, tag?: string) { let newRoute: any = routerArrays.slice(-1); if (current === route.path) { // 删除缓存路由 - handleAliveRoute(route.matched, "delete"); + tag + ? delAliveRoutes(delAliveRouteList) + : handleAliveRoute(route.matched, "delete"); // 如果删除当前激活tag就自动切换到最后一个tag if (tag === "left") return; nextTick(() => { @@ -198,20 +203,16 @@ function deleteDynamicTag(obj: any, current: any, tag?: string) { }); }); } else { - //保存跳转之前的路径 - let oldPath = route.path; - router.push(obj.path); // 删除缓存路由 - handleAliveRoute(route.matched, "delete"); + tag ? delAliveRoutes(delAliveRouteList) : delAliveRoutes([obj]); if (!routerArrays.length) return; - let isHasOldPath = routerArrays.some(item => { - return item.path === oldPath; + let isHasActiveTag = routerArrays.some(item => { + return item.path === route.path; }); - isHasOldPath - ? router.push(oldPath) - : router.push({ - path: newRoute[0].path - }); + !isHasActiveTag && + router.push({ + path: newRoute[0].path + }); } } @@ -230,7 +231,11 @@ function onClickDrop(key, item, selectRoute?: RouteConfigs) { case 1: // 关闭当前标签页 selectRoute - ? deleteMenu({ path: selectRoute.path, meta: selectRoute.meta }) + ? deleteMenu({ + path: selectRoute.path, + meta: selectRoute.meta, + name: selectRoute.name + }) : deleteMenu({ path: route.path, meta: route.meta }); break; case 2: diff --git a/src/layout/types.ts b/src/layout/types.ts index 61b4e5593..949e4cdd6 100644 --- a/src/layout/types.ts +++ b/src/layout/types.ts @@ -19,6 +19,7 @@ export type RouteConfigs = { showLink?: boolean; savedPosition?: boolean; }; + name?: string; }; export type relativeStorageType = { diff --git a/src/router/index.ts b/src/router/index.ts index d3f7c6875..a8ed8a75f 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -5,6 +5,7 @@ import { createWebHashHistory, RouteRecordNormalized } from "vue-router"; +import { RouteConfigs } from "/@/layout/types"; import { split, uniqBy } from "lodash-es"; import { i18n } from "/@/plugins/i18n"; import { openLink } from "/@/utils/link"; @@ -74,6 +75,16 @@ export const getAliveRoute = () => { return alivePageList; }; +// 批量删除缓存路由 +export const delAliveRoutes = (delAliveRouteList: Array) => { + delAliveRouteList.forEach(route => { + usePermissionStoreHook().cacheOperate({ + mode: "delete", + name: route?.name + }); + }); +}; + // 处理缓存路由(添加、删除、刷新) export const handleAliveRoute = ( matched: RouteRecordNormalized[], diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts index a75424ce6..aa4061e98 100644 --- a/src/store/modules/permission.ts +++ b/src/store/modules/permission.ts @@ -46,7 +46,7 @@ export const usePermissionStore = defineStore({ case "delete": // eslint-disable-next-line no-case-declarations const delIndex = this.cachePageList.findIndex(v => v === name); - this.cachePageList.splice(delIndex, 1); + delIndex !== -1 && this.cachePageList.splice(delIndex, 1); break; } },