使用Promise.all()同时校验多个表单
// 表单校验函数
checkForm(form) {
return new Promise((resolve, reject) => {
this.$refs[form].validate(valid => {
console.log(valid)
if (valid) {
console.log(form)
resolve()
} else {
console.log(form, 'reject')
reject()
}
})
})
},
submitFn(form) {
const formList = []
formList.push(this.checkForm('mageDetail'))
formList.push(this.checkForm('propertyRefS'))
if (this.mageHexDetail.messageOutput) formList.push(this.checkForm('hexMesOutputFormS'))
if (this.mageHexDetail.messageSave) formList.push(this.checkForm('hexSaveRefS'))
Promise.all(formList).then(() => {
this.$postByUrl(`/${window.infoFlag1}/collection-web/config_info/updateStringMessageConfig`, params).then((res) => {
this.$message.success(this.$t('message.saveSuc'))
this.queryStatisticsList()
})
}).catch(() => {})
},
表单校验失败,打印this.$refs得到如下结果

图中可以得出,通过this.$refs并不能拿到该组件示例,其对应的值是undefined,查看官方文档,官方给出的结论是ref不是响应式的,换而言之,如果初始未渲染该组件,通过状态数据改变再进行渲染,那得到的值就是undefined,而不是实时的组件实例或DOM

而我模板中是使用v-if,条件为真的时候渲染改dom,为假则不渲染,当初始渲染时是true得到结果如下

当初始渲染时是false,得到结果如下

解决方法:最终我使用v-show去替代了v-if,v-show无论真假都会渲染,这样就解决了问题,但是这样可能带来性能问题,看项目需要吧,我项目中并没有明确的要求,如果非得用v-if,那就考虑其他方法,期待有其他解决方法的大佬指点。
文章讨论了在Vue应用中使用Promise.all同时校验多个表单时遇到的问题,即当使用v-if条件渲染组件时,this.$refs可能获取不到组件实例。作者发现这是由于v-if的非响应式特性导致的。为解决此问题,作者将v-if替换为v-show,尽管这可能带来性能影响。若需避免此问题且坚持使用v-if,文章提出需要寻找其他解决方案。
1358

被折叠的 条评论
为什么被折叠?



