element表单非必填自定义校验规则

使用场景

众所周知element自带了一些校验规则,比如说校验一些值的类型我们可以改变input的type属性来达到我们想要效果,如何是必填,我们rules中加入required为true就好,如果你的表单中的值不是必填项,但只要有值就要校验值的格式呢?格式的规则element本身没有,所以我们要自定义校验规则。两个问题,自定义校验规则怎么写?非必填怎么做?

必填校验规则与自定义校验规则

首先我们看必填的校验规则写法

data(){
    return{
          rules:{
        policyair: [{ required: true, message: "校验失败的消息提示", trigger: "change" }]
        }
    }
}

这时候有人就要说了,非必填你把required改为false或者压根不写不就完事了嘛,当然这只是其一,这个我当然知道,但不是我遇到的坑,我们先看自定义校验规则写在哪。

 data() {
    let checkwhitename = (rule, value, callback) => {
      const regwhitename = /^\w{2}(,\w{2})*$/;
        if (regwhitename.test(value)) {
           return callback();
        }else{
          callback(new Error("请参照示例输入白名单或黑名单"));
        }
    };
    return {
       rules:{
        policyair: [{validator: checkwhitename, trigger: "blur" }]
        }
    }

首先两点要注意,第一点,自定义校验规则的函数写在data中,但不是在retrun的{}中,至于为什么我也不明白,这个函数只要按照element的规则使用会传入五个参数,但是通常只用三个,第一个rule是当前参与规则校验的对象,value是参与校验的值,callback是成功之后的回调。第二点,这个自定义校验的函数,需要在rules中作为参与校验的对象中validator的值。在校验policyair中我把required属性删掉了,就是非必填,我以为这样我可以下班了,可当我提交表单时,总是提示校验不通过,还就是这个非必填的表单不通过,于是我们把required写成false还是不行,于是我把问题锁定在自定义校验函数上。

重写自定义函数解决bug

关键问题还是在于这个callback,这里callback就相当于next(),没有它整个程序不会往下走。

 data() {
    let checkwhitename = (rule, value, callback) => {
      const regwhitename = /^\w{2}(,\w{2})*$/;
      if (!value) { //所以当没有值的时候,我们直接callback,让他不校验直接执行下一步
        return callback()
      }else{
        if (regwhitename.test(value)) {  //验证通过也下一步
           return callback();
        }else{
          callback(new Error("请参照示例输入白名单或黑名单")); //验证不通过下一步只是抛出个错误
        }
      }
    };
    return {
       rules:{
        policyair: [{validator: checkwhitename, trigger: "blur" }]
        }
    }

这样我的问题就解决了,当我们做自定义校验的时候,正则可以网上找,校验的逻辑我们还是要稍微注意一下的。问题虽然不大,但浪费时间,希望大家不要走和我一样的弯路。

猜你喜欢

转载自blog.csdn.net/m0_52313178/article/details/119281852