TMagic表单动态更新数据后校验状态没重置怎么办?
在用TMagic做表单编辑页时遇到个问题,当通过接口获取新数据覆盖formData后,虽然表单显示正常,但校验状态一直保持旧数据的状态。比如原来输入过错误值触发了验证,更新数据后即使字段值正确,校验提示还是残留的。
尝试过直接赋值this.formData = newData,也试过用this.$set逐个字段更新,但都没触发校验重置。查看文档发现有formInstance.resetValidate()方法,但调用后所有校验提示都清空了,导致手动输入的新数据正常校验又被清除。
这是用的代码结构:
<tmagic-form :model="formData" :rules="rules" ref="form">
<tmagic-form-item label="名称" name="name">
<tm-input v-model="formData.name" />
</tmagic-form-item>
</tmagic-form>
<script>
export default {
data() {
return {
formData: { name: '' },
rules: { name: [{ required: true, message: '必填' }] }
}
},
methods: {
async refreshData() {
const newData = await fetchData();
// 这里更新数据后校验状态没变化
this.formData = { ...newData };
this.$refs.form.resetValidate(); // 这样会导致手动输入的校验结果也被清除
}
}
}
</script>
该怎么在更新数据时只重置对应字段的校验状态呢?手动调用validateField又不太方便,有没有更好的处理方式?
具体来说,你可以用
formInstance.clearValidate方法来针对特定字段清除校验状态,而不是直接调用resetValidate清空所有校验。这样可以避免影响用户已经输入的内容的校验结果。修改后的代码逻辑可以这样写:
这里的关键点是
clearValidate方法可以接受一个字段名数组作为参数,只清除这些字段的校验状态。通过Object.keys(newData)动态获取需要重置的字段列表,避免手动维护字段名。如果你发现某些字段在更新后还需要重新触发校验(比如必填项),可以在清除校验状态后调用
validateField:这样做既保证了校验状态的正确性,又不会误清除用户已经输入内容的校验结果。记得看下 TMagic 的文档中关于
clearValidate和validateField的说明,确保版本支持这些方法。如果还是有问题,可能需要检查一下你的
rules定义是否合理,或者看看是不是组件本身的 bug,毕竟 UI 框架偶尔也会抽风。