diff --git a/src/layouts/BasicLayout/index.vue b/src/layouts/BasicLayout/index.vue index be319f2..03370a6 100644 --- a/src/layouts/BasicLayout/index.vue +++ b/src/layouts/BasicLayout/index.vue @@ -21,7 +21,7 @@ - +
diff --git a/src/layouts/components/tab/TabBar.vue b/src/layouts/components/tab/TabBar.vue index 7f79cf3..0fc55f3 100644 --- a/src/layouts/components/tab/TabBar.vue +++ b/src/layouts/components/tab/TabBar.vue @@ -1,24 +1,37 @@ - diff --git a/src/router/guard/permission.ts b/src/router/guard/permission.ts index 8de96a4..a26a92c 100644 --- a/src/router/guard/permission.ts +++ b/src/router/guard/permission.ts @@ -42,7 +42,10 @@ export async function createPermissionGuard( } else { routeStore.setActiveMenu(to.fullPath); } - // 添加动态tabs + + // 添加tabs tabStore.addTab(to); + // 设置高亮标签; + tabStore.setCurrentTab(to.name as string); next(); } diff --git a/src/store/modules/tab.ts b/src/store/modules/tab.ts index ca379e1..1169e8d 100644 --- a/src/store/modules/tab.ts +++ b/src/store/modules/tab.ts @@ -1,18 +1,88 @@ import { defineStore } from 'pinia'; import { RouteLocationNormalized } from 'vue-router'; +import { useAppRouter } from '@/hook'; interface TabState { + inherentTab: { + name: string; + title: string; + path: string; + }[]; tabs: RouteLocationNormalized[]; + currentTab: string; } export const useTabStore = defineStore('tab-store', { state: (): TabState => { return { + inherentTab: [ + { + name: 'dashboard_workbench', + title: '工作台', + path: '/', + }, + ], tabs: [], + currentTab: 'dashboard_workbench', }; }, + getters: { + inherentTabName(): string[] { + return this.inherentTab.map((item) => { + return item.name; + }); + }, + }, actions: { addTab(route: RouteLocationNormalized) { + // 如果已经在固有标签里则不添加 + if (this.inherentTabName.includes(route.name as string)) { + return; + } + // 如果标签名称已存在则不添加 + if (this.hasExistTab(route.name as string)) { + return; + } this.tabs.push(route); }, + closeTab(name: string) { + const { routerPush, toRoot } = useAppRouter(false); + const tabsLength = this.tabs.length; + // 如果动态标签大于一个,才会标签跳转 + if (this.tabs.length > 1) { + // 获取关闭的标签索引 + const index = this.getTabIndex(name); + const isLast = index + 1 === tabsLength; + // 如果是关闭的当前页面,路由跳转到原先标签的后一个标签 + if (this.currentTab === name && !isLast) { + // 跳转到后一个标签 + routerPush(this.tabs[index + 1].path); + } else { + // 已经是最后一个了,就跳转前一个 + routerPush(this.tabs[index - 1].path); + } + } + // 删除标签 + this.tabs = this.tabs.filter((item) => { + return item.name !== name; + }); + // 删除后如果清空了,就跳转到默认首页 + if (tabsLength - 1 === 0) { + toRoot(); + } + }, + hasExistTab(name: string) { + return this.tabs.some((item) => { + return item.name === name; + }); + }, + /* 设置当前激活的标签 */ + setCurrentTab(name: string) { + this.currentTab = name; + }, + getTabIndex(name: string) { + return this.tabs.findIndex((item) => { + return item.name === name; + }); + }, }, });