Skip to content

TabsManager API

TabsManager 是标签页状态管理核心。通常通过 createTabsManager(options) 创建根实例,通过 useTabsManager() 在组件中获取响应式实例。

createTabsManager(options)

ts
import { createTabsManager } from "@xsbcme/vue-tab-router";

const tabsManager = createTabsManager({
  views: {
    modules: import.meta.glob("@/views/**/page-index.vue", { eager: false }),
  },
  storage: {
    enabled: true,
  },
});

返回 TabsManager 实例,可传给 app.use(tabsManager) 安装。

options.views

字段类型说明
modulesRecord<string, ModuleItem>页面模块映射。key 即 openTab(viewUrl)viewUrl
metaTabViewMeta[]页面元数据树,补充标题、图标、默认打开参数和层级。
sourcePartial<AsyncComponentOptions>透传给 defineAsyncComponent 的默认配置。

options.storage

字段默认值说明
adapternew StorageAdapter()自定义持久化适配器。
key"tabs"持久化 key。
enabledtrue是否启用持久化。

options.render

字段说明
transition页面切换过渡配置。
keepAlivekeep-alive 配置,例如 { max: 20 }
noActiveComponent没有激活 tab 时展示的占位组件。
noExistComponent目标组件不存在时展示的占位组件。
viewNameMaxLength内置标签栏标题最大显示长度。
draggable是否启用内置标签栏拖拽排序,默认 true

options.detached

字段默认值说明
zIndex1000弹窗显示层级。
fullscreentrue弹窗打开后是否默认全屏。

options.iframe

内置组件 - iframe 通信

options.guards

全局守卫

状态属性

属性说明
tabs当前打开的 tab 列表。
activeTab当前激活 tab。没有激活项时为 undefined
detachedTab当前弹窗显示的 tab 快照。
registerTabPaths已注册组件页面路径列表。
activeTabParentPaths基于注册路径推断出的当前页面父路径列表。
detachedZIndex弹窗显示层级。
detachedFullscreen弹窗默认全屏状态。
hooks插件生命周期 hook 管理器。
eventstab 间事件通信管理器。

openTab(viewUrl, options?)

打开组件页面、iframe 页面或链接页面。

ts
await tabsManager.openTab("/src/views/user/detail/page-index.vue", {
  _viewName: "用户详情",
  _viewSingle: true,
  userId: 1001,
});

返回值:

  • 普通打开:Promise<string>,返回 tabId。
  • _viewOutside: truePromise<Window | null>,返回 window.open 的结果。

常用参数:

字段说明
_viewNametab 标题。
_viewIcontab 图标。
_viewSingle是否单例复用同一路径。
_viewNoCache是否禁用组件/iframe 缓存。
_viewPinned是否置顶。
_viewNoDrag是否禁止拖拽排序。
_viewOutside是否用浏览器新窗口打开链接。
_viewOutsidePropswindow.open 参数,如 targetfeatures

_view* 外的字段会进入 tab.viewProps

openFirstTab(viewUrl, options?, mode?)

打开首页标签,并将其标记为不可关闭、不可拖拽。

ts
await tabsManager.openFirstTab("/src/views/home/page-index.vue", {
  _viewName: "首页",
});

mode 可选:

说明
replace默认。替换已有首页。
clear清空全部 tab 后打开首页。
move打开后移动到首位。

changeActiveTab(tabId)

激活指定 tab。

ts
await tabsManager.changeActiveTab(tabId);

会执行全局进入/离开守卫和页面级进入/离开守卫。

updateTabOptions(options, tabId?)

更新 tab 标题、图标、缓存策略或业务 props。

ts
await tabsManager.updateTabOptions({
  _viewName: "用户详情(已保存)",
  status: "saved",
});

不传 tabId 时默认更新当前激活 tab。非 _view* 字段会浅合并到 viewProps

refreshTab(tabId?) / refreshTabAll()

ts
await tabsManager.refreshTab();
await tabsManager.refreshTab(tabId);
await tabsManager.refreshTabAll();

refreshTab 会触发当前 tab 重建。refreshTabAll 会通知容器刷新全部 tab。

closeTab(tabId?, options?)

ts
await tabsManager.closeTab(tabId, {
  ignoreNoClose: true,
  skipGuard: true,
});
字段说明
ignoreNoClose忽略不可关闭标记。
skipGuard跳过关闭守卫和关闭回退时的切换守卫。

批量关闭

ts
await tabsManager.closeTabByAll({ continueOnRejected: true });
await tabsManager.closeTabsByLeft(tabId);
await tabsManager.closeTabsByRight(tabId);
await tabsManager.closeTabsByOther(tabId);

continueOnRejected 表示某个 tab 被守卫拒绝关闭后是否继续处理后续 tab。

弹窗显示

ts
await tabsManager.openDetachedTab(tabId);
await tabsManager.closeDetachedTab();

openDetachedTab 会把当前 tab 或指定 tab 放入弹窗显示状态。内置 DetachedContainerComponent 会消费 detachedTab

iframe 消息

ts
tabsManager.postActiveIframeMessage({ type: "reload" });
tabsManager.postIframeMessage(tabId, { type: "set-theme", theme: "dark" });

适合从布局工具栏向当前 iframe 或指定 iframe 发送消息。

tab 间事件

ts
tabsManager.emit("reload-list", { id: 1001 });

事件会发送给当前 tab 的来源 tab。页面内部可用 defineTabEvents 接收。

clear()

ts
tabsManager.clear();

清空全部 tab、持久化状态和事件监听。常用于退出登录。

createScopedManager(options?)

创建共享页面模块、但隔离 tab 状态的临时 manager。

ts
const previewManager = tabsManager.createScopedManager({
  storageEnabled: false,
});

适合预览容器、弹窗子实例等场景。