我有一个Edit
组件,它包含一个已设置为pessimistic
模式的TabbedForm
。我还使用了一个基于react admin的简单rest提供程序的自定义数据提供程序。
<Edit
title="Edit entity"
mutationMode="pessimistic"
{...props}
>
<TabbedForm>
<FormTab label="Details">
<TextInput source="name" />
</FormTab>
</TabbedForm>
</Edit>
API中有一个验证规则,可确保不存在具有相同名称的另一个实体。
当此验证失败时,服务器会返回一条400错误消息。我已经将其设置为在吐司中显示此错误,并且运行良好。
我遇到的问题是,当出现400错误响应时,整个表单状态会被重置,因此用户在表单上取得的所有进展都会丢失。例如,如果name
字段的原始值是"0";实体A";,并且我将其改为";实体B";并且提交表单时,API发现已经存在具有该名称的实体,返回错误,然后将name
字段重置回"0";实体A";。如果此表单上还有其他字段,它们也都会重置回原始状态。
在400响应返回后,似乎有另一个HTTP请求被发送到API,以再次通过ID获取实体(即,再次调用数据提供程序上的getOne
方法(。
有没有一种方法可以防止在服务器发出400响应后重置表单状态?
我认为一个替代的解决方案是通过使用客户端验证来防止400个错误再次出现——也许是通过添加一个自定义验证程序来执行API请求,以检查是否存在具有该名称的实体。
我找到了一种方法,通过重写onFailure
行为来防止表单在提交失败后被刷新。
const onFailure = (error: any) => {
notify(
typeof error === "string"
? error
: error.message || "ra.notification.http_error",
{ type: "warning" }
);
};
我只将逻辑发送到refresh()
页面,如react管理文档中所述。
参考:https://marmelab.com/react-admin/CreateEdit.html#onfailure