使用策略模式来封装表单校验参数
使用策略模式的好处就是可以封装算法,替换算法。在掘金上看到这么一篇文章:
于是自己根据原文代码进行了优化:
/**
* @Author: fanx
* @Date: 2022年07月26日 19:29
* @Description: file content
*/
/**
* 验证策略类
* @type {Object}
*/
const strategies = {
isNotEmpty: function (value, errMsg) {
if ([null, undefined, '', 'null', 'undefined'].includes(value.replace(/\s+/g, ''))) {
return errMsg;
}
},
minLenth: function (value, errMsg, length) {
if (value.length < length) {
return errMsg;
}
},
isMobile: function (value, errMsg) {
if (!/^1[3|5|8][0-9]{9}$/.test(value)) {
return errMsg;
}
}
}
/**
* 验证工具类
* @param value 需要验证的参数对象
* @param strategy 验证策略类
* @param rules 验证规则,传入数组
* @param autoInterrupt 是否自动中断验证,当有字段验证不通过时,不在继续往后验证
*/
function doValidate({ value, strategy, rules, autoInterrupt = false }) {
const result = {
state: false,
msgList: []
};
if(Object.keys(value || {}).length === 0){
throw new Error('传入的验证参数不能为空');
}
if(!(rules instanceof Array)){
throw new Error('验证规则必须为数组格式');
}
if(rules.length === 0){
throw new Error('验证规则不能为空');
}
for (let i = 0; i < rules.length; i++) {
const ruleItem = rules[i];
const { key, rule, msg } = ruleItem;
let ruleParams = rule.split(':');
let methodName = ruleParams[0];
let methodParams = ruleParams.slice(1);
if(!strategy[methodName]){
throw new Error(`验证规则${methodName}不存在传入的策略类上`)
}
if(!value[key]){
throw new Error(`验证字段${key}不存在要验证的对象上`)
}
const errorMsg = strategy[methodName].apply(value, [value[key], msg, ...methodParams]);
if(errorMsg){
result.msgList.push({ field: key, msg: errorMsg });
}
if(autoInterrupt){
break;
}
}
result.msgList.length > 0 ? result.state = false : result.state = true;
return result;
}
function test(){
const formValue = {
name: 'xiaoming',
age: 20.0,
sex: 'female',
mobile: '1310249412'
}
const validateConfig = {
value: formValue,
strategy: strategies,
rules: [
{
key: 'name',
rule: 'isNotEmpty',
msg: '用户名不能为空或者包含空格字符'
},
{
key: 'mobile',
rule: 'minLenth:11',
msg: '手机号最低为11位'
}
],
autoInterrupt: false
}
const validate_result = doValidate(validateConfig);
console.log(validate_result);
}
test()
经过测试,应该没什么问题,以后可以拿来做字段校验用
分类:
JavaScript
, Js设计模式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)