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 ...
随机推荐
- tcp的3次握手4次挥手
- 数据分析中常用的Excel函数
数据分析中excel是一个常见且基础的数据分析工具,要想掌握好它,学会使用其中的常用函数是一个绕不过去的坎.从网上搜集的资料来说,基本上确定了数据分析中Excel的常用函数有以下这六类 数学函数:SU ...
- Vue3.0网页版聊天|Vue3.x+ElementPlus仿微信/QQ界面|vue3聊天实例
一.项目简介 基于vue3.x+vuex+vue-router+element-plus+v3layer+v3scroll等技术构建的仿微信web桌面端聊天实战项目Vue3-Webchat.基本上实现 ...
- size_t 、wchar_t和 ptrdiff_t
size_t在C语言中就有了. 它是一种"整型"类型,里面保存的是一个整数,就像int, long那样.这种整数用来记录一个大小(size).size_t的全称应该是size ty ...
- 删除无用docker镜像
docker images | grep none | grep -v grep | awk '{print $3}' | xargs docker rmi -f
- Codeforces Round #677 (Div. 3)【ABCDE】
比赛链接:https://codeforces.com/contest/1433 A. Boring Apartments 题解 模拟即可. 代码 #include <bits/stdc++.h ...
- poj1180 Batch Scheduling
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3590 Accepted: 1654 Description There ...
- CodeForces - 916C 思维
题意:给你n,m,表示n个顶点和m条边,让你构造一个图. 要求 1.1->n最短路为素数 2.最小生成树边权和为prime 3.没有重边 4.边大小[1,1e9]. (题目给定m>n-1) ...
- AtCoder Beginner Contest 179 E - Sequence Sum (模拟)
题意:\(f(x,m)\)表示\(x\ mod\ m\),\(A_{1}=1\),而\(A_{n+1}=f(A^{2}_{n},M)\),求\(\sum^{n}_{i=1}A_{i}\). 题解:多算 ...
- 【cpp上】课后正误小题
State whether each of the following is true or false. If false, explain why. Assume the state ment u ...