表单校验的规范

Element-UI的表单校验如果不按照官网官方写,可能会出现很多校验怪异的问题,特总结如下。

  • el-form上必须绑定**:model属性**,而不是绑定v-model属性。
  • el-form标签的rules属性上绑定整个表单的校验规则
  • rules除了可以添加成el-form标签的属性外,还可以单独的为el-form-item添加rules,单独的会覆盖整体的
  • el-form-item的prop属性作用:根据el-form上绑定的rules属性和这个prop属性来找到这一项的检验规则,所以prop属性的值必须在rules属性中
  • 找到校验规则后 根据el-form的model属性和el-form-item的prop属性找要校验的变量。所以我们的输入框应该正确的绑定变量

具体如下

<template>
  <!-- 测试Element-UI的表单校验问题 -->
  <div>
    <!-- 1.el-form标签的rules属性上绑定整个表单的校验规则 -->
    <el-form :model="formData" ref="formData" label-width="100px" :rules="formRules">
      <!-- 2.prop属性作用:根据el-form上绑定的rules属性和这个prop属性来找到这一项的检验规则,也就是this.formRules[id] -->
      <!-- 找到校验规则后 根据el-form的model属性和el-form-item的prop属性找要校验的变量(也就是this.formData[id]) 判断是否满足该项的校验规则 -->
      <el-form-item prop="id" label="学号">
        <!-- 3.v-model必须绑定给formData.id,否则无法正常校验(根据第2条规则) -->
        <el-input v-model="formData.id"></el-input>
      </el-form-item>
      <!-- 4.rules除了可以添加成el-form标签的属性外,还可以单独的为el-form-item添加rules,单独的会覆盖整体的 -->
      <el-form-item prop="name" label="姓名" :rules="[{ required: true, message: '姓名不能为空222', trigger: 'blur' }]">
        <el-input v-model="formData.name"></el-input>
      </el-form-item>
      <el-form-item prop="age" label="年龄">
        <!-- 6.经测试v-model实际上可以不直接绑定formData.age,但是必须将v-model的值同步给formData.age -->
        <!-- 这里通过watch监视otherage的值,同步给formData.age -->
        <el-input v-model="otherage"></el-input>
      </el-form-item>
      <el-form-item prop="date" label="姓名" :rules="[{ required: true, message: '日期不能为空', trigger: 'blur' }]">
        <el-date-picker align="right" v-model="formData.date" type="date" placeholder="选择日期"
          format='yyyy-MM-dd' value-format='yyyy-MM-dd'> </el-date-picker>
      </el-form-item>
    </el-form>
    <el-button @click="handleSubmit">提交</el-button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      otherage: '',
      formRules: {
        id: [{ required: true, message: '学号不能为空', trigger: 'blur' }],
        name: [{ required: true, message: '姓名不能为空', trigger: 'blur' }],
        age: [{ required: true, message: '年龄不能为空', trigger: 'blur' }]
      },
      formData: {
        id: '',
        name: '',
        age: '',
        date: '',
        qt: '',
        phones: {
          price: '',
          weight: ''
        }
      }
    }
  },
  methods: {
    handleSubmit() {
      const t = this
      // 在点击提交之前校验表单
      t.$refs.formData.validate(valid => {
        alert(valid)
      })
    }
  },
  watch: {
    otherage(v, o) {
      this.formData.age = v
    },
    value(v, o) {
      this.localValue = this.value
    }
  }
}
</script>

在这里插入图片描述

表单嵌套时的校验问题

在一个el-form中嵌套了一个el-form的情况

<template>
  <div>
    <!-- 测试Element-UI的表单el-form嵌套时的校验问题 -->
    <el-form :model="formData" ref="formData" label-width="100px" :rules="formRules">
      <el-form-item prop="id" label="学号">
        <el-input v-model="formData.id"></el-input>
      </el-form-item>
      <el-form-item prop="name" label="姓名" :rules="[{ required: true, message: '姓名不能为空222', trigger: 'blur' }]">
        <el-input v-model="formData.name"></el-input>
      </el-form-item>
      <el-form-item label="手机展示">
        <el-form :model="formData.phones" :rules="formRules" ref="formData2" label-width="100px">
          <!--
            同样注意el-form的model属性和rules属性 以及el-form-item的prop属性 以及输入框绑定的变量 这几个地方就行了
            el-form的rules属性和el-form-item的prop属性 得到校验规则 -> formRules[price]
            el-form的model属性和el-form-item的prop属性 得到要校验的对象 -> formData.phones.price
           -->
          <el-form-item label="价格" prop="price">
            <el-input v-model="formData.phones.price"></el-input>
          </el-form-item>
          <br />
          <el-form-item label="重量" prop="weight" :rules="{ required: true, message: '重量不能为空', trigger: 'blur' }">
            <el-input v-model="formData.phones.weight"></el-input>
          </el-form-item>
        </el-form>
      </el-form-item>
    </el-form>
    <el-button @click="handleSubmit">提交</el-button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      otherage: '',
      formRules: {
        id: [{ required: true, message: '学号不能为空', trigger: 'blur' }],
        name: [{ required: true, message: '姓名不能为空', trigger: 'blur' }],
        price: { required: true, message: '价格不能为空', trigger: 'blur' }
      },
      formData: {
        id: '',
        name: '',
        phones: {
          price: '',
          weight: ''
        }
      }
    }
  },
  computed: {},
  methods: {
    handleSubmit() {
      let validFlag = false
      this.$refs.formData.validate(valid => {
        if (!valid) {
          validFlag = false
        }
      })
      this.$refs.formData2.validate(valid => {
        if (!valid) {
          validFlag = false
        }
      })
      // 如果validFlag不为false 说明表格中有未通过的项目
      if (!validFlag) {
        alert('请填写完整')
      }
    }
  },
  watch: {
    value(v, o) {
      this.localValue = this.value
    }
  }
}
</script>

<style lang="less"></style>

在这里插入图片描述

GitHub 加速计划 / eleme / element
14
1
下载
A Vue.js 2.0 UI Toolkit for Web
最近提交(Master分支:2 个月前 )
c345bb45 1 年前
a07f3a59 * Update transition.md * Update table.md * Update transition.md * Update table.md * Update transition.md * Update table.md * Update table.md * Update transition.md * Update popover.md 1 年前
Logo

新一代开源开发者平台 GitCode,通过集成代码托管服务、代码仓库以及可信赖的开源组件库,让开发者可以在云端进行代码托管和开发。旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