import router from "@/routers"; import { defineStore } from "pinia"; import { TabsState } from "@/stores/interface"; import piniaPersistConfig from "@/config/piniaPersist"; export const useTabsStore = defineStore({ id: "wms-tabs", state: (): TabsState => ({ tabsMenuList: [ { icon: "", // 首页的icon,按实际路由meta.icon填写(如"Home") title: "首页", // 固定首页标题 path: "/index", // 首页的基础路径(无参数版本,避免初始参数冗余) name: "home", // 必须与首页路由的name一致(如路由定义中name: "home") close: true // 首页是否可关闭,按业务需求设置(通常true,若禁止关闭设为false) } ] }), actions: { // Add Tabs:按 name 去重,首页始终在最前 async addTabs(tabItem: any) { // 1. 校验参数:确保 tabItem 有 name(避免异常数据) if (!tabItem.name) return; // 2. 去重逻辑:按 name 判断是否已存在 const isExist = this.tabsMenuList.some(item => item.name === tabItem.name); if (!isExist) { // 3. 首页(name: "home")添加到数组开头,其他标签添加到末尾 if (tabItem.name === "home") { // 先移除旧的首页(防止极端情况残留),再添加新首页到最前 this.tabsMenuList = this.tabsMenuList.filter(item => item.name !== "home"); this.tabsMenuList.unshift(tabItem); // 首页放第一位 } else { this.tabsMenuList.push(tabItem); // 非首页放末尾 } } else { // 4. 可选优化:若标签已存在,同步更新其 path(如首页参数变化时) this.tabsMenuList = this.tabsMenuList.map(item => { if (item.name === tabItem.name) { return { ...item, path: tabItem.path }; // 仅更新 path,保留其他属性 } return item; }); } }, // Remove Tabs(原有逻辑不变,无需修改) async removeTabs(tabPath: string, isCurrent: boolean = true) { const tabsMenuList = this.tabsMenuList; if (isCurrent) { tabsMenuList.forEach((item, index) => { if (item.path !== tabPath) return; const nextTab = tabsMenuList[index + 1] || tabsMenuList[index - 1]; if (!nextTab) return; router.push(nextTab.path); }); } this.tabsMenuList = tabsMenuList.filter(item => item.path !== tabPath); }, // Close MultipleTab(原有逻辑不变) async closeMultipleTab(tabsMenuValue?: string) { this.tabsMenuList = this.tabsMenuList.filter(item => { return item.path === tabsMenuValue || !item.close; }); }, // Set Tabs(原有逻辑不变) async setTabs(tabsMenuList: any[]) { // 补充:设置 tabs 时也需去重,避免批量设置时带入重复首页 const uniqueTabs = []; const nameSet = new Set(); // 先处理首页,确保在最前 const homeTab = tabsMenuList.find(item => item.name === "home"); if (homeTab) { uniqueTabs.push(homeTab); nameSet.add("home"); } // 再处理其他标签,去重 tabsMenuList.forEach(tab => { if (!nameSet.has(tab.name)) { nameSet.add(tab.name); uniqueTabs.push(tab); } }); this.tabsMenuList = uniqueTabs; }, // Set Tabs Title(原有逻辑不变) async setTabsTitle(title: string) { const nowFullPath = location.hash.substring(1); this.tabsMenuList.forEach(item => { if (item.path == nowFullPath) item.title = title; }); } }, persist: piniaPersistConfig("wms-tabs") });