美文网首页
Note3 elementUI表单验证填坑

Note3 elementUI表单验证填坑

作者: kyuuuuu | 来源:发表于2018-03-01 21:47 被阅读0次

开发项目中被element ui的一个表单验证搞得有点头大。没头没脑的过完年回来上班突然间茅塞顿开(谁知道我咋了),重新认识了一下自己,表单验证中我主要犯的错误是对于callback()这个函数的使用:同志们呐,无论做了什么样的自定义验证一定要callback,callback(new Error(‘...’) callback()

下面是我觉得比较有用的一个文章。参见链接哈。

(链接)

  • 自定义表单验证 validate / resetFields 未定义

    原因分析:
    1. 要验证的DOM,还没加载出来
    2. 有可能 " this.$refs[ruleForm].validate() " 方式不识别,需要使用 “ this.$refs.ruleForm.validate() ”
    解决方法:
    1. 要验证的DOM,还没加载出来
this.ticketDialog = true;

//对整个表单进行重置,将所有字段值重置为初始值并移除校验结果

this.$nextTick(function() {

 this.$refs.ticketInfoForm.resetFields();

})

2. 有可能this.$refs[ruleForm].validate() 方式不识别。需要使用: this.$refs.ruleForm.validate()

methods: {   
  submitForm(ruleForm2) {
    //官网 this.$refs[ruleForm2].validate();  
    //在实际使用中,会报错。validate未定义
    //使用this.$refs.ruleForm2.validate(); 成功。
    this.$refs[ruleForm2].validate((valid) => {
      if (valid) {
        alert('submit!');
      } else {
        console.log('error submit!!');
        return false;
      }
    });
  }
}

js属性访问的方式,有两种。一种是'.'点访问方式;一种是'[]'中括号访问方式。
若读取一个不存在的属性,将返回undefined(未定义)。
点访问方式,属性名称必须是一个静态字符串,不能为变量
中括号访问方式,属性名称可以为一个静态字符串,也可以为一个变量。若为变量,访问的属性为变量表示的值。
按以上说明,中括号访问方式灵活性很大。
饿了么用中括号来访问属性,没什么问题。

  • 数字类型的验证, 兼容mac和windows系统

数字类型的验证需要在 v-model 处加上 .number 的修饰符,这是 Vue 自身提供的用于将绑定值转化为 number 类型的修饰符。

<el-form-item label="年龄" prop="age">
    <el-input type="number" v-model.number="ruleForm2.age"></el-input>
</el-form-item>

(codepen)
html:

<script src="//unpkg.com/vue/dist/vue.js"></script>
<script src="//unpkg.com/element-ui/lib/index.js"></script>
<div id="app">
<el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
  <el-form-item label="密码" prop="pass">
    <el-input type="password" v-model="ruleForm.pass" auto-complete="off"></el-input>
  </el-form-item>
  <el-form-item label="确认密码" prop="checkPass">
    <el-input type="password" v-model="ruleForm.checkPass" auto-complete="off"></el-input>
  </el-form-item>
  <el-form-item label="年龄" prop="age">
    <el-input type="number" v-model.number="ruleForm.age"></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>
</div>

css:

@import url("//unpkg.com/element-ui/lib/theme-default/index.css");

js:

 var Main = {
    data() {
      var checkAge = (rule, value, callback) => {
        if (!value) {
          return callback(new Error('年龄不能为空'));
        }
        setTimeout(() => {
          if (!Number.isInteger(value)) {
            callback(new Error('请输入数字值'));
          } else {
            if (value < 18) {
              callback(new Error('必须年满18岁'));
            } else {
              callback();
            }
          }
        }, 1000);
      };
      var validatePass = (rule, value, callback) => {
        if (value === '') {
          callback(new Error('请输入密码'));
        } else {
          if (this.ruleForm.checkPass !== '') {
            this.$refs.ruleForm.validateField('checkPass');
          }
          callback();
        }
      };
      var validatePass2 = (rule, value, callback) => {
        if (value === '') {
          callback(new Error('请再次输入密码'));
        } else if (value !== this.ruleForm.pass) {
          callback(new Error('两次输入密码不一致!'));
        } else {
          callback();
        }
      };
      return {
        ruleForm: {
          pass: '',
          checkPass: '',
          age: ''
        },
        rules: {
          pass: [
            { validator: validatePass, trigger: 'blur' }
          ],
          checkPass: [
            { validator: validatePass2, trigger: 'blur' }
          ],
          age: [
            { validator: checkAge, trigger: 'blur' }
          ]
        }
      };
    },
    methods: {
      submitForm(ruleForm) {
        //官网 this.$refs[ruleForm].validate();  
        //在实际使用中,会报错。validate未定义
        // 
        //使用this.$refs.ruleForm.validate(); 成功。
        this.$refs.ruleForm.validate((valid) => {
          if (valid) {
            alert('submit!');
          } else {
            console.log('error submit!!');
            return false;
          }
        });
      },
      resetForm(formName) {
        this.$nextTick(function() {
          this.$refs[formName].resetFields();
         })
      }
    }
  }
var Ctor = Vue.extend(Main)
new Ctor().$mount('#app')

相关文章

网友评论

      本文标题:Note3 elementUI表单验证填坑

      本文链接:https://www.haomeiwen.com/subject/xtnnxftx.html