4.2 KiB
4.2 KiB
1. 组件概述
- 名称:BimTab
- 位置:
src/components/tab/ - 功能:渲染固定标签页(不支持运行期增删),支持点击切换、禁用、可选内容托管。主题由全局
ThemeManager提供,文案通过t()翻译。 - 使用方式:直接通过构造函数 +
init()创建;本项目内目前仅在ConstructTreeManagerBtn弹窗中使用(无专门 Manager)。
2. 组件类 API(BimTab)
constructor(options: TabOptions):创建实例并挂载到options.container。init(): void:渲染头部与内容,订阅主题/语言。activateTab(tabId: string): void:切换激活标签,触发onChange。setTheme(theme: ThemeConfig): void:应用主题变量。setLocales(): void:刷新标题文案。destroy(): void:解绑事件、取消订阅、移除 DOM。
3. 分化组件
- 当前无子类或变体,后续可扩展滚动、溢出折叠等能力。
4. 使用场景说明
- ConstructTreeManagerBtn 弹窗:顶部三段标签(构件/系统/空间),构件标签承载原有 Tree,系统/空间暂为空容器。
- 适用于固定分区切换,内容简单或由外部回调控制。
5. UI 结构
div.bim-tab
div.bim-tab__nav [role=tablist]
button.bim-tab__item[role=tab][aria-selected][aria-disabled?]
span.bim-tab__icon? (可选)
span.bim-tab__title
div.bim-tab__content
div.bim-tab__panel[role=tabpanel][aria-labelledby=tab-xxx]
...
- 状态类:
.is-active、.is-disabled。 - 内容区:仅切换显示,不强制填充(可为空)。
6. 逻辑流程
constructor:创建根节点、头部、内容容器;缓存 tab 数据;挂载到传入容器。init:渲染头部按钮与内容面板,设置初始激活;应用当前主题/语言;订阅主题、语言变更。- 交互:点击非禁用按钮 →
activateTab更新头部/面板状态 → 回调onChange。 - 销毁:解绑点击监听、取消订阅、清空映射并移除 DOM。
7. 国际化
- 标题:
t(tab.title),若翻译键不存在则回退原文。 - 新增翻译键:
tab.component/tab.system/tab.space(已在zh-CN.ts、en-US.ts注册)。 setLocales():遍历头部按钮刷新标题文案;订阅localeManager自动响应语言切换。
8. 主题支持
- 来自
themeManager,不从配置传入。 - 使用的变量(设置在根节点上):
--bim-tab-bg、--bim-tab-nav-bg--bim-tab-text、--bim-tab-text-secondary、--bim-tab-text-active--bim-tab-border、--bim-tab-hover-bg、--bim-tab-active-bg--bim-tab-icon
setTheme(theme):根据ThemeConfig写入上述 CSS 变量。
9. 使用示例
const tabMount = document.createElement('div');
const tab = new BimTab({
container: tabMount,
tabs: [
{ id: 'component', title: 'tab.component', content: componentEl },
{ id: 'system', title: 'tab.system', content: systemEl },
{ id: 'space', title: 'tab.space', content: spaceEl },
],
activeId: 'component',
onChange: (id) => {
// 根据 id 做额外逻辑(如埋点、动态加载)
},
});
tab.init();
10. 实现细节
- 仅支持固定 tabs:
TabOptions.tabs为初始化列表,不提供新增/删除接口。 - 内容托管两种方式:
content: HTMLElement(append)或content: string(innerHTML)。未提供内容时面板为空。 - 事件绑定:头部使用事件委托绑定 click,销毁时移除。
- 访问性:头部
role=tab、aria-selected、aria-disabled;面板role=tabpanel且aria-labelledby对应头部 id。 - 主题/语言订阅:
localeManager.subscribe、themeManager.subscribe,销毁时必须取消。
11. 类型定义
- 位置:
src/components/tab/index.type.ts - 主要类型:
TabItem:{ id; title; disabled?; icon?; content?; meta? }TabOptions:{ container; tabs; activeId?; onChange? }
12. 文件清单
src/components/tab/index.ts:组件实现src/components/tab/index.type.ts:类型定义src/components/tab/index.css:样式- (无 Manager)当前仅在
ConstructTreeManagerBtn中直接使用