一百行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 Math.floor方法(对数值向下取整)
Jan 09 Javascript
浅谈document.write()输出样式
May 07 Javascript
JavaScript数组迭代器实例分析
Jun 09 Javascript
js随机生成26个大小写字母
Feb 12 Javascript
解析JavaScript面向对象概念中的Object类型与作用域
May 10 Javascript
文件上传插件SWFUpload的使用指南
Nov 29 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
Dec 01 Javascript
javascript输出AscII码扩展集中的字符方法
Dec 26 Javascript
jQuery向webApi提交post json数据
Jan 16 Javascript
[原创]jQuery实现合并/追加数组并去除重复项的方法
Apr 11 jQuery
解决vant的Toast组件时提示not defined的问题
Nov 11 Javascript
JS前端基于canvas给图片添加水印
Nov 11 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模板之Phpbean的目录结构
2008/01/10 PHP
php采集时被封ip的解决方法
2010/08/29 PHP
php后台多用户权限组思路与实现程序代码分享
2012/02/13 PHP
linux使用crontab实现PHP执行计划定时任务
2014/05/10 PHP
ThinkPHP数据操作方法总结
2015/09/28 PHP
推荐:极酷右键菜单
2006/11/29 Javascript
javascript修改IMG标签的src问题
2014/03/28 Javascript
jquery使用each方法遍历json格式数据实例
2015/05/18 Javascript
JS实现HTML表格排序功能
2016/08/05 Javascript
js enter键激发事件实例代码
2016/08/17 Javascript
React Native 图片查看组件的方法
2018/03/01 Javascript
vue富文本框(插入文本、图片、视频)的使用及问题小结
2018/08/17 Javascript
解决betterScroll在vue中存在图片时,出现拉不动的问题
2018/09/27 Javascript
js中int和string数据类型互相转化实例
2019/01/16 Javascript
Vue实现固定定位图标滑动隐藏效果
2019/05/30 Javascript
JS开发自己的类库实例分析
2019/08/28 Javascript
jQuery/JS监听input输入框值变化实例
2019/10/17 jQuery
vue-router路由懒加载及实现的3种方式
2021/02/28 Vue.js
Python如何通过subprocess调用adb命令详解
2017/08/27 Python
python pandas库中DataFrame对行和列的操作实例讲解
2018/06/09 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
Pycharm 实现下一个文件引用另外一个文件的方法
2019/01/17 Python
解决.ui文件生成的.py文件运行不出现界面的方法
2019/06/19 Python
python用match()函数爬数据方法详解
2019/07/23 Python
django-rest-swagger对API接口注释的方法
2019/08/29 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
Python HTMLTestRunner库安装过程解析
2020/05/25 Python
Python根据URL地址下载文件并保存至对应目录的实现
2020/11/15 Python
使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题
2016/06/28 HTML / CSS
运动鞋、街头服装、手表和手袋的实时市场:StockX
2020/11/25 全球购物
音乐之声音乐广播稿
2014/09/10 职场文书
银行转正自我鉴定
2014/09/29 职场文书
党员教师批评与自我批评发言稿
2014/10/15 职场文书
给老师的保证书怎么写
2015/05/09 职场文书
实习证明格式范文
2015/06/16 职场文书
Java中生成微信小程序太阳码的实现方案
2022/06/01 Java/Android