警告:此问题特定于react-admin框架
我正在尝试编写应用程序内手册,该手册使用服务器中的数据加载内容页面。为此,我正在做一个自定义页面,该页面将在componentDidMount上获取手册页面。在此函数中,我调用react-admin crudGetList( resourceName ,分页, sortingById ,过滤器)< / strong>,其中的过滤器为{and:[{condition},{language: currentLanguage}]}
,因为我想要使用其他语言的手册。我注意到在数据库中使用不同语言的页面并使用带有过滤器的crudGetList操作会获取正确的实例,但是状态会保留旧数据。例如,如果我最初以英语获取数据,更改语言并返回到手动页面,则redux状态将具有两种语言的页面,而不是当前所选的一种。
这是预期的行为吗?对手动页面提出新请求,是否不应将redux状态数据替换为来自请求的数据?如果不期望我应该提出问题吗?
答案 0 :(得分:2)
React-admin使用一种称为乐观渲染的模式。这意味着,如果应用程序过去已获取某些实体,如果它需要显示这些实体,则它首先显示陈旧的实体,然后获取后端,并且如果响应有所不同,则使用最新数据重新渲染屏幕。
例如,当用户获取帖子列表时,react-admin将这些帖子存储在以id为索引的字典中:
{
123: { id: 123, title: "hello" },
456: { id: 456, title: "world" },
...
}
React-admin还存储列表应显示的标识符列表:
[123, 456, ...]
使用这两个属性,react-admin现在可以显示列表。但是它也可以显示帖子的详细信息,而无需先点击服务器。因此,当用户单击列表中的项目时,react-admin使用第一个结构中的数据立即显示它,而无需等待服务器响应。
开放式渲染的目的是提高性能:由于用户不需要等待服务器往返,因此界面超级灵活。
在您的特定情况下,我知道这可能会导致问题,因为存储中包含的陈旧数据不是所需语言的版本。我建议您创建一个自定义的传奇,以响应语言更改操作,并清除商店以避免此类问题。
在react-admin网站中查看有关自定义Sagas的文档:
答案 1 :(得分:0)
您必须配置redux存储如何响应新的传入数据。
更具体地说,这就是“减速器”的作用;您的“操作”(在您的情况下为crudGetList
)将数据馈入“减速器”,该功能只是一个功能,向商店指示如何根据新数据调整形状。
在您的应用程序中的某个地方,可能存在一个化简器来响应您的提取操作,但是将其配置为仅将新结果与旧结果一起推送,而不是替换它们。但是,如果不查看描述整个redux“周期”的代码,就很难知道。
redux文档非常出色。我将从此处开始,并确保您对整个数据流是否都通过redux有所了解,然后再去寻找该reducer。