在这个简单的示例上,我感到很沮丧,因为要么我没有得到什么东西,要么它没有按我期望的方式工作,也没有按照文档中的要求进行工作。
因此,我尝试扩展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
属性的创建页面。
我可以看到网络请求,并且它们都返回有效的json。我不明白为什么收到响应后,该组件就不会重新渲染。如果有人看到我想念的东西,我将非常感激!
答案 0 :(得分:0)
控制台成功,这意味着既没有error
也没有loading
。
检查implementation of 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
);