Vue.js如何优雅的进行form validation

2020-06-16 06:00:33易采站长站整理

} else {
const { parent } = options
if (parent && parent.$validation) {
this.$validation = parent.$validation
this.$validator = parent.$validator
nextTick(this, parent.$validator.$options.validator.auto)
}
}
}
})

/**
* $validate
*
* validate vm recursively.
*
* @return {Promise}
*/
Vue.prototype.$validate = function (fromEntry) {
const { validate, $validation = {}, $validator } = this

// 如果此处为校验入口
if ($validator === this && !fromEntry) {
// 顶级往下校验所有子组件
return Promise.all($validation.fields
.map(field => field.$validate(true)))
.then(() => $validation)
.catch(() => Promise.reject($validation))
} else {
if (!validate) {
return Promise.resolve($validation)
}
return Promise.all(Object.keys(validate).map(key => {
return new Promise((resolve, reject) => {
const { validator = rules[key], rule, message } = validate[key] if (validator) {
// reject if falsy
promisify(validator(this.value, rule), true)
.then(resolve)
.catch(() => {
reject({
field: this.field || this,
rule,
message
})
})
} else {
__PROD__ || console.warn(`'${key}' is NOT a valid validator`)
resolve()
}
})
})).then(() => {
updateErrors($validation.errors, this)
return $validation
}).catch(error => {
updateErrors($validation.errors, this, error)
return Promise.reject($validation)
})
}
}

function updateErrors (errors, vm, replacement) {
const field = vm.field || vm
const found = errors.some((error, index) => {
if (error.field === field) {
if (replacement) {
errors.splice(index, 1, replacement)
} else {
errors.splice(index, 1)
}
return true
}
return false
})

if (!found && replacement) {
errors.push(replacement)
}

return errors
}

function nextTick (vm, auto) {
vm.$nextTick(() => {
// 定义了校验规则
if (vm.validate) {
vm.$validation.fields.push(vm)
// 加载完成自动检查
if (auto) {
vm.$validate()
}
}
})
}
}
}

还有一个网友推荐的:试试这个自带气泡提示的vue校验插件,配合vue-hook-form能够轻松实现表单校验

以上就是整理的关于此类问题的几个不错的回答,如果大家有更好的答案欢迎分享,希望本文对大家的学习有所帮助,也希望大家多多支持软件开发网。