一百行JS代码实现一个校验工具


Posted in Javascript onApril 30, 2019

做过校验需求的小伙伴们都知道,校验其实是个麻烦事。

规则多,需要校验的字段多,都给我们前端带来巨大的工作量。

一个不小心,代码里就出现了不少if else等不可维护的代码。

因此,我觉得一个团队或者是一个项目,需要一个校验工具,简化我们的工作。

首先,参考一下 Joi。只看这一小段代码:

Joi.string().alphanum().min(3).max(30).required()

我希望我的校验工具Coi也是链式调用,链式调用可以极大的简化代码。

校验呢,其实主要就3个入参:需要校验的数据,提示的错误信息,校验规则。

哎 直接把代码贴出来吧,反正就一百行,一目了然:

export default class Coi {
  constructor(prop) {
    this.input = prop
    this.errorMessage = '通过校验' // 错误信息
    this.pass = true // 校验是否通过
  }
  // 数据输入
  data(input) {
    if (!this.pass) return this
    this.input = input
    return this
  }
  // 必填,不能为空
  isRequired(message) {
    if (!this.pass) return this
    if (
      /^\s*$/g.test(this.input) ||
      this.input === null ||
      this.input === undefined
    ) {
      this.errorMessage = message
      this.pass = false
    }
    return this
  }
  // 最小长度
  minLength(length, message) {
    if (!this.pass) return this
    if (this.input.length < length) {
      this.errorMessage = message
      this.pass = false
    }
    return this
  }
  // 最大长度
  maxLength(length, message) {
    if (!this.pass) return this
    if (this.input.length > length) {
      this.errorMessage = message
      this.pass = false
    }
    return this
  }
  // 需要的格式 number: 数字, letter: 字母, chinese: 中文
  requireFormat(formatArray, message) {
    if (!this.pass) return this
    let formatMap = {
      number: 0,
      letter: 0,
      chinese: 0
    }
    Object.keys(formatMap).forEach(key => {
      if (formatArray.includes(key)) formatMap[key] = 1
    })
    let formatReg = new RegExp(
      `^[${formatMap.number ? '0-9' : ''}${
        formatMap.letter ? 'a-zA-Z' : ''
      }${formatMap.chinese ? '\u4e00-\u9fa5' : ''}]*$`
    )
    if (!formatReg.test(this.input)) {
      this.errorMessage = message
      this.pass = false
    }
    return this
  }
  // 邮箱校验
  isEmail(message) {
    if (!this.pass) return this
    const emailReg = /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/
    if (!emailReg.test(this.input)) {
      this.errorMessage = message
      this.pass = false
    }
    return this
  }
  // ulr校验
  isURL(message) {
    if (!this.pass) return this
    const urlReg = new RegExp(
      '^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$',
      'i'
    )
    if (!urlReg.test(this.input)) {
      this.errorMessage = message
      this.pass = false
    }
    return this
  }
  // 自定义正则校验
  requireRegexp(reg, message) {
    if (!this.pass) return this
    if (!reg.test(this.input)) {
      this.errorMessage = message
      this.pass = false
    }
    return this
  }
}

使用姿势如下:

import Coi from 'js-coi'
const validCoi = new Coi()
validCoi
  .data('1234')
  .isRequired('id不能为空')
  .minLength(3, 'id不能少于3位')
  .maxLength(5, 'id不能多于5位')
  .data('1234@qq.')
  .isRequired('邮箱不能为空')
  .isEmail('邮箱格式不正确')
  .data('http:dwd')
  .isRequired('url不能为空')
  .isUrl('url格式不正确')
if (!validCoi.pass) {
  this.$message.error(validCoi.errorMessage)
  return
}

当然你只校验一个字段的话也可以这么使用:

import Coi from 'js-coi'
const idCoi = new Coi('1234')
idCoi
  .isRequired('id不能为空')
  .minLength(3, 'id不能少于3位')
  .maxLength(5, 'id不能多于5位')
  .isEmail('id邮箱格式不正确')
  .isUrl('id格式不正确')
  .requireFormat(['number', 'letter', 'chinese'], 'id格式不正确')
  .requireRegexp(/012345/, 'id格式不正确')
