一百行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 相关文章推荐
jquery JSON的解析方式
Jul 25 Javascript
JavaScript iframe的相互操作浅析
Oct 14 Javascript
跨域表单提交状态的变相判断代码
Nov 12 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
Nov 22 Javascript
jQuery Mobile中的button按钮组件基础使用教程
May 23 Javascript
详解微信小程序——自定义圆形进度条
Dec 29 Javascript
微信小程序 五星评价功能的实现
Mar 09 Javascript
JS实现websocket长轮询实时消息提示的效果
Oct 10 Javascript
vue实现鼠标经过动画
Oct 16 Javascript
element表格翻页第2页从1开始编号(后端从0开始分页)
Dec 10 Javascript
Vue父子传递实例讲解
Feb 14 Javascript
详解Vue串联过滤器的使用场景
Apr 30 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中的mb_detect_encoding函数使用方法
2015/08/18 PHP
浅谈php+phpStorm+xdebug配置方法
2015/09/17 PHP
php实现的Curl封装类Curl.class.php用法实例分析
2015/09/25 PHP
PHP Trait代码复用类与多继承实现方法详解
2019/06/17 PHP
关于__defineGetter__ 和__defineSetter__的说明
2007/05/12 Javascript
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
JavaScript修改css样式style
2008/04/15 Javascript
JavaScript 全面解析各种浏览器网页中的JS 执行顺序
2009/02/17 Javascript
基于JQuery的Pager分页器实现代码
2010/07/17 Javascript
js将当前时间格式转换成时间搓(自写)
2013/09/26 Javascript
使用GruntJS构建Web程序之安装篇
2014/06/04 Javascript
js操作css属性实现div层展开关闭效果的方法
2015/05/11 Javascript
JavaScript判断数组重复内容的两种方法(推荐)
2016/06/06 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
JavaScript实现form表单的多文件上传
2020/03/27 Javascript
angular4中关于表单的校验示例
2017/10/16 Javascript
JavaScript 正则命名分组【推荐】
2018/06/07 Javascript
vue实现底部菜单功能
2018/07/24 Javascript
js实现窗口全屏示例详解
2019/09/17 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
详解python的几种标准输出重定向方式
2016/08/15 Python
Python运算符重载详解及实例代码
2017/03/07 Python
Tensorflow之Saver的用法详解
2018/04/23 Python
TensorFlow数据输入的方法示例
2018/06/19 Python
Python快速转换numpy数组中Nan和Inf的方法实例说明
2019/02/21 Python
如何基于Django实现上下文章跳转
2020/09/16 Python
TensorFlow的环境配置与安装方法
2021/02/20 Python
世界上最大的家庭自动化公司:Smarthome
2017/12/20 全球购物
定制别致的瑜伽垫:Sugarmat
2019/06/21 全球购物
公司领导推荐信
2013/11/12 职场文书
房产销售经理职责
2013/12/20 职场文书
《假如》教学反思
2014/04/17 职场文书
应急管理培训方案
2014/06/12 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书