js表单校验类

思路

传入规则对象rules,和表单数据formdata。规则对象是key:value形式,这个value是每一项的规则数组。循环变量规则对象的根据规则对象的key去校验formdata对应的数据。返回整个表单数据校验结果valid和错误信息errorMessage
就图一乐,我自己写着玩,真校验害得antdesign,element

源码

/**
 * @classdesc 表单校验类
 * @private {valid: boolean} 校验结果
 * @private {errorMessage: array} 错误信息
 * @param {rules: object}  规则对象
 * @param {form: object} 表单对象
 * @param {rulesItem: objectArray} 规则项对象数组
 * @param {required: boolean; min: number;max: number;idcard: boolean; tel:boolean; email: boolean} 规则每一项
 */

class Validate {
  constructor(rules, form) {
    if (new.target === Validate) {
      this.valid = true // 校验结果
      this.errorMessage = [] // 错误信息
      if (rules === undefined || typeof rules !== 'object') {
        throw new Error('必须传入规则对象');
      } else {
        this.rules = rules // 规则对象
      }
      if (form === undefined || typeof form !== 'object') {
        throw new Error('必须传入表单对象');
      } else {
        this.form = form // 表单对象
      }
    } else {
      throw new Error('必须使用 new 命令生成实例');
    }
  }

  // 校验必填
  checkRequired (field) {
    if (!field) return false
    return true
  }

  // 校验身份证
  checkIdCard (field) {
    if (!/^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$/g.test(field)) return false
    return true
  }

  // 校验手机号(最宽松)
  checkTel (field) {
    if (!/^(?:(?:\+|00)86)?1\d{10}$/g.test(field)) return false
    return true
  }

  // 校验邮箱
  checkEmail (field) {
    if (!/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/g.test(field)) return false
    return true
  }

  // 校验min
  checkMin (min, field) {
    if (typeof min !== "number" || typeof field !== "number") return false
    if (field < min) return false
    return true
  }

  // 校验max
  checkMax (max, field) {
    if (typeof max !== "number" || typeof field !== "number") return false
    if (field > max) return false
    return true
  }

  // 进行校验
  __validateForm () {
    // 遍历规则对象去表单数据匹配
    for (const ruleItemKey of Object.keys(this.rules)) {
      let ruleItem = this.rules[ruleItemKey]
      for (let i = 0; i < ruleItem.length; i++) {
        if (ruleItem[i].required !== undefined && ruleItem[i].required) {
          this.valid = this.valid && this.checkRequired(this.form[ruleItemKey])
          if (!this.checkRequired(this.form[ruleItemKey])) this.errorMessage.push(ruleItem[i].message)
        }
        // 该字段必填或者该字段不为空
        if (ruleItem[i].required || this.form[ruleItemKey]) {
          if (ruleItem[i].idcard !== undefined && ruleItem[i].idcard) {
            this.valid = this.valid && this.checkIdCard(this.form[ruleItemKey])
            if (!this.checkIdCard(this.form[ruleItemKey])) this.errorMessage.push(ruleItem[i].message)
          }
        }
        if (ruleItem[i].required || this.form[ruleItemKey]) {
          if (ruleItem[i].tel !== undefined && ruleItem[i].tel) {
            this.valid = this.valid && this.checkTel(this.form[ruleItemKey])
            if (!this.checkTel(this.form[ruleItemKey])) this.errorMessage.push(ruleItem[i].message)
          }
        }
        if (ruleItem[i].required || this.form[ruleItemKey]) {
          if (ruleItem[i].email !== undefined && ruleItem[i].email) {
            this.valid = this.valid && this.checkEmail(this.form[ruleItemKey])
            if (!this.checkEmail(this.form[ruleItemKey])) this.errorMessage.push(ruleItem[i].message)
          }
        }
        if (ruleItem[i].required || this.form[ruleItemKey]) {
          if (ruleItem[i].min !== undefined && ruleItem[i].min) {
            this.valid = this.valid && this.checkMin(ruleItem[i].min, this.form[ruleItemKey])
            if (!this.checkMin(ruleItem[i].min, this.form[ruleItemKey])) this.errorMessage.push(ruleItem[i].message)
          }
        }
        if (ruleItem[i].required || this.form[ruleItemKey]) {
          if (ruleItem[i].max !== undefined && ruleItem[i].max) {
            this.valid = this.valid && this.checkMax(ruleItem[i].max, this.form[ruleItemKey])
            if (!this.checkMax(ruleItem[i].max, this.form[ruleItemKey])) this.errorMessage.push(ruleItem[i].message)
          }
        }
      }
    }
    return this.valid
  }
}

const rules = {
  sfzh: [
    { required: true, message: 'Please input idcard' },
    { idcard: true, message: 'idCard number should be 18 length character' }
  ],
  tel: [
    { tel: true, message: 'tel should be 11 length character, please input correct tel' }
  ],
  testmin: [
    { min: 6, message: 'you input value should not less than min value' }
  ],
  testmax: [
    { max: 8, message: 'you input value should not greater than max value' }
  ],
  dzyx: [
    { required: true, message: 'Please input email' },
    { email: true, message: 'you input email incorrect, please input correct email' }
  ]
}

const formData = {
  sfzh: '',
  name: '',
  tel: '1536052111',
  testmin: 5,
  testmax: 9,
  dzyx: '2219455886@qq.com'
}

const valid = new Validate(rules, formData)
const result = valid.__validateForm()
console.log(`校验结果${result}`)
console.log('错误提示', valid.errorMessage)

效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值