Created
March 23, 2020 10:08
-
-
Save xxf1996/6e33b386ad925f6522d4d573ccafc252 to your computer and use it in GitHub Desktop.
适用于element和antd-vue表单规则
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class FormValidator { | |
/** | |
* @param {string|Array} trigger 验证触发时机 | |
*/ | |
constructor (trigger = '') { | |
this.validators = [] | |
this.rules = [] | |
this.trigger = trigger | |
return this | |
} | |
/** | |
* 设置表单项验证时机 | |
* @param {string|Array} trigger 验证触发时机 | |
*/ | |
setTrigger (trigger) { | |
this.trigger = trigger | |
return this | |
} | |
/** | |
* 添加一个验证函数 | |
* @param {Function} validator 验证函数 | |
* @param {string} message 错误提示 | |
*/ | |
addValidator (validator, message) { | |
this.validators.push({ | |
validator, | |
message | |
}) | |
return this | |
} | |
/** | |
* 添加必备(不能为空)验证 | |
* @param {string} message 错误提示 | |
*/ | |
required (message = '不能为空!') { | |
let rule = { | |
required: true, | |
message, | |
trigger: this.trigger | |
} | |
this.rules.push(rule) | |
return this | |
} | |
/** | |
* 添加数字范围验证 | |
* @param {number} min 最小值 | |
* @param {number} max 最大值 | |
* @param {string} message 错误提示 | |
*/ | |
range (min, max, message = `值的范围在[${min}, ${max}]之间!`) { | |
let rule = { | |
type: 'number', | |
message, | |
trigger: this.trigger | |
} | |
this.rules.push(rule) | |
return this | |
} | |
/** | |
* 添加字符合法验证,只允许使用(小写)字母、数字、下划线和中划线 | |
* @param {boolean} allowUpperCase 是否允许大写 | |
* @param {string} message 错误提示 | |
*/ | |
word (allowUpperCase = true, message = `只能包括${allowUpperCase ? '' : '小写'}字母、数字、下划线和中划线!`) { | |
let validator = ({ value }) => { | |
let regex = /^[A-Za-z0-9_-]*$/ | |
if (!allowUpperCase) { | |
regex = /^[a-z0-9_-]*$/ | |
} | |
return regex.test(value) | |
} | |
this.addValidator(validator, message) | |
return this | |
} | |
/** | |
* 获取最终的表单项验证规则(数组) | |
*/ | |
getAll () { | |
let res = JSON.parse(JSON.stringify(this.rules)) // 复制普通验证规则 | |
if (this.validators.length) { | |
/** | |
* 将所有的验证函数转换成一条验证规则,按照数组中顺序逐条检测 | |
* @param {array} rule 表单项验证规则 | |
* @param {*} value 表单项值 | |
* @param {Function} cb 验证结果回调函数,不传参则为通过验证,传Error对象则代表不通过 | |
* @param {*} source 整个表单对象 | |
*/ | |
let validator = (rule, value, cb, source) => { | |
for (let item of this.validators) { | |
let isValid = item.validator({ | |
rule, | |
value, | |
source | |
}) | |
if (!isValid) { // 检测是否符合规则 | |
cb(new Error(item.message)) | |
return | |
} | |
} | |
cb() | |
} | |
res.push({ | |
trigger: this.trigger, | |
validator | |
}) | |
} | |
return res | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment