返回

在Element UI中巧妙解决表单验证疑难杂症

前端

一、v-for列表下的表单验证触发秘诀

当您在v-for列表中使用表单验证时,可能会遇到验证无法准确触发的难题。这是因为Element UI的表单验证默认只对当前激活的表单元素进行验证。为了解决这一问题,您需要在v-for列表中使用一个特殊的指令:v-validate-trigger

<template>
  <div>
    <el-form :model="form" :rules="rules" ref="form">
      <el-form-item v-for="(item, index) in formList" :label="item.label" :prop="item.prop">
        <el-input v-model="formList[index].value" v-validate-trigger="change"></el-input>
      </el-form-item>
      <el-button type="primary" @click="submitForm">提交</el-button>
    </el-form>
  </div>
</template>

<script>
export default {
  data() {
    return {
      form: {
        name: '',
        age: ''
      },
      rules: {
        name: [
          { required: true, message: '请输入姓名', trigger: 'change' }
        ],
        age: [
          { required: true, message: '请输入年龄', trigger: 'change' }
        ]
      },
      formList: [
        { label: '姓名', prop: 'name' },
        { label: '年龄', prop: 'age' }
      ]
    }
  },
  methods: {
    submitForm() {
      this.$refs.form.validate((valid) => {
        if (valid) {
          // 表单验证通过,提交表单
        } else {
          // 表单验证失败,提示错误信息
        }
      })
    }
  }
}
</script>

在上面的代码中,我们在v-for列表中的每个el-form-item上都添加了v-validate-trigger="change"指令。这意味着当表单元素的值发生改变时,表单验证将立即触发。这样,您就可以确保在v-for列表下的表单验证能够准确触发。

二、list增删操作时视图正确更新的秘诀

在对list进行增删操作时,您可能会发现视图没有正确更新。这是因为Element UI的表单验证默认只对当前激活的表单元素进行验证。为了解决这一问题,您需要在list增删操作后手动调用$forceUpdate()方法来强制视图更新。

<template>
  <div>
    <el-form :model="form" :rules="rules" ref="form">
      <el-form-item v-for="(item, index) in formList" :key="index" :label="item.label" :prop="item.prop">
        <el-input v-model="formList[index].value"></el-input>
      </el-form-item>
      <el-button type="primary" @click="addForm">添加</el-button>
      <el-button type="primary" @click="deleteForm">删除</el-button>
    </el-form>
  </div>
</template>

<script>
export default {
  data() {
    return {
      form: {
        name: '',
        age: ''
      },
      rules: {
        name: [
          { required: true, message: '请输入姓名' }
        ],
        age: [
          { required: true, message: '请输入年龄' }
        ]
      },
      formList: [
        { label: '姓名', prop: 'name' },
        { label: '年龄', prop: 'age' }
      ]
    }
  },
  methods: {
    addForm() {
      this.formList.push({
        label: '姓名',
        prop: 'name'
      })
      this.$forceUpdate()
    },
    deleteForm() {
      this.formList.pop()
      this.$forceUpdate()
    }
  }
}
</script>

在上面的代码中,我们在添加和删除表单元素后都调用了$forceUpdate()方法。这样,就可以确保视图能够正确更新,并且表单验证能够正常工作。

通过以上两个技巧,您就可以轻松解决Element UI表单验证中的常见疑难杂症,让表单验证更加顺畅和可靠。