本文针对的场景是没有手动触发el-form的validator验证,但是async-validator自动触发(验证),控制台async-validator验证报错的情况。
先贴一段代码:
<template>
<el-form ref="form" :model="formData" :rules="formRules" label-width="100px" size="medium">
<el-form-item label="用户名" prop="username">
<el-input v-model="formData.username"></el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input type="password" v-model="formData.password"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm">提交</el-button>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
formData: {
username: '',
password: ''
},
formRules: {
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' }
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' },
{ min: 6, max: 20, message: '密码长度在 6 到 20 个字符之间', trigger: 'blur' }
]
}
};
},
methods: {
submitForm() {
this.$refs.form.validate(valid => {
if (valid) {
// 表单验证通过,可以进行提交操作
// ...
} else {
// 表单验证未通过
return false;
}
});
}
}
};
</script>
这段代码中我们在submitForm时通过this.$refs.form.validate来验证表单中的username和password字段,这没有问题。
el-from验证调用了async-validator,上面的情况是提交时手动触发validator。
本文说的是没有手动触发validator验证,但是控制台async-validator报错(async-validator自动触发)的情况。
当el-from 上rules属性绑定的验证规则发生变化(即 :rules="formRules"中的formRules变更) 无论是formRules的对象内存地址变化,还是对象中的key 或者 key对应的value变更,都会触发async-validator。
说个场景,如未满18岁用户需要验证监护人。用computed来做rules判断
computed: {
formRules() {
const basicRules = {...};
if (age < 18) {
return {
...basicRules,
otherRules
}
}
return basicRules;
}
}
这时候来回切换用户信息,表单就会发生没有手动触发校验,但自行校验的情况。
解决这个问题有两种思路
1、拆分rules同时拆分表单,一个表单拆为两个表单,两个表单绑定两套验证规则
2、不拆分表单,但每次绑定值发生变化时,通过clearValidate()清空验证状态。
完结。
同步更新到自己的语雀
https://www.yuque.com/dirackeeko/blog/ih59cyi0r97kcnke
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。