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 创建简单的表单同步验证器的更多相关文章

  1. 原生JS 表单提交验证器

    转载:http://www.cnblogs.com/sicd/p/4613628.html 一.前言 最近在开发一个新项目,需要做登陆等一系列的表单提交页面.在经过“缜密”的讨论后,我们决定 不用外部 ...

  2. JS表单原生验证器

    一.前言 最近在开发一个新项目,需要做登陆等一系列的表单提交页面.在经过“缜密”的讨论后,我们决定 不用外部流行的框架,如bootstrap,由于我负责的模块 仅仅是其中的一部分,因此少数服从多数,无 ...

  3. 创建简单的表单Demo

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. jQuery form插件的使用--用 formData 参数校验表单,验证后提交(简单验证).

    Form Plugin API 里提供了很多有用的方法可以让你轻松的处理表单里的数据和表单的提交过程. 测试环境:部署到Tomcat中的web项目. 一.引入依赖js <script src=& ...

  5. aspx中的表单验证 jquery.validate.js 的使用 以及 jquery.validate相关扩展验证(Jquery表单提交验证插件)

    这一期我们先讲在aspx中使用 jquery.validate插件进行表单的验证, 关于MVC中使用 validate我们在下一期中再讲     上面是效果,下面来说使用步骤 jQuery.Valid ...

  6. 用jQuery写的最简单的表单验证

    近几天完成了关于我们项目的最简单的表单验证,是用jQuery写的,由于之前也一直没学过jQuery,所以自己也是一直处于边摸索边学习的阶段,经过这一段时间的学习,通过查资料啥的,也发现了学习jQuer ...

  7. angularjs学习第四天笔记(第一篇:简单的表单验证)

    您好,我是一名后端开发工程师,由于工作需要,现在系统的从0开始学习前端js框架之angular,每天把学习的一些心得分享出来,如果有什么说的不对的地方,请多多指正,多多包涵我这个前端菜鸟,欢迎大家的点 ...

  8. Struts2之Action三种接收参数形式与简单的表单验证

    有了前几篇的基础,相信大家对于Struts2已经有了一个很不错的认识,本篇我将为大家介绍一些关于Action接收参数的三种形式,以及简单的表单验证实现,下面进入正题,首先我们一起先来了解一下最基本的A ...

  9. 使用 layUI做一些简单的表单验证

    使用 layUI做一些简单的表单验证 <form method="post" class="layui-form" > <input name ...

随机推荐

  1. LOJ1036

    AHOI 2008 聚会 Y 岛风景美丽宜人,气候温和,物产丰富.Y 岛上有 N 个城市,有 N-1 条城市间的道路连接着它们.每一条道路都连接某两个城市.幸运的是,小可可通过这些道路可以走遍 Y 岛 ...

  2. Java服务端性能优化

    <Java程序性能优化>说性能优化包含五个层次:设计调优.代码调优.JVM调优.数据库调优.操作系统调优. 常用的几个代码优化方案: 使用单例 对于IO处理.数据库连接.配置文件解析加载等 ...

  3. 面向对象编程(UDP协议)

    UDP协议 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无 ...

  4. centos设系统置语言为中文

    [root@host /]# vim /etc/sysconfig/i18n #i18n 是 internationalization 的缩写形式,意即在 i 和 n 之间有 18 个字母,本意是指软 ...

  5. Think in Java 第三章操作符

    Think in Java 第三章操作符 赋值 对象赋值 ​ 我们真正操作的是对对象的引用.所以倘若"将一个对象赋值给另一个对象",实际上是将"引用"从一个地方 ...

  6. 配置七牛云图床 + Typora

    配置七牛云图床工具 使用图床+Typora可以方便快捷的撰写图文博客 我这里以七牛云进行示例,讲解如何去配置 七牛云是属于收费图床,目前还在测试,不过对于使用量不大的我来说应该免费是足够了的,不过需要 ...

  7. PHP基础之与MySQL那些事

    前言 这篇文章会对PHP的MySQL扩展库,MySQLI的扩展库,SQL批量执行,事务控制等等进行一些简单的讲解. MySQL扩展 PHP中MySQL扩展,虽然因为安全的原因,在PHP5.6及往上不在 ...

  8. XV6学习(11)Lab thread: Multithreading

    代码放在github上. 这一次实验感觉挺简单的,特别是后面两个小实验.主要就是对多线程和锁进行一个学习. Uthread: switching between threads 这一个实验是要实现一个 ...

  9. mac外接键盘HOME,END键问题

    参考: How to Fix the Home and End Buttons for an External Keyboard in Mac mac老用户应该都知道, MAC自带的键盘的 cmd+左 ...

  10. [CF套题] CF-1201

    CF-1201 传送门 # = * A 500 B 1000 C 1500 D 2000 E1 2000 E2 1000 1 (2217) 1672 482 00:09 400 01:40 790 0 ...