if (!idCoi.pass) {
  this.$message.error(idCoi.errorMessage)
  return
}

总结

以上所述是小编给大家介绍的一百行JS代码实现一个校验工具,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
SeaJS入门教程系列之SeaJS介绍(一)
Mar 03 Javascript
JS基于面向对象实现的拖拽库实例
Sep 24 Javascript
浅析Bootstrap验证控件的使用
Jun 23 Javascript
js点击按钮实现水波纹效果代码(CSS3和Canves)
Sep 15 Javascript
js仿网易表单及时验证功能
Mar 07 Javascript
jQuery模拟实现天猫购物车动画效果实例代码
May 25 jQuery
微信小程序模板(template)使用详解
Jan 31 Javascript
不得不知的ES6小技巧
Jul 28 Javascript
Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验
Apr 22 Javascript
js继承的这6种方式!(上)
Apr 23 Javascript
vue slot与传参实例代码讲解
Apr 28 Javascript
vue实现下载文件流完整前后端代码
Nov 17 Vue.js
Vue-cli3简单使用(图文步骤)
Apr 30 #Javascript
微信小程序单选radio及多选checkbox按钮用法示例
Apr 30 #Javascript
VSCode使用之Vue工程配置eslint
Apr 30 #Javascript
微信小程序API—获取定位的详解
Apr 30 #Javascript
基于JS开发微信网页录音功能的实例代码
Apr 30 #Javascript
vue前端框架—Mint UI详解(更适用于移动端)
Apr 30 #Javascript
详解Vue+ElementUI从零开始搭建自己的网站(一、环境搭建)
Apr 30 #Javascript
You might like
历史证明,懒惰才是推动科学发展技术进步的动力
2021/03/02 无线电
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
2007/03/29 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
2013/08/08 PHP
php inc文件使用的风险和注意事项
2013/11/12 PHP
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
2015/03/03 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
2017/03/15 PHP
PHP简单实现遍历目录下特定文件的方法小结
2017/05/22 PHP
Laravel框架基于ajax实现二级联动功能示例
2019/01/17 PHP
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
javascript实现添加附件功能的方法
2015/11/18 Javascript
js判断文本框输入的内容是否为数字
2015/12/23 Javascript
jQuery深拷贝Json对象简单示例
2016/07/06 Javascript
jquery属性,遍历,HTML操作方法详解
2016/09/17 Javascript
Javascript动画效果(1)
2016/10/11 Javascript
js中创建对象的几种方式
2017/02/05 Javascript
使用jquery Ajax实现上传附件功能
2018/10/23 jQuery
iview通过Dropdown(下拉菜单)实现的右键菜单
2018/10/26 Javascript
Jquery和CSS实现选择框重置按钮功能
2018/11/08 jQuery
JavaScript this在函数中的指向及实例详解
2019/10/14 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
2019/10/26 Javascript
详解vue3.0 的 Composition API 的一种使用方法
2020/10/26 Javascript
按日期打印Python的Tornado框架中的日志的方法
2015/05/02 Python
python嵌套函数使用外部函数变量的方法(Python2和Python3)
2016/01/31 Python
Python随机函数库random的使用方法详解
2019/08/21 Python
基于python plotly交互式图表大全
2019/12/07 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
2020/07/14 Python
有关pycharm登录github时有的时候会报错connection reset的问题
2020/09/15 Python
python利用paramiko实现交换机巡检的示例
2020/09/22 Python
DNA测试:Orig3n
2019/03/01 全球购物
The Hut美国/加拿大:英国领先的豪华在线百货商店
2019/03/26 全球购物
一套Java笔试题
2016/08/20 面试题
生态学毕业生自荐信
2013/10/27 职场文书
汉语言文学毕业生自荐信范文
2014/03/24 职场文书
家长会欢迎标语
2014/06/24 职场文书
检察院对照“四风”认真查找问题落实整改措施
2014/09/26 职场文书
公司财务人员岗位职责
2015/04/14 职场文书