表单与校验
三层结构,各管一件事:
一、最小用法
import { ICEForm, ICEFormItem, ICEInputNumber, ICETextField } from 'ice-web-components';
const form = new ICEForm({ width: 320, gap: 12 });
form.addItems([
new ICEFormItem({
name: 'name',
label: '姓名',
control: new ICETextField({ width: 240, placeholder: '请输入姓名' }),
rules: [{ required: true }, { minLength: 2 }],
}),
new ICEFormItem({
name: 'age',
label: '年龄',
control: new ICEInputNumber({ width: 240, value: 18 }),
rules: [{ min: 18, message: '未满 18 岁不能注册' }],
}),
]);
form.onSubmit((values) => console.log(values)); // { name: '...', age: 18 }
button.on('click', () => form.submit()); // 校验不过不会回调
二、规则清单(UIFormRule)
| 规则 | 说明 |
|---|---|
required | 必填;空串 / 空数组 / false / null 都算缺失 |
min / max | 数值上下界(值能转成数字时生效) |
minLength / maxLength | 字符串或数组长度 |
pattern | 正则 |
validator(value, values) | 自定义同步校验:返回文案表示失败 |
asyncValidator(value, values) | 异步校验:返回 Promise<string | null> |
message | 自定义错误文案(不传用默认文案) |
一条规则失败即停止(取第一条错误文案)。
三、异步校验
只在显式调用时才跑 —— 值变化触发的自动校验只跑同步规则,避免每敲一个字就发请求:
form.getModel().getField('name').rules.push({
asyncValidator: (value) =>
fetch('/api/check?name=' + value).then((r) => r.json()).then((d) => (d.taken ? '该用户名已占用' : null)),
});
// 提交时:先同步、后异步;异步期间表单项显示“校验中…”
form.submitAsync().then((ok) => { if (!ok) toast('请检查表单填写', 'error'); });
校验时机的差异(值变化只跑同步,显式调用才跑异步)如下:
也可以单独用:
await form.getModel().validateFieldAsync('name'); // 单字段
await form.getModel().validateAsync(); // 全部字段(并行)
form.getModel().isValidating('name'); // 是否正在校验
四、错误态
ICEFormItem 把错误写进控件的 validateStatus,控件的 __applyValidateState() 钩子负责画红框
(ICETextField / ICESelect / ICEDatePicker / ICETimePicker / ICECascader / ICEInputNumber /
ICEAutoComplete / ICETreeSelect 都已实现),同时错误文案显示在控件下方。