onVisibleChange={(e) => { if (e) { if (trailer) roleFormRef.current?.setFieldsValue(trailer); else roleFormRef.current?.resetFields(); } }}但调用多了显示就不对了
时间: 2024-03-27 09:35:29 浏览: 121
如果你多次调用 Modal 组件,并且每次调用都会执行 `setFieldsValue()` 或 `resetFields()` 方法,可能会出现表单显示不正确的问题。这是因为 `setFieldsValue()` 和 `resetFields()` 方法都是用于修改表单值的,如果多次调用,可能会导致表单值被覆盖或重置。
为了避免这种情况,可以在每次调用 Modal 组件时,先判断表单当前的状态是否需要进行修改。具体来说,可以在调用 `setFieldsValue()` 或 `resetFields()` 方法前,先判断表单的值是否已经与目标值一致,如果一致,则不进行修改,否则再进行修改。
可以参考以下代码实现:
```
const [trailerValue, setTrailerValue] = useState({});
const handleModalVisible = (visible) => {
if (visible) {
if (!isEqual(trailerValue, trailer)) { // 判断表单值是否需要修改
setTrailerValue(trailer);
if (trailer) {
roleFormRef.current?.setFieldsValue(trailer);
} else {
roleFormRef.current?.resetFields();
}
}
} else {
roleFormRef.current?.resetFields();
setTrailerValue({});
}
}
// 判断两个对象是否相等
const isEqual = (obj1, obj2) => {
return JSON.stringify(obj1) === JSON.stringify(obj2);
}
```
这里使用了 `useState()` 钩子函数来保存表单的当前值。在每次打开 Modal 时,先判断当前表单值是否需要修改,如果需要则更新表单值并调用 `setFieldsValue()` 或 `resetFields()` 方法。在 Modal 关闭时,调用 `resetFields()` 方法重置表单并清空保存的表单值。
注意,这里使用了 `JSON.stringify()` 方法来判断两个对象是否相等,这是因为 `===` 操作符只能判断两个对象是否为同一引用,而不能判断两个对象的值是否相等。
阅读全文