[英]useGetOne response doesn't rerender component
我对这个简单的例子感到非常沮丧,因为要么我没有得到一些东西,要么它没有按照我期望的方式工作,也没有按照文档中所说的方式工作。
所以我试图扩展 CloneButton 组件以实际检索 Datagrid 每一行上的记录并将其传递给 create 组件:
import React from 'react';
import PropTypes from 'prop-types';
import { CloneButton, useGetOne } from 'react-admin';
import CircularProgress from '@material-ui/core/CircularProgress';
const CloneQueryButton = ({
label = "Duplicate",
basePath,
record,
...props
}) => {
const { data, loading, error } = useGetOne(basePath, record.id);
if (loading) { return <CircularProgress />; }
if (error) { return <p>ERROR {error.message}</p>; }
if (data) {
console.log("inside", data);
data.name = `Copy of ${data.name}`;
}
console.log("outside", data);
return <CloneButton
basePath={basePath}
record={data}
label={label}
{...props} />
};
我在控制台上得到的只是outside null
另外当按下按钮时,它会重定向到具有空record
属性的创建页面。
我可以看到网络请求,它们都返回有效的 jsons。 我不明白为什么组件在收到响应时显然没有重新渲染。 如果有人能看到我错过了什么,我将不胜感激!
控制台成功,这意味着既没有error
也没有loading
。
检查useGetOne
的实现后,如果基本上没有找到具有给定名称的admin state
的资源,它将返回 null。
所以我假设你没有在admin's state
声明的资源(又名<Resource name="your name" />
在<Admin>
树中。
onst useGetOne = (
resource: string,
id: Identifier,
options?: any
): UseGetOneHookValue =>
useQueryWithStore(
{ type: 'getOne', resource, payload: { id } },
options,
(state: ReduxState) =>
state.admin.resources[resource]
? state.admin.resources[resource].data[id]
: null
);
我遇到了同样的问题。 这是我发现的。
当一个动作被分派时,Redux 检查状态是否已经改变。 如果状态没有改变,那么它不必更新组件。 当 Redux 无法看到状态已更改时,它不会使用来自状态的新数据更新 React 组件。 参考
返回的数据是相同的 JSON,这就是状态没有更新的原因。
有两种方法可以解决这个问题。
basePath
的新资源,该资源返回相同的结果。 临时修复。 不是最好的解决方案。 例如: <Resource name="cart" />
, <Resource name="cartDetails" />
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.