Vue Element 表单验证

先看一下官网上的表单验证

<el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
  <el-form-item label="活动名称" prop="name">
    <el-input v-model="ruleForm.name"></el-input>
  </el-form-item>
  <el-form-item label="活动区域" prop="region">
    <el-select v-model="ruleForm.region" placeholder="请选择活动区域">
      <el-option label="区域一" value="shanghai"></el-option>
      <el-option label="区域二" value="beijing"></el-option>
    </el-select>
  </el-form-item>
  <el-form-item label="活动时间" required>
    <el-col :span="11">
      <el-form-item prop="date1">
        <el-date-picker type="date" placeholder="选择日期" v-model="ruleForm.date1" style="width: 100%;"></el-date-picker>
      </el-form-item>
    </el-col>
    <el-col class="line" :span="2">-</el-col>
    <el-col :span="11">
      <el-form-item prop="date2">
        <el-time-picker placeholder="选择时间" v-model="ruleForm.date2" style="width: 100%;"></el-time-picker>
      </el-form-item>
    </el-col>
  </el-form-item>
  <el-form-item label="即时配送" prop="delivery">
    <el-switch v-model="ruleForm.delivery"></el-switch>
  </el-form-item>
  <el-form-item label="活动性质" prop="type">
    <el-checkbox-group v-model="ruleForm.type">
      <el-checkbox label="美食/餐厅线上活动" name="type"></el-checkbox>
      <el-checkbox label="地推活动" name="type"></el-checkbox>
      <el-checkbox label="线下主题活动" name="type"></el-checkbox>
      <el-checkbox label="单纯品牌曝光" name="type"></el-checkbox>
    </el-checkbox-group>
  </el-form-item>
  <el-form-item label="特殊资源" prop="resource">
    <el-radio-group v-model="ruleForm.resource">
      <el-radio label="线上品牌商赞助"></el-radio>
      <el-radio label="线下场地免费"></el-radio>
    </el-radio-group>
  </el-form-item>
  <el-form-item label="活动形式" prop="desc">
    <el-input type="textarea" v-model="ruleForm.desc"></el-input>
  </el-form-item>
  <el-form-item>
    <el-button type="primary" @click="submitForm('ruleForm')">立即创建</el-button>
    <el-button @click="resetForm('ruleForm')">重置</el-button>
  </el-form-item>
</el-form>
<script>
  export default {
    data() {
      return {
        ruleForm: {
          name: '',
          region: '',
          date1: '',
          date2: '',
          delivery: false,
          type: [],
          resource: '',
          desc: ''
        },
        rules: {
          name: [
            { required: true, message: '请输入活动名称', trigger: 'blur' },
            { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
          ],
          region: [
            { required: true, message: '请选择活动区域', trigger: 'change' }
          ],
          date1: [
            { type: 'date', required: true, message: '请选择日期', trigger: 'change' }
          ],
          date2: [
            { type: 'date', required: true, message: '请选择时间', trigger: 'change' }
          ],
          type: [
            { type: 'array', required: true, message: '请至少选择一个活动性质', trigger: 'change' }
          ],
          resource: [
            { required: true, message: '请选择活动资源', trigger: 'change' }
          ],
          desc: [
            { required: true, message: '请填写活动形式', trigger: 'blur' }
          ]
        }
      };
    },
    methods: {
      submitForm(formName) {
        this.$refs[formName].validate((valid) => {
          if (valid) {
            alert('submit!');
          } else {
            console.log('error submit!!');
            return false;
          }
        });
      },
      resetForm(formName) {
        this.$refs[formName].resetFields();
      }
    }
  }
</script>

官网的表单验证,是通过在表单上加 rules 属性传入约定的验证规则,并且将 form-itemprop 设置为需要校验的字段名。

需要注意的地方

form-itemprop 值必须与 rules 的属性名一致;

form 绑定的 :model 必须与 form-itemv-model 绑定;

否则,表单验证不通过。

在表单 form-item 上单独添加 rules

这种方式适用于需要个别检验的字段,或者表单字段有变动的校验;

<el-form-item 
  label="电话号码"
  class="el-form-item--small has-error"
  :prop="phoneNum"
  :rules="[
            { required: true, message: '请输入电话号码', trigger: 'blur' }, 
            { required: true, pattern: /^((13|14|15|16|17|18)[0-9]{1}\d{8})|((166|199|198)[0-9]{1}\d{7})$/, message: '请输入正确的电话号码', trigger: 'blur' }
          ]">
    <el-input v-model="v.phoneNum" :maxlength="11" placeholder clearable></el-input>
</el-form-item>

表单验证没有通过,依然提交了!

这个问题,有可能是因为在提交的方法中没有加 this.$refs[formName]

submitForm(formName) {
  this.$refs[formName].validate((valid) => {
    if (valid) {
      // 完成提交表单的操作!
    } else {
      // 返回错误信息!
      console.log('error submit!!');
      return false;
    }
  });
}

方法中的参数 formName 传入的是 Formref 标识。

清除表单验证信息

场景:表单验证出现后,关闭表单重新打开,发现还没有输入值,验证信息就已经出现。

原因:这是因为在表单验证触发后,没有及时清除掉验证,导致再次打开是验证信息还存在。

解决:在关闭表单之前执行清除。

resetForm(formName) {
  this.$refs[formName].resetFields();
}

方法中的参数 formName 传入的是 Formref 标识。

this.$refs['formName'].resetFields()

等价于

this.$refs.formName.resetFields();

清除表单验证信息失效问题

首先,Form表单如何才能够真正使用resetFields:

1.满足ref中定义

2.prop中指定属性

3.model中绑定的属性与prop中相同

使用 $nextTick()

this.$refs['form'].resetFields() 这个做法其实是重置表单到初始值,不是清空表单,当表单第一次在页面中渲染时所用的数据就是初始数据,如果修改对象的表单赋值没有放在 nextTick 中,就会在表单渲染时就会将这个修改对象作为初始值,所以出现无效了。使用 nextTick 保证表单在第一次渲染时是空值就可以了。

this.$nextTick(() => {
    this.$refs['form'].resetFields();
});

nextTick 用法官网是这么说的:

在下次 DOM 更新循环结束之后执行延迟回调。
在修改数据之后立即使用这个方法,获取更新后的 DOM 。

参考文档:
Element UI 官方文档:https://element.eleme.cn/#/zh-CN/component/form
CSDN 文章:https://blog.csdn.net/qq_15674775/article/details/112295845
其他文章:https://www.glxxw2018.com/study/blog/detail/zkhmocawjq.html

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容