如何实现element-ui校验多个表单项

项目场景:

表单内配置用户标签,可配置多个,一个标签全部项配置完毕才可新增。

解决方案:

官方文档

validateField	对部分表单字段进行校验的方法	Function(props: array | string, callback: Function(errorMessage: string))

validateField支持数组,并且它的回调函数是每个元素调一次。如果想实现需求中的校验全部项是否都配置完毕就需要用到Promise.all()。

<template>
	<div
        v-for="(tagItem, index) in form.detainConfigList"
        :key="index"
	>
		<el-form-item
          :prop="'detainConfigList.' + index+'.userTags'"
          :rules="[{ required: true, message: '请选择用户标签', trigger: ['blur', 'change'] }]"
          :label="'选择用户标签'+(index+1)+':'"
        >
        	......
        	<el-button
            	v-if="index === form.detainConfigList.length-1"//仅最后一个标签可新增
            	class="button-box"
            	type="primary"
            	@click="addCardPackage(index)"
          	>
            	新增
          	</el-button>
          	<el-button
            	class="button-box"
            	type="danger"
            	:disabled="index===0"//第一个标签禁止删除,至少要有一个标签
           		@click="deleteCardPackage(index)"
          	>
            	删除
          	</el-button>
        </el-form-item>
        ......
	</div>
</template>
<script>
export default{
 methods:{
    async addCardPackage(index) {
      const { detainConfigList } = this.form;
      const { length } = this.form.detainConfigList;
      const fieldsToValidate = [`detainConfigList.${index}.userTags`, `detainConfigList.${index}.a`];//需要校验的prop数组
      //条件展示
      if (detainConfigList[index].a === 1) {
        fieldsToValidate.push(`detainConfigList.${index}.b`);
      }
      if (detainConfigList[index].a === 2) {
        fieldsToValidate.push(`detainConfigList.${index}.c`);
      }
      const promiseList = [];//存储promise结果
      fieldsToValidate.forEach((item) => {
        const promiseItem = new Promise((resolve) => {
          this.$refs.form.validateField(item, (error) => {
            if (!error) {
              resolve(true);
            } else {
              resolve(false);
            }
          });
        });
        promiseList.push(promiseItem);
      });
      const list = await Promise.all(promiseList);
      if (list.indexOf(false) === -1) {//不存在false,即全部通过校验
        if (length < 10) {
          this.form.detainConfigList.push({
            userTags: [],
            a: '',
            b: '',
            c: '',
          });
        } else {
          this.$message({
            message: '最多只能添加10组',
            type: 'warning'
          });
        }
      } else {
        this.$message({
          message: '当前标签未配置完成,不可新增',
          type: 'warning'
        });
      }
    },
 }
};
</script>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值