bricks/docs/ai.old/menu.md
2025-11-18 14:59:26 +08:00

136 lines
4.5 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.

# Menu
**用途**`Menu` 是一个用于构建树形结构菜单的容器控件,支持多级子菜单、动态加载子菜单内容(通过 URL 异步加载)、点击触发页面跳转或弹窗等功能。常用于侧边栏导航、系统功能入口等场景。
**类型**:容器控件,继承自 `bricks.VBox`
---
## 主要方法
- `create_menuitem(item)`
根据菜单项配置创建一个 HBox 形式的菜单项,包含图标和文本,并绑定数据。
- `create_submenu_container()`
创建一个用于包裹子菜单的 VBox 容器,默认隐藏(`display: none`),并设置左外边距以实现缩进效果。
- `create_children(w, items)`
递归创建菜单项及其子菜单。支持静态嵌套菜单(`items`)和动态加载菜单(`submenu` 属性指定 URL
- `menu_clicked(event)`
菜单项被点击时的回调函数。根据目标类型(如 `PopupWindow``Popup` 或普通控件)加载远程 UI 并渲染到目标容器中,同时派发 `command` 事件。
- `load_submenu(container, event)`
动态加载子菜单内容(通过 `submenu_url` 指定的 URL 获取 JSON 数据),仅在首次展开时加载一次,提升性能。
- `items_toggle_hide(w, event)`
切换子菜单的显示/隐藏状态,阻止事件冒泡。
- `regen_menuitem_event(item, event)`
当普通菜单项被点击时,重新派发 `item_click` 事件,携带该菜单项的数据。
- `get_submenu_items(url)`
异步从服务器获取子菜单数据(返回 JSON 中的 `items` 数组),用于动态加载。
---
## 主要事件
- `item_click`
当任意菜单项被点击时触发,参数为当前菜单项的配置对象(如 `label`, `url`, `target` 等)。通常由 `regen_menuitem_event` 触发。
- `command`
`menu_clicked` 方法中派发,表示已执行某个命令(例如跳转、打开弹窗等),携带原始菜单项参数,可用于外部监听处理业务逻辑。
---
## 源码例子
```json
{
"id": "main_menu",
"widgettype": "Menu",
"options": {
"bgcolor": "#f5f5f5",
"item_cheight": 2.5,
"menuitem_css": "custom-menu-item"
},
"subwidgets": [],
"binds": [
{
"actiontype": "bricks",
"wid": "main_menu",
"event": "command",
"target": "status_bar",
"datawidget": "main_menu",
"datamethod": "getValue",
"rtdata": {
"message": "菜单命令已执行"
}
}
],
"options": {
"items": [
{
"label": "仪表盘",
"icon": "/icons/dashboard.png",
"url": "/ui/dashboard.ui",
"target": "content_area"
},
{
"label": "用户管理",
"icon": "/icons/users.png",
"items": [
{
"label": "用户列表",
"url": "/ui/user/list.ui",
"target": "content_area"
},
{
"label": "角色权限",
"url": "/ui/user/roles.ui",
"target": "Popup"
}
]
},
{
"label": "报表中心",
"icon": "/icons/reports.png",
"submenu": "/api/menu/reports", // 动态加载子菜单
"target": "content_area"
},
{
"label": "系统设置",
"icon": "/icons/settings.png",
"url": "/ui/settings.ui",
"target": "PopupWindow",
"popup_options": {
"width": 800,
"height": 600,
"title": "系统设置"
}
}
]
}
}
```
### 注释说明:
- `"widgettype": "Menu"`:使用注册的 `Menu` 控件。
- `options.items`:定义菜单结构数组,每个元素是一个菜单项。
- `label`:显示文本,支持 i18n。
- `icon`:左侧图标路径。
- `url`:点击后要加载的 `.ui` 文件地址。
- `target`:目标容器 ID 或特殊值:
- `"content_area"`:普通容器控件 ID。
- `"Popup"`:在浮层中打开。
- `"PopupWindow"`:在新窗口中打开。
- `items`:静态嵌套子菜单。
- `submenu`:字符串 URL表示此菜单项的子菜单需异步加载首次点击展开时请求
- `binds` 示例:监听 `command` 事件,在状态栏提示操作成功。
- `options.bgcolor`:设置菜单背景色。
- `item_cheight`:控制菜单项高度。
- `menuitem_css`:自定义菜单项样式类名。
> 💡 **提示**:若某菜单项有 `submenu` 字段,则其子菜单将在第一次展开时通过 AJAX 请求获取,适用于大型系统中按需加载菜单结构,减少初始资源消耗。