js 创建简单的表单同步验证器
SyncValidate
declare const uni: any;
export interface SyncValidateOpt {
  [key: string]: SyncValidateFunc[];
}
export interface SyncValidateFunc {
  (input: string | number): string | undefined;
}
/**
 * 同步验证器
 */
export class SyncValidate {
  constructor(public readonly options: SyncValidateOpt) {}
  /**
   * 验证一个
   *
   * check({key: value})
   * @param {Object} keyVal
   */
  check(keyVal: { [key: string]: string | number }): boolean {
    const keys = Object.keys(keyVal);
    if (!keys.length) {
      throw new Error("至少的验证一个.");
    }
    // 只验证一个
    const key = keys[0];
    const val = keyVal[key];
    if (!this.options.hasOwnProperty(key)) {
      throw new Error(`没有设置[${key}]的验证器.`);
    }
    for (let v of this.options[key]) {
      const errorMessage = v(val);
      if (errorMessage) {
        if (
          this.validateErrorListener &&
          typeof this.validateErrorListener === "function"
        ) {
          this.validateErrorListener(errorMessage);
        } else {
          SyncValidate.validateErrorListener(errorMessage);
        }
        // 验证失败立即返回
        return false;
      }
    }
    // 验证ok返回true
    return true;
  }
  /**
   * 验证多个
   * @param keysVals
   */
  checkAll(keysVals: { [key: string]: string | number }): boolean {
    for (let key in keysVals) {
      if (this.check({ [key]: keysVals[key] }) === false) {
        return false;
      }
    }
    return true;
  }
  // 默认的验证错误时的回调函数
  static validateErrorListener(errorMessage: string) {
    uni.showToast({
      icon: "none",
      title: errorMessage,
      duration: 1500,
    });
  }
  private validateErrorListener?: (errorMessage: string) => void;
  // 添加验证错误时的回调函数
  addValidateErrorListener(
    validateErrorListener: (errorMessage: string) => void
  ) {
    this.validateErrorListener = validateErrorListener;
  }
  // 必填
  static required(msg: string): SyncValidateFunc {
    return (input) => {
      if (!input) return msg;
    };
  }
  // 最小长度
  static minLength(len: number, msg: string): SyncValidateFunc {
    return (input) => {
      if (typeof input === "string" && input.length < len) return msg;
    };
  }
  // 最大长度
  static maxLength(len: number, msg: string): SyncValidateFunc {
    return (input) => {
      if (typeof input === "string" && input.length > len) return msg;
    };
  }
  // 简单的验证手机号
  static phone(msg: string, exp?: RegExp): SyncValidateFunc {
    const phoneExp =
      exp ??
      /^((13[0-9])|(14[0-9])|(15[0-9])|(16[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))\d{8}$/;
    return (input) => {
      if (typeof input === "string" && !input.match(phoneExp)) {
        return msg;
      }
    };
  }
  // 简单的判断相等
  static eql(data: any, msg: string): SyncValidateFunc {
    return (input) => {
      if (input !== data) return msg;
    };
  }
  // 简单的判断相等
  static equal(data: any, msg: string): SyncValidateFunc {
    return (input) => {
      if (input != data) return msg;
    };
  }
}
使用
const syncValidate = new SyncValidate({
  username: [
    SyncValidate.required('用户名不能为空!'),
    SyncValidate.phone('请输入正确手机号!'),
  ],
  password: [
    SyncValidate.required('密码不能为空!'),
    SyncValidate.minLength(8, '密码长度必须大于7'),
  ]
});
syncValidate.addValidateErrorListener((errorMessage) => {
  uni.showToast({
    icon: 'none',
    title: errorMessage,
    duration: 1500
  });
})
onLogin() {
if (
    !syncValidate.check({username: this.username.trim()})
    ||
    !syncValidate.check({password: this.password.trim()})
   )
      {
        return;
      }
        ...
}
js:
class SyncValidate {
    constructor(options) {
        this.options = options;
    }
    check(keyVal) {
        const keys = Object.keys(keyVal);
        if (!keys.length) {
            throw new Error("至少的验证一个.");
        }
        const key = keys[0];
        const val = keyVal[key];
        if (!this.options.hasOwnProperty(key)) {
            throw new Error(`没有设置[${key}]的验证器.`);
        }
        for (let v of this.options[key]) {
            const errorMessage = v(val);
            if (errorMessage) {
                if (this.validateErrorListener &&
                    typeof this.validateErrorListener === "function") {
                    this.validateErrorListener(errorMessage);
                }
                else {
                    SyncValidate.validateErrorListener(errorMessage);
                }
                return false;
            }
        }
        return true;
    }
    checkAll(keysVals) {
        for (let key in keysVals) {
            if (this.check({ [key]: keysVals[key] }) === false) {
                return false;
            }
        }
        return true;
    }
    static validateErrorListener(errorMessage) {
        uni.showToast({
            icon: "none",
            title: errorMessage,
            duration: 1500,
        });
    }
    addValidateErrorListener(validateErrorListener) {
        this.validateErrorListener = validateErrorListener;
    }
    static required(msg) {
        return (input) => {
            if (!input)
                return msg;
        };
    }
    static minLength(len, msg) {
        return (input) => {
            if (typeof input === "string" && input.length < len)
                return msg;
        };
    }
    static maxLength(len, msg) {
        return (input) => {
            if (typeof input === "string" && input.length > len)
                return msg;
        };
    }
    static phone(msg, exp) {
        const phoneExp = exp ??
            /^((13[0-9])|(14[0-9])|(15[0-9])|(16[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))\d{8}$/;
        return (input) => {
            if (typeof input === "string" && !input.match(phoneExp)) {
                return msg;
            }
        };
    }
    static eql(data, msg) {
        return (input) => {
            if (input !== data)
                return msg;
        };
    }
    static equal(data, msg) {
        return (input) => {
            if (input != data)
                return msg;
        };
    }
}
js 创建简单的表单同步验证器的更多相关文章
- 原生JS 表单提交验证器
		转载:http://www.cnblogs.com/sicd/p/4613628.html 一.前言 最近在开发一个新项目,需要做登陆等一系列的表单提交页面.在经过“缜密”的讨论后,我们决定 不用外部 ... 
- JS表单原生验证器
		一.前言 最近在开发一个新项目,需要做登陆等一系列的表单提交页面.在经过“缜密”的讨论后,我们决定 不用外部流行的框架,如bootstrap,由于我负责的模块 仅仅是其中的一部分,因此少数服从多数,无 ... 
- 创建简单的表单Demo
		<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ... 
- jQuery form插件的使用--用 formData 参数校验表单,验证后提交(简单验证).
		Form Plugin API 里提供了很多有用的方法可以让你轻松的处理表单里的数据和表单的提交过程. 测试环境:部署到Tomcat中的web项目. 一.引入依赖js <script src=& ... 
- aspx中的表单验证 jquery.validate.js 的使用  以及 jquery.validate相关扩展验证(Jquery表单提交验证插件)
		这一期我们先讲在aspx中使用 jquery.validate插件进行表单的验证, 关于MVC中使用 validate我们在下一期中再讲 上面是效果,下面来说使用步骤 jQuery.Valid ... 
- 用jQuery写的最简单的表单验证
		近几天完成了关于我们项目的最简单的表单验证,是用jQuery写的,由于之前也一直没学过jQuery,所以自己也是一直处于边摸索边学习的阶段,经过这一段时间的学习,通过查资料啥的,也发现了学习jQuer ... 
- angularjs学习第四天笔记(第一篇:简单的表单验证)
		您好,我是一名后端开发工程师,由于工作需要,现在系统的从0开始学习前端js框架之angular,每天把学习的一些心得分享出来,如果有什么说的不对的地方,请多多指正,多多包涵我这个前端菜鸟,欢迎大家的点 ... 
- Struts2之Action三种接收参数形式与简单的表单验证
		有了前几篇的基础,相信大家对于Struts2已经有了一个很不错的认识,本篇我将为大家介绍一些关于Action接收参数的三种形式,以及简单的表单验证实现,下面进入正题,首先我们一起先来了解一下最基本的A ... 
- 使用 layUI做一些简单的表单验证
		使用 layUI做一些简单的表单验证 <form method="post" class="layui-form" > <input name ... 
随机推荐
- Python 2.x 和 Python 3.x
			Python 2.x 默认不支持中文,具体原因,等到介绍 字符编码 时给大家讲解 Python 2.x 的解释器名称是 python Python 3.x 的解释器名称是 python3 目前市场上有 ... 
- Language Guide (proto3) | proto3 语言指南(十三)JSON映射
			JSON Mapping - JSON映射 Proto3支持JSON中的规范编码,使得在系统之间共享数据更加容易.下表按类型对编码进行了描述. 如果JSON编码的数据中缺少一个值或者它的值为null, ... 
- HTML5 网页制作技巧
			本文总结自由人民邮电出版社出版的<HTML.CSS.Javascript网页制作>. 总结进行学习,并分享给同样编写HTML5的朋友. 1:背景音乐的添加 <embed src=&q ... 
- Spring boot AOP 实现Redis 存储
			package com.carloan.common.web.annotation; import java.lang.annotation.*; /** * 自定义redis缓存注解.只要在serv ... 
- Birkhoff-von Neumann Crossbar 光交换网络的调度方案
			Birkhoff-von Neumann Crossbar 光交换网络的调度方案  This is a summary aimed at looking for "high perform ... 
- linux(9)find命令详解
			find命令格式: find path -option [ -print ] [ -exec -ok command ] {} \; find命令的参数: path:要查找的目录路径. ~ 表示$HO ... 
- P1714 切蛋糕  单调队列
			题目: 题目描述 今天是小Z的生日,同学们为他带来了一块蛋糕.这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值. 小Z作为寿星,自然希望吃到的第一块蛋糕的幸运值总和最大, ... 
- 【noi 2.6_7627】鸡蛋的硬度(DP)
			题意:其中n表示楼的高度,m表示你现在拥有的鸡蛋个数. 解法:f[i][j]表示 i 层楼有 j 个鸡蛋时,至少要扔多少次.3重循环,k为测试的楼层,分这时扔下去的鸡蛋碎和不碎的情况.要注意初始化. ... 
- 二、Python基础(input、变量名、条件语句、循环语句、注释)
			一.input用法 input在Python中的含义为永远等待,直到用户输入了值,从而将所输入的值赋值另外的一个东西. n=input('请输入......') 接下来用一个例子学习input的用法 ... 
- PowerShell随笔4---变量
			全局变量 输入$global:后按ctrl+space,我们就可以看到所有的全局变量. 比如我们可以查看PowerShell的版本: 我们可以在在编写脚本代码的时候使用这些变量,globle可以省略, ... 
