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

更新日期: 2020-02-06阅读: 2.3k标签: 表单

背景

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

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


优化前

之前我们的验证代码是这样写的,把验证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,
}]

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

原文:https://segmentfault.com/a/1190000021855553


链接: https://fly63.com/article/detial/7951

Html5中input新增的表单元素和属性介绍。

input标签主要用于Web表单的创建交互,以便接受来自用户的数据。 我们通过更改type属性的值,来实现不同的输入类型。这篇文章主要讲解html5中新增的表单属性。

Validate表单验证插件之异步操作

使用ajax方式进行验证某个元素的值(只是验证元素的值,而不是ajax方式提交表单),默认会提交当前验证的值到请求的地址,如果要提交其它的值,可以使用data选项。

vue2表单验证组件_vee-validate的使用教程

vee-validate基于vue2的表单验证组件,这篇文章主要讲解它的安装,引用,基础使用,内置的校验规则,自定义校验规则。Validator是以$validator被组件自动注入到Vue实例的,同时也可以独立的进行调用

关于input的一些问题解决方法分享

input是我们接受来自用户的数据常用标签,在前端开发中:移动端底部input被弹出的键盘遮挡。控制input显/隐密码。在input中输入emoji表情导致请求失败。input多行输入显示换行。输入框首尾清除空格-trim()、在input中监听键盘事件

input输入限制只能为数字

input输入限制只能为数字的2种方法,通过onkeypress事件和onkeyup事件,输不上任何非数字字符。加上正则匹配不能输入非数字字符就可以了

input,textarea限制字数,实时绑定

input,textarea限制字数,实时绑定的方式:1.在input 或 textarea中加属性 、 2.js判断,拓展: 实时绑定功能:二种输入标签的实时绑定方式 。 需求:框后面有显示字数

在HTML中限制input 输入框只能输入纯数字

使用 onkeyup 事件,有 bug ,那就是在中文输入法状态下,输入汉字之后直接回车,会直接输入字母,使用 onchange 事件,在输入内容后,只有 input 丧失焦点时才会得到结果,并不能在输入时就做出响应,使用 oninput 事件,完美的解决了以上两种问题

谷歌浏览器禁止表单自动填充

在项目开发期间发现谷歌浏览器有记住密码的功能,该功能有个问题就是一遇到input type=password就开始自动填充,同一个账户还好,就是bug了。找了一堆解决方案终于找到了办法,下面分享一下解决方案。

HTML常用标签之<form>标签

在HTML中,<form></form>标记对用来创建一个表单,即定义表单的开始和结束位置,在标记对之间的一切都属于表单的内容。每个表单元素开始于form元素,可以包含所有的表单控件

javascript实现form表单onsubmit提交前验证

可以使用form表单的onsubmit方法,在提交表单之前,对表单或者网页中的数据进行检验。onsubmit指定的方法返回true,则提交数据;返回false不提交数据。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!