美文网首页
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