使用策略模式来封装表单校验参数

使用策略模式的好处就是可以封装算法,替换算法。在掘金上看到这么一篇文章:

https://juejin.cn/post/7069395092036911140

于是自己根据原文代码进行了优化:

/**
 * @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()

经过测试,应该没什么问题,以后可以拿来做字段校验用

posted @   SuanYunyan  阅读(120)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示