美文网首页让前端飞前端杂记
用策略模式写一个表单验证

用策略模式写一个表单验证

作者: 会飞小超人 | 来源:发表于2018-12-10 11:51 被阅读2次

首先创建一个基本的表单

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  
  <form id="registerForm">
      请输入用户名:<input type="text" name="userName"/>
      请输入密码:<input type="text" name="password"/>
      请输入手机号码:<input type="text" name="phoneNumber"/>
      <button>提交</button>
  </form>

  <script src="./validator.js"></script>
</body>
</html>

普通写法

validator.js

 var registerForm = document.getElementById('registerForm');
registerForm.onsubmit = function () {
  if (registerForm.userName.value === '') {
    alert('用户名不能为空');
    return false;
  }

  if (registerForm.password.value.length < 6) {
    alert('密码长度不能少于6位');
    return false;
  }
  if (!/(^1[3|5|8][0-9]{9}$)/.test(registerForm.phoneNumber.value)) {
    alert('手机号码格式不正确');
    return false;
  }
}

策略模式

const strategies = {
  isNonEmpty: function (value, errorMsg) {
    if (value === '') {
      return errorMsg
    }
  },
  minLength: function (value, length, errorMsg) {
    if (value.length < length) {
      return errorMsg
    }
  },
  isMobile: function (value, errorMsg) {
    if (!/(^1[3|5|8][0-9]{9}$)/.test(value)) {
      return errorMsg
    }
  }
}

const Validator = function () {
  this.cache = []
}

Validator.prototype.add = function (dom, rule, errorMsg) {
  let arr = rule.split(':')
  this.cache.push(function () {
    let strategy = arr.shift()
    arr.unshift(dom.value)
    arr.push(errorMsg)
    return strategies[strategy].apply(dom, arr)
  })
}

Validator.prototype.start = function () {
  for (let i = 0, validatorFunc; validatorFunc = this.cache[i++];) {
    let msg = validatorFunc()
    if (msg) {
      return msg
    }
  }
}

const validateFunc = function () {
  let validator = new Validator()

  /* 添加校验规则 */
  validator.add(registerForm.userName,'isNonEmpty','用户名不能为空')
  validator.add(registerForm.userName,'minLength:6','用户名长度不能少于6位')
  validator.add(registerForm.password,'minLength:6','密码长度不能少于6位')
  validator.add(registerForm.phoneNumber,'isMobile','手机号码格式不正确')

  let errorMsg = validator.start()
  return errorMsg
}

let registerForm = document.getElementById('registerForm')
registerForm.onsubmit = function () {
  let errorMsg = validateFunc()
  if (errorMsg) {
    console.log(errorMsg)
    return false
  }
}

如果同一个表单要添加多个校验规则的话,只能重新写一行代码,不够优雅,可以改写add函数,变成配置的形式添加rule,下面是优化版。

优化版

/* 其他代码一样,这里只写出改变的代码*/

Validator.prototype.add = function (dom, rules) {
  let self = this

  for (var i = 0, rule; rule = rules[i++];) {
    (function (rule) {
      let strategyArr = rule.strategy.split(':')
      let errorMsg = rule.errorMsg

      self.cache.push(function () {
        let strategy = strategyArr.shift()
        strategyArr.unshift(dom.value)
        strategyArr.push(errorMsg)
        return strategies[strategy].apply(dom, strategyArr)
      })
    })(rule)
  }
}

const validateFunc = function () {
  let validator = new Validator()

  /* 添加校验规则 */
  // validator.add(registerForm.userName,'isNonEmpty','用户名不能为空')
  // validator.add(registerForm.userName,'minLength:6','用户名长度不能少于6位')
  // validator.add(registerForm.password,'minLength:6','密码长度不能少于6位')
  // validator.add(registerForm.phoneNumber,'isMobile','手机号码格式不正确')

  /* 改进版 */
  validator.add(registerForm.userName, [{
    strategy: 'isNonEmpty',
    errorMsg: '用户名不能为空'
  }, {
    strategy: 'minLength:10',
    errorMsg: '用户名长度不能小于10位'
  }]);

  validator.add(registerForm.password, [{
    strategy: 'minLength:6',
    errorMsg: '密码长度不能小于6位'
  }]);

  validator.add(registerForm.phoneNumber, [{
    strategy: 'isMobile',
    errorMsg: '手机号码格式不正确'
  }]);

  let errorMsg = validator.start()
  return errorMsg
}

相关文章

  • 用策略模式写一个表单验证

    首先创建一个基本的表单 普通写法 validator.js 策略模式 如果同一个表单要添加多个校验规则的话,只能重...

  • 用AOP装饰函数,实现插件式表单验证

    之前用策略模式实现了表单的验证,现在学习了装饰模式发现实现表单验证更简洁,意图和目的更明确。 下面来看一下,装饰函...

  • javaScript策略模式实现表单验证学习

    策略模式定义:定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。 用策略模式实现表单验证: 使用策略...

  • 策略模式-表单验证

    策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。  在使用策略模式的过程中,选择某种策略...

  • 策略模式

    策略模式,就是把一组算法独立出来单独维护,而不必受模块逻辑的约束。最典型的策略模式就是表单验证了,大家肯定都经历过...

  • JavaScript设计模式:策略模式——表单验证

    策略模式的定义:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。 将不变的部分和变化的部分隔开是每...

  • 记录ivew使用过程中遇到的坑

    表单验证要写:model,要不然不生效 :model="itemUrlList" 这样写可以用两种方式验证 lon...

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

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

  • vue+element 表单验证问题

    常规表单验证、自定义表单验证、动态增删表单验证 1.常规表单验证 2.自定义表单验证 3.动态增减 a.表单 b.表格

  • Kotlin设计模式之策略模式

    简单介绍下用Kotlin写的策略模式,还有就是与Java版本的对比。 Kotlin Java 输出 实现策略模式时...

网友评论

    本文标题:用策略模式写一个表单验证

    本文链接:https://www.haomeiwen.com/subject/gylacqtx.html