# `IconbarPage` 技术文档 > **模块路径**: `bricks.IconbarPage` > **继承自**: `bricks.VBox` > **用途**: 提供一个带有图标工具栏的页面容器,支持顶部或底部布局,并可动态加载内容组件。 --- ## 概述 `bricks.IconbarPage` 是一个基于 `bricks.VBox` 的复合组件,用于构建具有图标文本工具栏(`IconTextBar`)和内容区域的页面。工具栏可置于页面顶部或底部,点击工具项时会触发对应的内容展示逻辑。 该组件适用于需要导航式界面的应用场景,如设置页、功能面板或多标签界面。 --- ## 类定义 ```javascript bricks.IconbarPage = class extends bricks.VBox { ... } ``` --- ## 构造函数 ### `constructor(opts)` 初始化 `IconbarPage` 实例。 #### 参数 | 参数名 | 类型 | 说明 | |-------|------|------| | `opts` | Object | 配置选项对象 | ##### `opts` 结构 | 属性 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | `bar_opts` | Object | 是 | - | 图标工具栏的配置选项,传递给 `bricks.IconTextBar` | | `bar_at` | String | 否 | `'top'` | 工具栏位置,可选 `'top'` 或 `'bottom'` | | `height` | String | 否 | `'100%'` | 自动设置为 100%,确保占满父容器高度 | ##### `bar_opts` 子属性 | 属性 | 类型 | 说明 | |------|------|------| | `margin` | Number/String | 工具栏外边距 | | `rate` | Number | 布局占比(在 VBox 中使用的伸缩比例) | | `tools` | Array\ | 工具项列表,每个工具项定义一个可点击的操作 | ##### `tools` 数组中的 `tool` 对象结构 | 属性 | 类型 | 必填 | 说明 | |------|------|------|------| | `name` | String | 是 | 工具名称,作为唯一标识 | | `icon` | String | 是 | 图标类名(如 Font Awesome 类名) | | `label` | String | 否 | 显示文本(可选) | | `tip` | String | 是 | 鼠标悬停提示文本 | | `dynsize` | Boolean | 否 | 是否动态调整大小 | | `rate` | Number | 否 | 在布局中所占比例 | | `context` | Object | 否 | 附加上下文数据,可用于命令处理 | | `content` | WidgetConfig / Function / Promise | 是 | 要加载的内容组件配置或异步构造逻辑 | --- ## 成员属性 | 属性 | 类型 | 描述 | |------|------|------| | `bar_at` | String | 存储工具栏位置(`'top'` 或 `'bottom'`) | | `content` | `bricks.Filler` | 内容容器,用于动态插入当前选中的工具对应的内容组件 | | `bar` | `bricks.IconTextBar` | 创建的图标文本工具栏实例 | --- ## 方法 ### `command_handle(event) → Promise` 处理来自工具栏的命令事件(例如点击某个工具按钮),并加载对应的内容。 #### 参数 - `event`: 事件对象 - `params`: 触发事件的 `tool` 对象(即被点击的工具项) #### 行为 1. 获取触发事件的 `tool` 2. 调用 `show_content(tool)` 异步加载内容 > ⚠️ 使用 `bind(this)` 绑定上下文,在构造时通过 `bar.bind('command', ...)` 注册。 --- ### `show_content(tool) → Promise` 根据传入的 `tool` 动态创建并显示其对应的内容组件。 #### 参数 - `tool`: 工具项对象(包含 `content` 字段) #### 流程 1. 使用 `bricks.widgetBuild(tool.content, this)` 异步生成组件实例 2. 若组件存在且尚未添加到 DOM 树,则将其加入 `this.content` 容器 3. 替换当前内容区域的内容(旧内容会被自动移除?取决于 `Filler` 实现) > ✅ 支持异步组件加载,适合懒加载或远程模块。 --- ## 生命周期与初始化行为 1. 设置默认高度为 `'100%'` 2. 确定工具栏位置(默认为 `'top'`) 3. 调用父类 `super(opts)` 初始化 VBox 布局 4. 创建 `IconTextBar` 实例并传入 `bar_opts` 5. 创建 `Filler` 作为内容占位符 6. 根据 `bar_at` 决定工具栏与内容的排列顺序: - `'top'`: 先工具栏,后内容 - `'bottom'`: 先内容,后工具栏 7. 绑定 `command` 事件监听器到 `command_handle` 8. 使用 `schedule_once` 延迟 0.1 秒自动显示第一个工具项的内容 > 🕒 `schedule_once(..., 0.1)` 可避免渲染冲突,确保 DOM 就绪后再加载初始内容。 --- ## 示例用法 ```javascript var page = new bricks.IconbarPage({ bar_at: 'top', bar_opts: { margin: 5, rate: 0, tools: [ { name: 'dashboard', icon: 'fa fa-tachometer', label: '仪表盘', tip: '查看系统状态', rate: 1, content: { type: 'DashboardWidget', opts: {} } }, { name: 'settings', icon: 'fa fa-cog', tip: '系统设置', content: async function() { let mod = await import('./SettingsPanel.js'); return new mod.SettingsPanel(); } } ] } }); document.body.appendChild(page.root); ``` --- ## 事件机制 - **事件类型**: `command` - **触发源**: `bricks.IconTextBar` - **携带参数**: `event.params` 包含完整的 `tool` 对象 - **监听方式**: 在 `IconTextBar` 上绑定 `command` 事件 --- ## 注册信息 ```javascript bricks.Factory.register('IconbarPage', bricks.IconbarPage); ``` 可通过工厂方法创建: ```javascript bricks.Factory.create('IconbarPage', {...opts}); ``` --- ## 注意事项 1. **内容清理**:当前实现未显式清除旧内容,依赖 `Filler` 组件的行为。若需手动管理,请扩展 `show_content` 方法。 2. **性能优化**:首次加载延迟 0.1s,建议确认是否必要;可考虑使用 `requestAnimationFrame` 或更精确的时机控制。 3. **错误处理**:`widgetBuild` 失败时无异常捕获,建议包裹 `try-catch` 增强健壮性。 --- ## 依赖组件 - `bricks.VBox` —— 垂直布局容器 - `bricks.IconTextBar` —— 图标+文本工具栏 - `bricks.Filler` —— 内容填充容器 - `bricks.widgetBuild` —— 异步构建组件的工具函数 - `schedule_once` —— 延迟执行工具函数(通常为 `setTimeout` 封装) --- ## 版本历史 | 日期 | 修改人 | 说明 | |------|--------|------| | 2025-04-05 | AutoDoc Generator | 根据源码生成技术文档 | --- ✅ **文档完成** 📌 推荐配合 `IconTextBar` 文档一起阅读以理解完整交互逻辑。