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 @@
-
-
- 工作台
-
+
+
+
+ {{ item.title }}
+
+
{{ item.meta.title }}
-
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;
+ });
+ },
},
});