Button
概述
`Button` 是 gpui-component 按钮的 RML 封装,标签为 PascalCase `<Button>`。路由表注册为 **Stateless** 组件,codegen 生成 `rml_ui::Button::new(id)` 链式调用。
> 小写 `<button>` 属于内置 HTML 轨,映射为 `gpui::div()`,**不是**本组件。需要按钮样式与交互时请使用 `<Button>`。
基本用法
<Button label="提交" primary="" on-click={on_submit} />
<Button label={t("demo.click_btn")} ghost="" on-click={on_click} />
属性
| 属性 | 类型 | 绑定 | 说明 | |------|------|------|------| | `label` | 字符串 | `{expr}` | 按钮文字,`.label(...)` | | `icon` | 字符串 | — | 图标名称(PascalCase),如 `icon="Play"`,映射到 `IconName::Play` | | `tooltip` | 字符串 | — | 悬停提示 | | `primary` / `secondary` / `danger` / `success` / `warning` / `info` / `ghost` / `link` / `text` | 布尔标志 | — | 空值或 `true` 时启用对应变体,如 `primary=""` | | `small` / `xsmall` / `large` | 布尔标志 | — | 尺寸 | | `compact` / `loading` | 布尔标志 | — | 紧凑 / 加载态 | | `disabled` | 布尔 | `{expr}` | 禁用 | | `selected` | 布尔 | `{expr}` | 选中态 | | `font_*` | 布尔标志 | — | `font_bold`、`font_semibold` 等字体权重 | | `h_flex` / `v_flex` | 布尔标志 | — | 布局快捷方法(较少用于按钮) |
事件
| 事件 | 回调签名(code-behind) | 说明 | |------|-------------------------|------| | `on-click` | `fn(&mut self, ev: &ClickEvent, cx: &mut Context<Self>)` | 点击;支持 `on-click={method}` 或 `on-click="method"` |
数据绑定
- `label={expr}` — 动态文字 - `disabled={expr}` — 条件禁用 - `selected={expr}` — 条件选中
子节点文本可作为 `label` 的简写(与 `label=` 属性互斥):
<Button primary="" on-click={on_click}>点击我</Button>
子节点 / 插槽
不支持容器子节点。仅单个文本子节点可替代 `label` 属性。
完整示例
来自 `demo/src/cases/button_case.rml`:
<component>
<div class="case-pane">
<h2 class="case-title">{t("case.button.title")}</h2>
<p class="count">{button_demo_text}</p>
<div class="button-row">
<Button label={t("case.button.primary")} primary="" on-click={on_button_demo_click} />
<Button label={t("case.button.ghost")} ghost="" on-click={on_button_demo_click} />
<Button label={t("case.button.danger")} danger="" on-click={on_button_demo_click} />
</div>
</div>
</component>
常见错误
1. **使用 `variant="primary"`** — RML 不支持 `variant` 属性,应写 `primary=""`。 2. **混用 `<button>` 与 `<Button>`** — 小写 `button` 不走组件路由,无 gpui-component 样式。 3. **期望 `onchange`** — Button 仅支持 `on-click`,`onchange` 在 codegen 中被忽略。
相关组件
- [button-group.md](./button-group.md) — 按钮组 - [builtin-html.md](./builtin-html.md) — 原生 `button` 轨
RML 未覆盖的 gpui-component API
`.dropdown_menu()`、`.keyboard_shortcut()` 等 builder 方法需在 Rust 中手写 `Button::new(...)` 构造。