Skip to content

验证器(Validator)

使用策略模式来实现一个验证器,主要用于验证表单数据,方便复用和扩展等。

TypeScript
// * 这里使用 ant design 的 message 显示检测错误的信息
import { message } from 'ant-design-vue'

/**
 * 检查策略
 * @return {boolean}
 */
const checkStrategies = {
   /**
    * 检查 密码 的合法性
    */
   password: (value: string) => {
      const pwdReg = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{5,15}$/
      return (value && pwdReg.test(value)) || '密码必须包含大小写字母和数字,长度在5-15之间'
   },

   /**
    * 检查 两个密码 是否相同
    */
   samePassword: (pwd1: string, pwd2: string) => {
      return pwd1 === pwd2 || '两次密码不相同'
   },

   /**
    * 检查 字符串是否为 ''、null、undefined
    * @param str 字符串
    * @param errMsg 错误时提示的内容
    */
   stringNotNull: (str: string, errMsg: string) => {
      return !!str || errMsg
   },

   /**
    * 根据表单内容进行扩展
    * ...
    */
}

export class Validator {
   /**
    * (私有属性)存储策略事件
    */
   #cache: (() => boolean)[] = []

   /**
    * 添加策略事件
    */
   add = (method: keyof typeof checkStrategies, ...value: any[]) => {
      // @ts-ignore
      this.#cache.push(() => checkStrategies[method](...value))
   }

   /**
    * 检查
    * @returns {boolean} 返回 通过(true) 或 失败(false)
    */
   check = () => {
      for (let i = 0; i < this.#cache.length; i += 1) {
         const checkFn = this.#cache[i]
         const result = checkFn() // * 开始检查
         if (typeof result === 'string') {
            message.warning(result)
            return false
         }
      }
      return true
   }
}
TypeScript
// 你可以在任何有数据验证的地方使用它

const validateForm = (): boolean => {
   const validator = new Validator()
   validator.add('phoneNum', '18888888888')
   validator.add('password', 'Admin123456')
   // 根据表单内容进行扩展
   // validator.add('xxx', 'xxx');
   // ...

   return validator.check()
}

const login = () => {
   if (!validateForm()) return

   // call api function
   // ...
}

如果我们使用的是组件库(例如: ant、element), 它们的 Form 组件都有自带的验证功能可以去尝试一下.