可用 Proxy 拦截 set 实现表单字段实时校验,通过 schema 管理类型、必填、正则、范围等规则,在 handler.set 中执行验证并维护 errors 状态,提供 isValid、validate、reset 等接口。
可以用 Proxy 拦截 set 操作,在赋值时实时校验字段值是否符合预设规则,从而构建一个带自动校验能力的表单模型。核心在于把校验逻辑封装进 handler.set,并配合字段元数据(如类型、必填、正则、范围等)统一管理。
每个字段应有独立的校验配置,例如:
/^[^s@]+@[^s@]+.[^s@]+$/)这些规则可集中存在一个 schema 对象中,键为字段名,值为校验配置对象。
在 handler.set 中,先根据字段名查 schema,再执行对应校验逻辑。若失败,可抛出错误或静默记录到内部 errors 对象中(推荐后者,便于表单 UI 展示):
required 判断是否为空;再按 type 做基础类型转换与判断(如 Number(value) 是否为有效数字)pattern、min、max 等逐项验证,任一失败即标记该字段错误target[key] = value),并清除该字段的错误信息Proxy 实例应提供便捷接口,方便外部使用:
isValid():返回整个表单是否无错误errors(getter):返回当前所有字段的错误消息对象,如 { email: '邮箱格式不正确' }
validate(field?):手动触发单个字段或全部字段校验(用于失焦/提交前兜底)reset():清空值和错误,重置为初始状态这些方法可挂载在 Proxy 外层包装类上,保持 Proxy handler 职责单一。
初始化时传入初始值和 schema:
const form = new ValidatedForm({ email: '', age: ''}, { email: { required: true, type: 'email', message: '请输入有效邮箱' }, age: { type: 'number', min: 0, max: 120, message: '年龄应在 0–120 之间' }});
后续赋值即自动校验:
form.email = 'test'; // errors.email = '请输入有效邮箱'form.email = '[email protected]'; // errors.email 清空form.age = 130; // errors.age = '年龄应在 0–120 之间'
搭配 Vue/React 使用时,可监听 errors 变化驱动 UI 更新,无需额外绑定校验逻辑。