useField
为单个表单控件提供绑定 props 的 Hook。返回值可直接展开到<input>等表单元素上,实现双向绑定。
useField通过 store 实例访问:store.useField(...)。
签名
ts
interface UseFieldType<State extends Dict> {
// 1. 按路径绑定
<Value>(selector: ObjectKeyPaths<ComputedState<State>>,
options?: UseFieldOptions<Value>
): UseFieldBindings<Value>;
// 2. getter/setter 派生绑定
<Value>(getter: (state) => Value,
setter: (input: { value, path, part }, state) => void,
options?: UseFieldOptions<Value>
): UseFieldBindings<Value>;
// 3. 多段绑定(radio/checkbox 等)
<Value>(getters: (path | string[] | getter)[],
setter: UseFieldSetter<Value, State>,
options?: UseFieldOptions<Value>
): UseFieldBindings<Value>[];
}返回值(UseFieldBindings): { name, value, onChange, checked? },直接展开到输入控件:
tsx
<input {...bindPrice} />选项(UseFieldOptions):
| 选项 | 类型 | 说明 |
|---|---|---|
name | string | 字段名,默认取路径 |
type | 'radio' | 'checkbox' | 'select' | 'textarea' | 'input' | 控件类型 |
values | any[] | 多段值列表(radio/checkbox 每段的取值) |
toState | (value, { path, part, stateValue, event }) => Value | 输入值写入状态前的转换,默认实现见字段数据类型 |
fromState | (stateValue, { path, part }) => any | 状态值转换为输入显示值;返回undefined保留原值 |
使用说明
- 路径绑定:
useField('order.price')返回该路径的绑定 props。 - getter/setter:绑定派生值(如
firstName + ' ' + lastName),setter 负责拆分写回。 - radio/checkbox:通过
options.values声明每段取值,返回的绑定对象支持按下标访问各段:bindSex[0]、bindSex[1]。
示例
tsx
const { useField } = createStore({
user: { firstName: 'Zhang', lastName: 'Fisher', age: 18, sex: '男' },
});
// 单值绑定
const firstNameField = useField('user.firstName');
<input {...firstNameField} />
// radio 多段绑定
const sexField = useField('user.sex', { type: 'radio', values: ['男', '女'] });
<input type="radio" {...sexField[0]} />男
<input type="radio" {...sexField[1]} />女运行效果如下:
loading
多段绑定(radio/checkbox):
loading
getter/setter 拆分绑定:
loading
数据类型转换
input的value永远是字符串,而状态中往往是number/boolean等类型。useField内置类型驱动转换:以状态值的原始类型为依据自动转换,无需配置。
默认写入转换(defaultToState,input 值 → 状态值):
| 状态类型 | 输入值 | 写入结果 |
|---|---|---|
number | '123' / '12.5' | 123 / 12.5 |
number | 'abc' / ''(转换为NaN) | 0 |
boolean | 'true' / 'false' | true / false |
boolean | 其他值 | Boolean(输入值) |
string | 任意(含'0123'、'true') | 原样保持字符串,不做类型猜测 |
undefined/null/NaN | — | 按控件类型推断:checkbox→boolean、number/range→number、其余→string |
默认显示转换(defaultFromState,状态值 → input 显示值): 空值(undefined/null/NaN)显示为空字符串,其余原样返回。
loading
toState/fromState可整体替换默认实现,详见字段数据类型。
重载toState(如支持千分位输入):
loading
重载fromState(与toState配对,状态保存原始类型、界面显示友好内容):
loading
注意事项
返回的是绑定 props 而非状态
useField返回的value是快照值,配合受控组件使用。不要通过修改bind.value来更新状态——只能通过用户输入(onChange)或直接修改store.state触发更新。
批量绑定时用 useFields
需要绑定大量字段时,逐个调用useField比较繁琐,可改用useFields一次性生成整棵绑定树。