如何利用 策略模式 优化表单验证

代码诗人
• 阅读 1399

背景

在做移动端项目开发的时候,经常会遇到各种表单验证,有时候不同的页面,验证规则是一样的 ,如图
如何利用 策略模式 优化表单验证

之前项目里的验证代码写的很凌乱,最近刚好遇到这个模块的功能需要重构,于是对代码做了大量的优化,记录一下如何利用策略模式优化表单验证的

优化前

之前我们的验证代码是这样写的,把验证func写到一个公共模块里面,然后每个方法返回一个包含是否通过和message字段的对象
//common.js
export default {
  validateName: function (data, message = '', flag = false) {
    if (!/xxx/.test(data)) {
      message = '验证不通过提示语'
    } else {
      flag = true
    }
    return {
      message,
      flag
    }
  },
  validatePhone: function (data, message = '') {},
  validateAddress: function (data, message = '') {}
}

然后在业务代码里面引用,这种不仅代码量比较大,而且这种基础验证模块和业务模块耦合严重,我们应该尽量做到将不同模块和功能代码分离,提高代码的可扩展性

优化后

如果验证不通过,在基础验证代码里立即弹出msg,业务代码只需要判断返回的是true或者false就行了
//common.js
export default {
  validateName: function (data, msg = '') {
    if (!/xxx/.test(data)) {
      msg = '验证不通过提示语'
    }
    msg && alert(msg)
    return !!msg
  },
  validatePhone: function (data, msg = '') {},
  validateAddress: function (data, msg = '') {}
}
这样业务代码看上去很简洁
//index.js
import validate from './common.js'
const keys = Object.keys(validate)
//通过some方法,有1个验证不通过,就跳出验证,然后主业务代码里通过判断validateResult的值,验证是否完全通过。
//还有dataKey需要和validateKey有一定的映射规则
const validateResult = keys.some(key => {
  return !validate[key](this.data[dataKey])
})
如果你的验证方法包含了很多本页面用不到的其他验证规则,你只需在业务代码添加一个白名单字段
const whiteList = ['validatePhone','validateName','validateAddress']
如果你的验证有先后顺序,添加一个优先级字段
const whiteList = [{
    name:'validatePhone',
    level:1,
},{
    name:'validateName',
    level:2,
}]

以上就是我对表单验证规则的优化心得,有哪里需要改进的希望大家可以指点出来,相互交流

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
11个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
梦
4年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
Stella981 Stella981
3年前
Spring Boot 与 Kotlin 验证web表单信息
在做web开发的时候,我们需要验证表单,确认用户提交的信息是安全的,比如用户名不能超过多少位,密码不能少于多少位等等。那么如何在SpringBoot与Kotlin中验证表单信息?在springmvc工程中,需要检查表单信息,表单信息验证主要通过注解的形式。表单验证下面我们在之前《SpringBoot与kotlin使用
Stella981 Stella981
3年前
Spring Security构建Rest服务
浏览器模式下验证码存储策略浏览器模式下,生成的短信验证码或者图形验证码是存在session里的,用户接收到验证码后携带过来做校验。!(https://oscimg.oschina.net/oscnet/75774cf1ab5780bbf370ae42d1eff49e777.png)APP模式下验证码存储策略
Wesley13 Wesley13
3年前
00_设计模式之语言选择
设计模式之语言选择设计模式简介背景设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式(Designpattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(