一百行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 相关文章推荐
JavaScript 快捷键设置实现代码
Mar 13 Javascript
jquery中获得$.ajax()事件返回的值并添加事件的方法
Apr 15 Javascript
查看图片(前进后退)功能实现js代码
Apr 24 Javascript
JavaScript 操作table,可以新增行和列并且隔一行换背景色代码分享
Jul 05 Javascript
JavaScript中var关键字的使用详解
Aug 14 Javascript
asp知识整理笔记3(问答模式)
Sep 27 Javascript
JS实现的仿东京商城菜单、仿Win右键菜单及仿淘宝TAB特效合集
Sep 28 Javascript
jquery实现手风琴效果
Nov 20 Javascript
详解angularJs中自定义directive的数据交互
Jan 13 Javascript
原生JavaScript实现todolist功能
Mar 02 Javascript
详解50行代码,Node爬虫练手项目
Apr 22 Javascript
vue 查看dist文件里的结构(多种方式)
Jan 17 Javascript
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
PHP动态图像的创建
2006/10/09 PHP
php专用数组排序类ArraySortUtil用法实例
2015/04/03 PHP
详解PHP中instanceof关键字及instanceof关键字有什么作用
2015/11/05 PHP
php生成唯一数字id的方法汇总
2015/11/18 PHP
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
javascript 对象比较实现代码
2009/04/27 Javascript
jQuery 解析xml文件
2009/08/09 Javascript
分享一个asp.net pager分页控件
2012/01/04 Javascript
JavaScript中的this关键字介绍与使用实例
2013/06/21 Javascript
用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例
2013/06/25 Javascript
通过一段代码简单说js中的this的使用
2013/07/23 Javascript
javascript Array.prototype.slice的使用示例
2013/11/14 Javascript
判断某个字符在一个字符串中是否存在的js代码
2014/02/28 Javascript
jQuery中prepend()方法使用详解
2015/08/11 Javascript
基于Vuejs框架实现翻页组件
2020/06/29 Javascript
JavaScript实现一个空中避难的小游戏
2017/06/06 Javascript
vue项目中导入swiper插件的方法
2018/01/30 Javascript
JavaScript实现的简单加密解密操作示例
2018/06/01 Javascript
iconfont的三种使用方式详解
2018/08/05 Javascript
python静态方法实例
2015/01/14 Python
python如何使用unittest测试接口
2018/04/04 Python
Python检测数据类型的方法总结
2019/05/20 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
2019/05/23 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
Pytorch 多块GPU的使用详解
2019/12/31 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
2020/01/02 Python
Python unittest discover批量执行代码实例
2020/09/08 Python
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
成人大专自我鉴定范文
2013/10/19 职场文书
物理系毕业生自荐书范文
2014/02/22 职场文书
生产车间标语
2014/06/11 职场文书
观看信仰心得体会
2014/09/04 职场文书
2015年公司新年寄语
2014/12/08 职场文书
建筑工程挂靠协议书
2016/03/23 职场文书
python双向链表实例详解
2022/05/25 Python