Skip to content

内置组件 API

内置组件负责渲染标签栏、内容容器、面包屑、预览容器和弹窗容器。组件都可以直接从包入口导入。

DynamicContainerComponent

内容容器。它根据当前激活 tab 渲染 Vue 组件或 iframe,是工作台内容区必须放置的组件。

vue
<template>
  <DynamicContainerComponent />
</template>

说明:

  • 组件页面来自 views.modules
  • iframe 页面来自 http/https 或 TabViewUrl.createRelative()
  • _viewNoCache: true 会让页面切换后重新创建。
  • 未注册页面会渲染 render.noExistComponent
  • 没有激活 tab 时会渲染 render.noActiveComponent

DynamicTabsComponent

内置标签栏。

vue
<DynamicTabsComponent />

常用 props:

字段说明
type标签栏样式类型。
showIcon是否显示图标。
defaultIcon没有图标时的默认图标。
hideFirst是否隐藏首页标签。

内置标签栏支持激活、关闭、右键菜单、刷新、弹窗显示、置顶和拖拽排序。拖拽能力可通过 render.draggable 全局控制,也可通过 _viewNoDrag 控制单个 tab。

DynamicBreadcrumbComponent

内置面包屑。

vue
<DynamicBreadcrumbComponent
  :menus="menus"
  :get-menu-key="tabMenu.getMenuKey"
  :show-icon="false"
/>

常用 props:

字段说明
menus菜单树。
getChildren自定义读取子菜单。
getViewUrl自定义读取页面地址。
getViewName自定义读取页面标题。
getViewIcon自定义读取页面图标。
getViewProps自定义读取打开参数。
getMenuKey自定义菜单 key。
getTabKey自定义 tab key。
separator分隔符,默认 /
showIcon是否显示图标,默认 true

生成规则详见 面包屑导航

PreviewContainerComponent

预览容器,用于临时嵌入一个页面,同时保持与主工作台隔离。

vue
<PreviewContainerComponent
  view-url="/src/views/order/detail/page-index.vue"
  :view-props="{ id: 1001 }"
  view-name="订单详情"
/>

行为:

  • 使用 scoped manager,默认不污染主实例 tab 状态。
  • 目标页作为首页标签打开。
  • viewUrlviewPropsviewName 变化时会重建预览页。
  • 目标页继续打开其它页面后才显示标签栏。
  • 打开失败时触发 error 事件。

DetachedContainerComponent

弹窗显示容器。一般放在应用根布局中。

vue
<DetachedContainerComponent />

当调用 tabsManager.openDetachedTab(tabId) 后,它会渲染弹窗内容。弹窗默认层级和全屏策略由 detached.zIndexdetached.fullscreen 控制。

DynamicIconComponent

动态图标组件。

vue
<DynamicIconComponent icon="IconApps" />

支持已注册 Vue 图标组件名、SVG 字符串、图片 URL 和 base64 图片。

iframe 通信

iframe 由 DynamicContainerComponent 内部渲染。相关配置在 createTabsManager({ iframe }) 中声明:

ts
const tabsManager = createTabsManager({
  views: { modules },
  iframe: {
    messageOrigins: ["self", "https://example.com"],
    onLoad({ iframe, tab }) {
      iframe.style.backgroundColor = "#fff";
    },
    onMessage(message) {
      if (message.data?.type === "refresh-current") {
        tabsManager.refreshTab(message.tabId);
        message.reply({ type: "refreshed" });
      }
    },
  },
});

iframe 页面发送消息:

ts
window.parent.postMessage({ type: "refresh-current" }, window.location.origin);

宿主发送消息:

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

默认只接收同源消息。跨域 iframe 需要显式配置 messageOrigins,生产环境不建议使用 "*"