用Map构建“字段名-验证器”映射引擎,核心是将各表单字段校验逻辑封装为可复用、动态注册/替换的函数,以字段名为键、验证函数为值存入Map,实现结构与规则解耦,适配配置化表单、多语言及动态策略场景。

用 Map 构建“字段名-验证器”映射引擎,核心是把每个表单字段的校验逻辑封装成可复用、可动态注册/替换的函数,并以字段名为键、验证函数为值存入 Map。这种方式解耦了字段结构与验证规则,特别适合配置化表单、多语言场景或运行时动态加载校验策略的系统。
字段名作为键,验证器作为值
Map 的本质是键值对容器,天然适配“字段名 → 验证逻辑”的映射关系。例如:
-
key:字符串,如
"email"、"passwordConfirm"、"phone" -
value:函数(或对象),接收字段值,返回
true或错误消息字符串,如(val) => !val ? '必填' : !/^\S+@\S+\.\S+$/.test(val) ? '邮箱格式不正确' : true
这样,新增字段只需往 Map 里 set('newField', validatorFn);移除字段调用 delete('oldField') 即可,无需修改主校验流程。
支持嵌套字段与动态路径解析
复杂表单常含数组、对象嵌套(如 users[0].name、address.zipCode)。此时字段名不能只用简单字符串作 key,需支持路径式解析:
- 将
"users[0].name"拆解为路径数组['users', '0', 'name'],再递归取值 - Map 中仍用原始字符串为 key,但验证器内部自动处理路径提取(例如用 Lodash 的
get(obj, path)) - 也可扩展 Map 键类型:用
Map结构,显式声明取值路径
按条件组合多个验证器
单个字段往往需要多个校验(如非空 + 长度 + 正则),可让 value 不是单个函数,而是验证器数组或链式执行器:
- 存储为
Map.set('password', [isRequired, minLength(8), hasNumber]) - 执行时遍历数组,逐个调用,遇到第一个失败即返回错误,或聚合所有错误
- 进阶可引入优先级、分组(如“基础校验”“业务校验”),通过字段元数据(如
validations: ['required', 'unique'])动态查 Map 获取对应函数
与表单状态联动,实现即时反馈
Map 本身不触发重绘,需配合状态驱动更新。常见做法:
- 维护一个
errors: Map,初始全为null - 监听字段变化时,从主验证 Map 中取出对应验证器,执行并更新 errors 对应 key 的值
- 组件中通过
errors.get('email')直接读取错误信息,无需 switch 或 if 判断字段名 - 支持批量校验:遍历 Map.keys(),统一触发全部验证,用于提交前兜底










