动态表单提交校验的核心是状态聚合与触发可控:各字段主动上报valid状态,父组件用reactive对象集中管理;提交前强制全量校验并拦截无效操作;规则随字段增减动态生成;禁用原生submit,手动控制校验时机。

动态表单的整体提交与校验,核心在于“状态聚合”和“触发可控”——不是靠手动遍历每个字段去 check,而是让每个字段主动上报自身状态,再由父级统一汇总判断是否可提交。
用响应式对象集中管理各字段校验结果
每个动态字段(比如循环生成的输入框)应独立完成基础校验,并通过 emit 或 计算属性 + watch 向上反馈 valid 状态。父组件用一个响应式对象收集这些结果:
- 定义 fieldStatus = reactive({}),键为字段唯一标识(如
email-0、phone-1) - 子组件在失焦或输入后调用
this.$emit('validate', { key: 'email-0', valid: true, message: '' }) - 父组件监听该事件,更新
fieldStatus['email-0'] = { valid, message }
提交前强制触发全量校验并拦截无效操作
点击提交按钮时,不直接发请求,而是先确保所有字段都已完成一次校验:
分析 Vue 3 Composition API 使用情况——审计响应式模式、可组合函数设计、ref 与 reactive 的选择、计算属性、watcher 使用及组件……
- 遍历
fieldStatus,对其中valid === undefined的字段,主动调用其validate()方法(需子组件暴露该方法) - 等待所有校验完成(可用
Promise.all包裹异步校验逻辑) - 检查
Object.values(fieldStatus).every(item => item?.valid),任一为 false 则阻止提交,并高亮对应项
动态规则随字段增减实时生效
当新增/删除一行表单项时,校验规则不能写死,必须跟着数据结构变化:
立即学习“前端免费学习笔记(深入)”;
- 将
rules设为计算属性,内部根据formList.length动态生成每行的 rule 配置 - 例如:对第
i行的姓名字段,rule 的prop写成`name.${i}`,对应 v-model 为formList[i].name - 使用
el-form时,配合:rules="dynamicRules"和ref="formRef",提交前调用formRef.validate()即可触发整套内置校验流程
避免默认行为干扰,控制校验时机
禁用原生 form @submit,改用 @click.prevent 手动控制流程:
- 防止用户按回车意外绕过校验逻辑
- 把“输入中不报错、失焦才提示、提交前强校验”三阶段逻辑完全掌握在自己手里
- 结合
watch监听字段值变化,但只在touched为 true 后才执行正则等耗资源判断

















