class Validator {
static add (name, fn) {
Validator.prototype[name] = fn
}
constructor () {}
validate (data, rules) {
let errors = {}
rules.forEach((rule) => {
let value = data[rule.key]
if (rule.required) {
let error = this.required(value)
if (error) {
ensureObject(errors, rule.key)
errors[rule.key].required = error
return
}
}
// 遍历 validators,并逐一调用对应的函数
let validators = Object.keys(rule).filter(key => key !== 'key' && key !== 'required')
validators.forEach((validatorKey) => {
if (this[validatorKey]) {
let error = this[validatorKey](value, rule[validatorKey])
if (error) {
ensureObject(errors, rule.key)
errors[rule.key][validatorKey] = error
}
} else {
throw `不存在的校验器: ${validatorKey}`
}
})
})
return errors
}
required (value) {
if (value !== 0 && !value) {
return '必填'
}
}
pattern (value, pattern) {
if (pattern === 'email') {
pattern = /^.+@.+$/
}
if (pattern.test(value) === false) {
return '格式不正确'
}
}
minLength (value, minLength) {
if (value.length < minLength) {
return '太短'
}
}
maxLength (value, maxLength) {
if (value.length > maxLength) {
return '太长'
}
}
}
function ensureObject (obj, key) {
if (typeof obj[key] !== 'object') {
obj[key] = {}
}
}
export default Validator
网友评论