一百行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 相关文章推荐
function, new function, new Function之间的区别
Mar 08 Javascript
js 实现 input type=&quot;file&quot; 文件上传示例代码
Aug 07 Javascript
javascript设置金额样式转换保留两位小数示例代码
Dec 04 Javascript
javaScript中的this示例学习详解及工作原理
Jan 13 Javascript
JavaScript中读取和保存文件实例
May 08 Javascript
JS实现从网页顶部掉下弹出层效果的方法
Aug 06 Javascript
js基础之DOM中document对象的常用属性方法详解
Oct 28 Javascript
利用VUE框架,实现列表分页功能示例代码
Jan 12 Javascript
javaScript手机号码校验工具类PhoneUtils详解
Dec 08 Javascript
node.js中TCP Socket多进程间的消息推送示例详解
Jul 10 Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
Nov 02 Javascript
微信小程序实现购物页面左右联动
Feb 15 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 什么是PEAR?(第三篇)
2009/03/19 PHP
php获取数组中重复数据的两种方法
2013/06/28 PHP
php实现字符串反转输出的方法
2015/03/14 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
2015/09/29 PHP
JS对HTML标签select的获取、添加、删除操作
2013/10/17 Javascript
js通过元素class名字获取元素集合的具体实现
2014/01/06 Javascript
JQuery自动触发事件的方法
2015/06/13 Javascript
JavaScript中三种异步上传文件方式
2016/03/06 Javascript
浅谈JavaScript对象与继承
2016/07/10 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
2016/08/18 Javascript
Javascript中arguments对象的详解与使用方法
2016/10/04 Javascript
微信小程序 教程之小程序配置
2016/10/17 Javascript
Angular实现响应式表单
2017/08/04 Javascript
Vue2.0子同级组件之间数据交互方法
2018/02/28 Javascript
jQuery滑动效果实现方法分析
2018/09/05 jQuery
一百行JS代码实现一个校验工具
2019/04/30 Javascript
JavaScript字符串处理常见操作方法小结
2019/11/15 Javascript
Vue中引入svg图标的两种方式
2021/01/14 Vue.js
[56:18]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
深入理解python中的浅拷贝和深拷贝
2016/05/30 Python
详解python中的json的基本使用方法
2016/12/21 Python
TensorFlow平台下Python实现神经网络
2018/03/10 Python
Python实现计算圆周率π的值到任意位的方法示例
2018/05/08 Python
python寻找list中最大值、最小值并返回其所在位置的方法
2018/06/27 Python
详解python while 函数及while和for的区别
2018/09/07 Python
PyTorch: Softmax多分类实战操作
2020/07/07 Python
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
计算机求职信
2013/12/01 职场文书
工程师岗位职责规定
2014/02/26 职场文书
运动与健康自我评价
2015/03/09 职场文书
护士自我推荐信范文
2015/03/24 职场文书
结婚喜宴祝酒词
2015/08/10 职场文书
2016最新离婚协议书范本及程序
2016/03/18 职场文书
MySql 8.0及对应驱动包匹配的注意点说明
2021/06/23 MySQL
Alexa停服!网站排名将何去何从?目前还没有替代品。
2022/04/15 杂记
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
2022/04/21 Python