rest - 反应管理员:卡在加载状态,即使数据获取成功
问题描述
我有问题<ReferenceField>
。
在我的页面上,<List>
我有需要参考的行。我想展示和。UserId
ToolId
user name
tool code
但是这两列卡在加载状态,即使dataProvider
,GET_MANY
请求成功users
和tools
。
当我console.log(data)
,它的数据都在那里,但不知何故它没有呈现到<ReferenceField>
. 并且根本没有记录任何错误。
知道我在做什么错吗?或者发生了什么?
编辑:我已经更新了 react-admin,现在它不显示加载栏,但什么也不显示。
这是列表的代码:
export const B_toolList = props => (
<List {...props}>
<Datagrid rowClick="edit">
<TextField source="id" />
<NumberField source="active" />
<NumberField source="time" />
<DateField source="createdAt" />
<DateField source="updatedAt" />
<ReferenceField source="UserId" reference="Users">
<TextField source="name" />
</ReferenceField>
<ReferenceField source="ToolId" reference="Tools">
<TextField source="code" />
</ReferenceField>
</Datagrid>
</List>
);
我还发现,如果我尝试使用 react-dev-tool 检查 ReferenceField 元素,则没有值,只有“正在加载...”注释。但我不知道为什么……在我看来,API 响应还可以。
API 资源:Btools 获取:
(2) [{…}, {…}]
0:
ToolId: 1
UserId: 1
active: 1
createdAt: "2020-04-08T16:00:03.000Z"
id: 1
time: 1
updatedAt: "2020-04-08T16:00:03.000Z"
__proto__: Object
1:
ToolId: 1
UserId: 2
active: 1
createdAt: "2020-04-08T16:00:03.000Z"
id: 2
time: 1
updatedAt: "2020-04-08T16:00:03.000Z"
__proto__: Object
length: 2
__proto__: Array(0)
比用户和工具获取:
(2) [{…}, {…}]
0: {id: 1, name: "Tomáš Princ", email: "p***@seznam.cz", createdAt: "2020-04-08T15:59:54.000Z", updatedAt: "2020-04-08T15:59:54.000Z"}
1: {id: 2, name: "jhfgjhfg", email: "admin@admin.cz", createdAt: "2020-04-08T18:44:16.000Z", updatedAt: "2020-04-08T18:44:16.000Z"}
length: 2
__proto__: Array(0)
[{…}]
0: {id: 1, code: "guhf", name: "jhfh", state: "ghf", free: 1, …}
length: 1
__proto__: Array(0)
我在 DataProvider 中记录这个 json 数据并像数据一样返回它:json
switch (type) {
case GET_LIST:
case GET_MANY:
case GET_MANY_REFERENCE:
console.log(json)
console.log(type)
if (!headers.has('content-range')) {
throw new Error(
'The Content-Range header is missing in the HTTP Response. The simple REST data provider expects responses for lists of resources to contain this header with the total number of results to build the pagination. If you are using CORS, did you declare Content-Range in the Access-Control-Expose-Headers header?'
);
}
console.log((headers.get('content-range')))
return {
data: json,
total:
//json.length,
parseInt(
headers
.get('content-range')
.split('/')
.pop(),
10
),
};
所以看起来应用程序拥有它需要的所有数据,但由于某种原因仍在加载和等待某些东西。
编辑 2:我通过创建自定义元素尝试了一些解决方法,该元素加载 userId 和 toolId 并获取经典查询通过 ID 为每一行获取用户/工具。有用。
const ToolCode = ({ record = {} }) => {
const dataProvider = useDataProvider();
const [tool, setTool] = useState();
const [loading, setLoading] = useState(true);
const [error, setError] = useState();
useEffect(() => {
dataProvider.getOne('tools', { id: record.ToolId })
.then(({ data }) => {
setTool(data);
setLoading(false);
})
.catch(error => {
setError(error);
setLoading(false);
})
}, []);
if (loading) return <Loading />;
if (error) return <Error />;
if (!tool) return null;
console.log("fetch tools")
return (
tool.code
)
};
const UserName = ({ record = {} }) => {
const dataProvider = useDataProvider();
const [user, setUser] = useState();
const [loading, setLoading] = useState(true);
const [error, setError] = useState();
useEffect(() => {
dataProvider.getOne('users', { id: record.UserId })
.then(({ data }) => {
setUser(data);
setLoading(false);
})
.catch(error => {
setError(error);
setLoading(false);
})
}, []);
if (loading) return <Loading />;
if (error) return <Error />;
if (!user) return null;
return (
user.name
)
};
const B_toolFilter = (props) => (
<Filter {...props}>
<TextInput label="Search" source="q" alwaysOn />
<TextInput label="Title" source="title" defaultValue="Hello, World!" />
</Filter>
);
export const B_toolList = props => (
<List {...props}>
<Datagrid rowClick="edit">
<TextField source="id" />
<NumberField source="active" />
<NumberField source="time" />
<DateField source="createdAt" />
<DateField source="updatedAt" />
<UserName source="UserId" />
<ToolCode source="ToolId" />
</Datagrid>
</List>
);
现在我可以通过 B_Tools 中的 ID 获取工具代码和用户名,但它的效率远低于 ReferenceField 使用的 GET_MANY 方法。
解决方案
净重。一直都是关于工具和用户的大写字母
<ReferenceField source="UserId" reference="Users">
和
<ReferenceField source="ToolId" reference="Tools">
我将其更改为
<ReferenceField source="UserId" reference="users">
和
<ReferenceField source="ToolId" reference="tools">
现在它起作用了!我只是仍然不明白为什么它会获取正确的资源......就像它在获取数据时对资本不敏感,但在呈现时却对资本敏感。我不知道。无论如何,我会期待某种带有这样错误的错误消息......不仅仅是正确的响应和空渲染。
推荐阅读
- python - 需要使用 python 创建一个关于新闻的数据集
- django - DjangoBackendFilter 和按 id 过滤
- angular - Angular 6 材质表服务器和客户端分页
- api - 在邮递员中获取 api 工作,但在本机反应中不工作
- opencv - 给定已知的内在和外在参数,对于已知深度的图像点,计算距离 X 处的点
- c++ - 通过 std::thread 以 std::function 作为参数调用可调用对象
- wordpress - 如何让所有评论类型显示在 WordPress 中?
- python - TensorFlow matmul如何处理channel=None
- ajax - Codeigniter Ajax 记录已保存但不显示 luvr
- c - 如何使scanf不忽略C中的空格和\ n