Files
bim_engine/docs-old/components/标签页组件-Tab.md

93 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 1. 组件概述
- **名称**BimTab
- **位置**`src/components/tab/`
- **功能**:渲染固定标签页(不支持运行期增删),支持点击切换、禁用、可选内容托管。主题由全局 `ThemeManager` 提供,文案通过 `t()` 翻译。
- **使用方式**:直接通过构造函数 + `init()` 创建;本项目内目前仅在 `ConstructTreeManagerBtn` 弹窗中使用(无专门 Manager
## 2. 组件类 APIBimTab
- `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. 逻辑流程
1) `constructor`:创建根节点、头部、内容容器;缓存 tab 数据;挂载到传入容器。
2) `init`:渲染头部按钮与内容面板,设置初始激活;应用当前主题/语言;订阅主题、语言变更。
3) 交互:点击非禁用按钮 → `activateTab` 更新头部/面板状态 → 回调 `onChange`
4) 销毁:解绑点击监听、取消订阅、清空映射并移除 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. 使用示例
```ts
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` 中直接使用