【问题标题】:How to display a custom page from a custom (non crud, custom data) json如何从自定义(非crud,自定义数据)json显示自定义页面
【发布时间】:2021-03-09 23:00:36
【问题描述】:

我能够使用 react-admin 3.x(从 2.x 迁移而来)和 jsonServerProvider 作为数据提供者创建一个简单的管理面板。 现在我想要一个显示一些自定义数据的自定义页面。

假设我有一个这样的 json:

{
  "title":"My custom page",
  "teaser":"This is a custom page showing some stuff",
  "drinks":[{"name":  "coke", "image": "coca-cola.jpg"}, {"name":  "beer", "image": "beer.png"}, {"name":  "coffee", "image":  "cappuccino.jpg"}],
  "additional_stuff": ["some", "more", "stuff"]
}

我实际上创建并调用了类似的端点:/api/drinks/mycustom

请注意,我已经有页面要列出、创建、编辑drinks。现在我只想要一个自定义页面以不同的方式显示它们(而不是在 CRUD 表中)并显示额外的内容。

如果现有端点中包含的端点名称有问题,我可以将“mycustom”端点放在不同的路由中。

我想在左侧的默认菜单中有一个条目,点击它时,react-admin 应该查询资源并使用来自端点的 json 数据填充页面。

我只是不知道如何制作这样一个自定义页面,也没有在文档中找到合适的示例,这就是我在这里的原因。

感谢您提供有关如何实现此目的的示例。

【问题讨论】:

  • 您可以类似地发布您的页面 - Dashboard marmelab.com/react-admin/Admin.html#dashboard 然后通过有用的菜单项将其打开
  • @MaxAlex thx 的评论,但你能更具体一点吗?添加一个简单的仪表板页面来指定不同的主页不是我需要的。我需要一个自定义页面来获取 json 并使用该 json 填充页面。如果您可以提供一些可以帮助我实现目标的代码的答案,我可以接受它,谢谢和欢呼。

标签: reactjs react-admin


【解决方案1】:

您可以在此 way 中设置 customRoute,传递您的自定义组件。

要查询 API,如果提供的常规数据足以满足您的需求,则不需要新的端点。只需调用 useGetOneuseGetList hook 内部取决于您的自定义页面显示的内容。

*编辑:

在您的情况下,让我们采用 stats/foo.js 组件并假设您要显示 trades 资源的另一个布局(根据需要与任何其他布局交换):

       const Foo = () => {
          const { data, ids, loading, error } = useGetList(
             'trades',
             { page: 1, perPage: 10 },
             { field: 'id', order: 'DESC' }
          );

          if (loading) { return <Loading />; }
          if (error) { return <p>ERROR</p>; }

          return (
            <Card>
              <Title title="Trades Stats" />
              <CardContent>
                <ul>
                 {ids.map(id =>
                    <li key={id}>{data[id].title}</li>
                  )}
                </ul>
              </CardContent>
            </Card>)
        };

现在您应该可以访问/foo 网址上的页面了,因为它是在customRoutes 中注册的。

*编辑 2

如果您根本不想使用 react-admin 钩子,您可以只使用普通的 fetch,甚至可以使用 react-admin 的 fetchUtils

import { fetchUtils } from 'react-admin';

const fetchJson = (url, options = {}) => {
    if (!options.headers) {
        options.headers = new Headers({ Accept: 'application/json' });
    }
    // add your own headers here
    // options.headers.set('X-Custom-Header', 'foobar');
    return fetchUtils.fetchJson(url, options);
}

并进行以下调用:

const Foo = () => {
  const [data, setData] = React.useState({});

  React.useEffect(() => {
       fetchJson(baseUrl + '/trades')
          .then(response => {
             return response.json;
          })
          .then(data => {
             setData(data); 
          });
  }, []);
  
  return (
    <Card>
      <Title title={data.title} />
      <CardContent>
        <div>{data.teaser}</div>
      </CardContent>
    </Card>)
};

【讨论】:

  • 嗨,谢谢您的回答,如果您可以编辑并添加更多信息,以便在答案中包含一些代码以帮助我获得可行的解决方案,我可以接受它。在我的仓库中检查我的最后一次提交:github.com/firepol/crypto-accounting-admin/tree/custom-page 我只是不明白在哪里/如何添加钩子。我已经看过这些示例,但不明白如何在我的代码、app.js 等中使用它们。你能帮忙吗?谢谢
  • 谢谢@Kia 我承认我对反应的了解太少(让我头疼),所以请耐心等待......我尝试了 useGetOne 并且它给了我需要 redux 左右的错误。我尝试了 useGetList 但似乎我必须在 json 中返回一个 id 数组并且还抱怨 X-Total-Count header is missing in the HTTP Response 我真的不需要分页,我的 json 是一个简单的 json,就像问题中一样。难道没有一个简单的钩子来显示这样一个没有分页、没有 id、不需要 x-header 的自定义 json 吗?有没有办法 console.log 返回的 json? (api调用有效)
  • 好的,如果我做对了,请查看我的第二次编辑
  • 快到了,最后一步就解决了……请根据您的回答检查我的代码:fetchJson 调用中的gist.github.com/firepol/a49d722ba9310eb98dffde440a28f116 console.log(data); 调用按预期工作。但是console.log(result); 用 [[PromiseState]]: "fulfilled" [[PromiseResult]]: Object 记录了一个承诺。对不起,我不擅长 JS,更不擅长反应 :( 如何使这项工作发挥作用,以便数据具有应有的属性,通过 JSX 中的 {data.title}{data.teaser} 呈现?
  • 我不知道你为什么要处理这个任务,但是你对 js 承诺/异步操作和反应生命周期方法的基础知识太少了......如果你不把你的是时候学习它们了,你会经常遇到这样的问题。我已经编辑了答案的后半部分,但从现在开始我无法为您提供帮助,您的问题已经回答了很久,所以请接受答案。
猜你喜欢
  • 2019-09-14
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多