Input
概述
`Input` 是 gpui-component 文本输入框的 RML 封装,**Stateful** 组件。支持 `value={field}` 自动双向绑定(InputStateBridge 机制),与小写 `<input>` 行为一致。
基本用法
<!-- PascalCase Input 自动双向绑定 -->
<Input value={username} placeholder="用户名" />
<!-- 小写 input 同样自动双向绑定 -->
<input value={username} placeholder="用户名" />
属性
| 属性 | 类型 | 绑定 | 说明 | |------|------|------|------| | `placeholder` | 字符串 | — | 占位文字 | | `label` | 字符串 | `{expr}` | 标签文字 | | `tooltip` | 字符串 | — | 悬停提示 | | `disabled` | 布尔 | `{expr}` | 禁用 | | `value` | 任意 | `{field}` | **自动双向绑定**(InputStateBridge 机制) | | `small` / `large` 等 | 布尔标志 | — | 与其他组件共享的尺寸/变体属性 |
事件
| 事件 | 回调签名 | 说明 | |------|----------|------| | `on-change` | `fn(&mut self, state: &InputState, cx: &mut Context<Self>)` | 输入内容变化;**仅 Input/TextInput 支持** | | `on-click` | `fn(&mut self, ev: &ClickEvent, cx: &mut Context<Self>)` | 点击 |
数据绑定
`value={field}` 自动双向绑定
`<Input value={field}>` 与小写 `<input value={field}>` 行为一致,均通过 InputStateBridge 自动双向同步:
- **正向同步**(VM→UI):render 时对比字段版本号,变化则 `InputState::set_value` - **反向同步**(UI→VM):订阅 `InputEvent::Change`,回写字段 + `bump_version` + `cx.notify()`
<Input value={username} placeholder="用户名" />
支持 `value={field | Converter}` 转换器语法(如 `Currency`、`Percent`)。
`<Input>` ref 模式
通过 `ref="name"` 引用手动管理的 `Entity<InputState>`,适用于需要自定义 InputState 配置的场景。需在 struct 中声明 `input_state: Option<Entity<InputState>>` 并在 `on_loaded` 中初始化。
子节点 / 插槽
KeyBinding 声明式子节点(推荐)
`Input` 可包含若干自闭合 `<KeyBinding>` 子节点,编译器自动包裹监听快捷键:
<Input ref="demo_input" placeholder="按 Ctrl+S">
<KeyBinding key="Ctrl+S" on-press={on_save} />
</Input>
仅允许 `KeyBinding` 作为子节点;不可混入文本或其他元素。详见 [key-binding.md](./key-binding.md)。
文本 label
可选单个文本子节点作为 `label`(与 KeyBinding 子节点互斥使用场景需注意:有 KeyBinding 时勿再加文本子节点)。
完整示例
<Input value={username} placeholder="用户名" />
<p>当前用户名:{username}</p>
常见错误
1. **缺少 `input_state` 字段** — 仅 `ref` 模式需要;`value={field}` 自动双向绑定无需手动声明 `Entity<InputState>`。 2. **在 Button 上写 `on-change`** — 仅 Input/TextInput 映射 `on-change`。
相关组件
- [key-binding.md](./key-binding.md) — Input 内声明式快捷键 - [text-input.md](./text-input.md) — 同 `Input` 的别名标签 - [builtin-html.md](./builtin-html.md) — 小写 `<input>` 双向绑定详解
RML 未覆盖的 gpui-component API
`.prefix()`、`.suffix()`、`.mask()`、`.cleanable()` 等 Input builder 方法需 Rust 手写。