平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“如何给element plus中动态form-item增加校验的可行做法”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际使用顺序,把思路、关键写法和容易踩坑的地方讲清楚,方便你直接对照操作。
element plus中的form组件自带校验机制
在常规采用场景里,表单项是固定的、明确的,且数量不会太多。
校验规则的采用
如下所示:
.... 这里要重点说明prop的设置,这是给动态表单项增加校验的关键所在。
由于是动态生成表单项,所以代码可能如下所示
代码说明:arry是数组类型的响应式对象如:
const arry=ref([{name:'a'},{name:'b'}])在这个场景下,这个arry可能是从后台接口得到的数据。所以由该数据生成的表单项是动态的。
根据推测,校验机制可能是这样的
1.对于每个表单项要能确定其采用的校验规则,这个基本在定义阶段就可以确定下来(行内定义校验规则;或者单独定义且保证规则名与prop值一致);
2.在应用校验规则时要能拿到到表单项的当前值。而表单项的当前值我们一般用v-model指令绑定到响应式数据对象上了。所以只要能取到对应的响应式数据即可。
从实现思路看,这就体现prop属性的第二个作用了,定位响应数据的访问路径。(第一个作用是匹配校验规则)
实际处理时,借助
与 中的 model属性值+prop属性值组合:"arry['"+index+'].name" 来确定数据访问路径。 落到代码里,这里可能会有疑问,为什么不能像
那样用v-for迭代过程中的变量,如上代码中的item来写:prop="item.name"。v-for及迭代变量item是渲染界面时用的。渲染完,item就不存在,不能访问了。而我们的校验是在渲染完后才启用的。必须保证后面阶段也能访问到对应数据。index渲染完也是不可访问的。只是上面的写法相当于把index当时的值固化下来了,是后面也能访问到。用的是字符串拼接来引用index,相当于闭包的作用。只要符合这样的机制,访问路径即便更复杂,比如双重迭代。也是可以采用自带校验的。 优化:
结合项目来看,上面介绍的规则定义是放在
行内定义的,在有些场景下,比如:一张大的填报报表,都是需输入大于0的数值的。 当然上面的表单项本身是动态生成的,手写规则的地方也不算多。
从实现思路看,为便于验证猜想,及优化代码。能不能定义一个规则函数,将这个函数设置给 :rules属性。经过实验是可以的。
const ruleFloat=(msg)=>{ return { pattern:/^\d+(\.\d+)?$/, message:`${msg}应为大于0的数值`, trigger:'blur' } }而采用地方改为如下所示:
这样采用校验规则既满足了动态表单的需求,也最大限度地减少代码。
在这个场景下,最后一点,在报表填报中,是不适合在输入框附近显示校验失败信息的。改为浮动弹框提示比较好。如用ElMessage.error('xx')。具体实现方式如下所示:
从实现思路看,在
上设置属性,:show-message="false" 即关闭文本信息显示,增加校验事件处理函数@validate(每个表单项验证时都会触发该事件) 在这个场景下,在处理函数中根据函数参数(prop,isValid,message)进行弹窗提示,详情看官方文档。
结合项目来看,最后提交数据时,一般会调用表单对象的验证方法,这个方法会再对每个表单项进行验证,如有未验证借助的,会依次触发@validate事件,也就依次弹窗提示,体验不是很好。
落到代码里,可以只弹一次给个笼统点的提示,如:还有校验未借助的数据,请先修改。此时可以设置个开关量,当个表单项输入时可以开启弹窗提示,提交表单时,就不用一个个提示了。
总结
落到代码里,总的来说,element plus动态form-item这部分内容适合结合实际项目边做边理解。先抓住核心思路,再逐步补上细节和边界处理,最后效果会更稳定,也更容易复用。

