Element-ui 表单校验二次封装

本文介绍了如何对Element-UI的表单验证进行二次封装,以实现规则复用和自定义校验。通过提供一个配置参数对象,包括必传、触发事件、错误提示和自定义函数等,简化了表单验证的编写过程。示例代码展示了如何定义和使用这些规则,特别提到了自定义函数中可能遇到的this指向问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Element-ui 表单校验二次封装

说明

  1. 本封装仅仅是将一些校验规则进行循环使用,避免多次重复书写而封装的
  2. 若有更好用的封装请各位大佬艾特我,我必紧紧跟随学习,追随大佬的脚步
  3. 若有更好的思路请留言,感谢

Params

传递参数如下:

querytypedefaultdesc
requiredBoolean默认为false是否必传
triggerString默认为blur触发事件
msgString默认为空错误提示信息
valiString默认为值为非空的规则配置的规则名称
ruleNameStringdata为数组时传入,值为匹配的input框的prop名称
customFunction自定义私有校验规则,类型为function,需添加三个默认参数(rule,value,callback),非必传需要注意的是此处的this指向会有问题

Demo

// customDemo:
 {
    custom:async function (rule,value,callback) {
      let data = {stageCode:value};
      const res = await linkConfig.validateCode(data);
      if(res.success){
        callback()
      }else{
        callback(new Error(res.msg))
      }
    }
  }

以下为封装代码:

/**
 * Created by JiMan on 19/12/30.
 */

/**
 * data参数Objeck/Array
 *   required:是否必传    默认为false                                                         string
 *   trigger:触发事件     默认为blur                                                          string
 *   msg:错误提示信息     默认为空                                                             string
 *   vali:配置的规则名称  默认为值为空的规则                                                     string
 *   ruleName: data为数组时传入,值为匹配的input框的prop名称                                      string
 *   custom: 自定义私有校验规则,类型为function,需添加三个默认参数(rule,value,callback),非必传
 *           需要注意的是此处的this指向会有问题                                                  function
 *
 *   customDemo:
 *        {
            custom:async function (rule,value,callback) {
              let data = {stageCode:value};
              const res = await linkConfig.validateCode(data);
              if(res.success){
                callback()
              }else{
                callback(new Error(res.msg))
              }
            }
          }
 */
const regRules={
  email: /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/,
  idCardNumber:/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/,
  phoneNumber:/^1[3456789]\d{9}$/,
  isPositInt:/^[0-9]$/,
  chinese:/^[\u4e00-\u9fa5]+$/,
  number:/^[0-9]+$/,
}
export function elValidate(data) {
  class FormValidate {
    constructor(json) {
      if (json instanceof Array) {
        this.rules = {}
        for (let k in json) {
          let isHasCustom = Boolean(json[k].custom&&((typeof json[k].custom)=='function'))
          isHasCustom?json[k].vali = 'customFunction':(json[k].vali = json[k].vali ? json[k].vali : 'isNull');
          this.rules[json[k]['ruleName']] = [{
            type: json[k]['type'] || 'string',
            required: json[k]['required'] || false,
            trigger: json[k]['trigger'] || 'blur',
            validator: json[k].custom?this.elValidateRules(json[k].msg,json[k].custom)[json[k].vali]:this.elValidateRules(json[k].msg)[json[k].vali]
          }]
        }
      } else if (json instanceof Object) {
        let isHasCustom = Boolean(json.custom&&((typeof json.custom)=='function'))
        isHasCustom?json.vali = 'customFunction':(json.vali = json.vali ? json.vali : 'isNull');
        this.rules = {
          type: json.type || 'string',
          required: json.required || false, // 是否必填
          trigger: json.trigger || 'blur', // 事件名
          validator: json.custom?this.elValidateRules(json.msg,json.custom)[json.vali]:this.elValidateRules(json.msg)[json.vali]
        }
      }
    }
    elValidateRules(msg,cb) {
      msg = msg ? msg : "";
      return {
        // 非空
        isNull:(rule, value, callback) => {
          if(value instanceof Array&&!value.length){
            callback(new Error(`${msg}不能为空`));
          }else if (!value) {
            callback(new Error(`${msg}不能为空`));
          } else {
            callback();
          }
        },
        // 身份证号
        isIdNumber:(rule,value,callback) =>{
          if(value == ''||!value){
            callback(new Error(`身份证号不能为空`))
          }else if(regRules.idCardNumber.test(value)){
            callback()
          }else{
            callback(new Error(`请输入正确的身份证号`))
          }
        },
        // 中文
        isChinese:(rule,value,callback)=>{
          if(value == ''||!value){
            callback(new Error(`${msg}不能为空`))
          }else if(regRules.chinese.test(value)){
            callback()
          }else{
            callback(new Error(`请输入正确的${msg}`))
          }
        },
        // 手机号码
        isPhoneNumber:(rule,value,callback)=>{
          if(value == ''||!value){
            callback(new Error(`手机号不能为空`))
          }else if(regRules.phoneNumber.test(value)){
            callback()
          }else{
            callback(new Error(`请输入正确的手机号`))
          }
        },
        // 数字
        isNumber:(rule,value,callback)=>{
          if(value === ''||!value){
            callback(new Error(`${msg}不能为空`))
          }else if(regRules.number.test(value)){
            callback()
          }else{
            callback(new Error(`请输入正确的${msg}`))
          }
        },
        // 正整数
        isPositiveInt:(rule,value,callback)=>{
          console.log(value,value-0>=0)
          if(value === '' || typeof (value-0) !== "number"){
            callback(new Error(`${msg}不能为空`))
          }else if(value-0>=0&&value%1==0){
            callback()
          }else{
            callback(new Error(`请输入正确的${msg}`))
          }
        },
        // 邮箱
        email:(rule,value,callback)=>{
          let flag = regRules.email.test(value);
          if(flag){
            callback()
          }else{
            callback(new Error(`请输入正确的邮箱`))
          }
        },
        // 自定义校验
        customFunction: (rule,value,callback) =>{
          cb?cb(rule,value,callback):callback(new Error(`请输入正确的${msg}`));
        }
      }
    }
  }
  return new FormValidate(data).rules
}

调用Demo

new elValidate([
	{
		ruleName: "name",
		vali: "isNull",
		msg: "该项",
		required: true,
		trigger: "change"
	}
])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZemanZhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值