vue实现一行多列的表单校验

背景:在开发过程中,经常会遇到一行多列的情况,并且需要做表单校验,element文档给的required案列是单列输入框,使用场景不符合动态一行多列验证

第一种方式:一个表单,循环多行

代码:

 <el-form ref="form" :model="form" label-width="80px">
      <el-form-item label="参数值" v-for="(item, index) in form.locationParamList">
        <el-col :span="24" >
          <el-col :span="6">
            <el-form-item :prop="'locationParamList.' + index + '.x'" :rules="rules.x" style="margin-right: 7px">
              <el-input v-model="item.x" placeholder="请输入X坐标"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item :prop="'locationParamList.' + index + '.y'" :rules="rules.y" style="margin-right: 7px">
              <el-input v-model="item.y" placeholder="请输入Y坐标"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item :prop="'locationParamList.' + index + '.pageNum'" :rules="rules.pageNum" style="margin-right: 7px">
              <el-input v-model="item.pageNum" placeholder="请输入页码"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="3">
            <el-button type="danger" v-if="index !== 0"  @click="deleteRow(index)">删除</el-button>
            <el-button type="success" v-if="index === 0" @click="addRow()">添加</el-button>
          </el-col>

        </el-col>

      </el-form-item>
    </el-form>
 data(){
    return {
      title: "坐标参数配置",
      form: {
        locationParamList: [
          {
            x: '',
            y: '',
            pageNum: '',
          }
        ],
      },
      rules: {
        x: [
          {required: true, message: "X坐标不能为空", trigger: 'change'},
        ],
        y: [
          {required: true, message: "Y坐标不能为空", trigger: 'change'},
        ],
        pageNum: [
          {required: true, message: "页码不能为空", trigger: 'change'},
        ]
      }
    }
  },

效果:

 注意:

 如果遇到这个报错,原因可能为:

 

 循环的list不在form里面,在其他开发的时候也会单独写一个对象去循环,貌似也没出错,但是当el-form-item是循环出来的,貌似必须放在form下,当时找了好久问题,特记录下

第二种方式:循环多个表单,即原先的一行现在定义为一个表单

代码:

<el-form :ref="'locationParamList' + index" :rules="rules" v-for="(item, index) in locationForm.locationParamList" :model="locationForm" label-width="80px">
      <el-form-item label="参数值" >
        <el-col :span="24" >
          <el-col :span="6">
            <el-form-item prop="x" style="margin-right: 7px">
              <el-input v-model="item.x" placeholder="请输入X坐标"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item prop="y" style="margin-right: 7px">
              <el-input v-model="item.y" placeholder="请输入Y坐标"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item prop="pageNum" style="margin-right: 7px">
              <el-input v-model="item.pageNum" placeholder="请输入页码"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="3">
            <el-button type="danger" v-if="index !== 0"  @click="deleteRow(index)">删除</el-button>
            <el-button type="success" v-if="index === 0" @click="addRow()">添加</el-button>
          </el-col>

        </el-col>

      </el-form-item>
    </el-form>
 data(){
    return {
      title: "坐标参数配置",
      form: {
        locationParamList: [
          {
            x: '',
            y: '',
            pageNum: '',
          }
        ],
      },
      rules: {
        x: [
          {required: true, message: "X坐标不能为空", trigger: 'change'},
        ],
        y: [
          {required: true, message: "Y坐标不能为空", trigger: 'change'},
        ],
        pageNum: [
          {required: true, message: "页码不能为空", trigger: 'change'},
        ]
      }
    }
  },
 submitForm:function() {
      let resultList = []
      let that = this
      function check(name){
        let result = new Promise((resolve, reject) => {
          that.$refs[name][0].validate(valid => {
            if (valid) {
              resolve(true)
            }else{
              reject()
            }
          })
        })
        resultList.push(result)
      }

      for(let i = 0; i < this.locationForm.locationParamList.length; i++){
        check('locationParamList' + i)
      }
      Promise.all(resultList).then(res => {
       // 提交后台
      }).catch(e => {
      })

循环处理每个表单的校验,校验完成之后再回调提交后台,结果也如上图所示

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue3中,可以使用Element UI实现多个表单校验。 首先,我们需要安装Element UI库,并在Vue组件中引入所需的表单组件。 ```bash npm install element-plus ``` 然后,在Vue组件中引入Element UI库和所需的表单组件。 ```vue <template> <el-form ref="form" :model="formData" :rules="formRules"> <el-form-item label="姓名" prop="name"> <el-input v-model="formData.name"></el-input> </el-form-item> <el-form-item label="年龄" prop="age"> <el-input v-model="formData.age"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="validateForm">提交</el-button> </el-form-item> </el-form> </template> <script> import { ref } from 'vue'; import { ElForm, ElFormItem, ElInput, ElButton } from 'element-plus'; export default { components: { ElForm, ElFormItem, ElInput, ElButton, }, setup() { const formData = ref({ name: '', age: '', }); const formRules = ref({ name: [ { required: true, message: '请输入姓名', trigger: 'blur' }, ], age: [ { required: true, message: '请输入年龄', trigger: 'blur' }, { type: 'number', message: '年龄必须是数字', trigger: 'blur' }, { min: 18, max: 100, message: '年龄必须在18到100之间', trigger: 'blur' }, ], }); const validateForm = () => { // 触发表单校验 ref.$refs.form.validate((valid) => { if (valid) { // 表单校验通过,可以进行提交操作 console.log('表单校验通过'); } else { // 表单校验失败,无法提交 console.log('表单校验失败'); } }); }; return { formData, formRules, validateForm, }; }, }; </script> ``` 上述代码中,使用了`ElForm`、`ElFormItem`、`ElInput`和`ElButton`这些Element UI的表单组件来实现多个表单校验。这里定义了两个表单项"姓名"和"年龄",分别设置了校验规则。通过点击提交按钮时,调用`validateForm`方法来触发表单校验,并根据校验结果进行相应的操作。 以上就是在Vue3中使用Element UI实现多个表单校验的方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值