Skip to content

Instantly share code, notes, and snippets.

@xxf1996
Created March 23, 2020 10:08
Show Gist options
  • Save xxf1996/6e33b386ad925f6522d4d573ccafc252 to your computer and use it in GitHub Desktop.
Save xxf1996/6e33b386ad925f6522d4d573ccafc252 to your computer and use it in GitHub Desktop.
适用于element和antd-vue表单规则
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