【问题标题】:Use <List /> on React-Admin dashboard在 React-Admin 仪表板上使用 <List />
【发布时间】:2019-02-28 10:27:28
【问题描述】:

我正在使用带有自定义仪表板组件的 react-admin v2.3.2,如 react-admin 教程中所示。

    <Admin dashboard={MyDashboard}>
       <Resource name="incidents ... />
    </Admin>

现在我想使用 react-admin 的组件在仪表板上显示事件列表,但 react-admin 抱怨缺少诸如“hasEdit”之类的属性。

我只是将仪表板组件的道具传递给列表,但这显然不起作用:

    class MyDashboard extends React.Component    {
      constructor(props) {
      super(props)

      render(
        return <List {...this.props}>
          <Datagrid> .... </Datagrid>
        </List>

      )
    }

是否可以在仪表板上使用 react-admin 的 &lt;List /&gt; 组件,如果可以,如何做到这一点?

提前致谢, 托马斯

【问题讨论】:

    标签: react-admin


    【解决方案1】:

    我发现这个页面正在研究类似的东西。 现在(2020 年末)执行此操作的方法是在页面上为要在仪表板上显示的主要资源创建一个 ListContextProvider,以便获得该上下文提供的所有内容,包括过滤器。

    const controllerProps = useListController(props);
      
    <ListContextProvider value={controllerProps}>
      <MyDashboardView>
    </ListContextProvider>
    

    【讨论】:

      【解决方案2】:

      感谢您的解决方案。屏幕呈现以下警告

      如何删除所有警告? 警告:React 无法识别 DOM 元素上的 basePath 属性。如果您有意希望它作为自定义属性出现在 DOM 中,请将其拼写为小写 basepath。如果您不小心从父组件传递了它,请将其从 DOM 元素中移除。

      像 basePath 控制台显示与其他道具相同的警告“currentSort, defaultTitle,displayedFilters,filterValues,hasCreate,hideFilter,isLoading,loadedOnce,onToggleItem,onUnselectItems,perPage,selectedIds,setFilters,setPage,setPerPage,setSort,showFilter,hasBulkActions"

      警告:标签上的 prop translate 值无效。要么将其从元素中移除,要么传递一个字符串或数值以将其保留在 DOM 中。详情

      const initProps = {
        basePath: '/',
        hasCreate: false,
        hasEdit: false,
        hasList: true,
        hasShow: false,
        location: { pathname: '/', search: '', hash: '', state: undefined },
        match: { path: '/', url: '/', isExact: true, params: {} },
        options: {},
        permissions: null,
        resource: 'dashboard',
        perPage: 5
      };
      
      <List
      {...initProps}
      filterDefaultValues={{
        arrivedTimestampStart: moment().format('YYYY-MM-DD'),
        arrivedTimestamp: moment().format('YYYY-MM-DD')
      }}
      filters={<DashboardFilter />}
      sort={{ field: 'arrivedTimestamp', order: 'DESC' }}
      pagination={<Fragment />}
      exporter={false}
      >
      <Responsive
        medium={
          <div style={styles.flex}>
           <OtherComponent />
          </div>
          }
      />
      </List>
      

      【讨论】:

      • @Michail Michailidis 你能帮忙吗?
      【解决方案3】:

      我终于设法通过伪造所需的道具来使用 react-admin 的组件。在 MyDashboard 组件中,我定义了组件所需的道具:

          let fakeProps = {
              basePath: "/incidents",
              hasCreate: false,
              hasEdit: false,
              hasList: true,
              hasShow: false,
              history: {},
              location: { pathname: "/", search: "", hash: "", state: undefined },
              match: { path: "/", url: "/", isExact: true, params: {} },
              options: {},
              permissions: null,
              resource: "incidents"
          }
      
          <List {...fakeProps}>
            <DataGrid>
              <TextField .... />
            </DataGrid>
          </List>
      

      这确实是一个次优的解决方案,但在第一次运行时它解决了我的问题。

      【讨论】:

      • 我也有同样的问题。我解决了以与您在这里相同的方式显示核心内容的问题(尽管您不需要所有假道具才能使其工作)。我的问题是我想要分页和过滤功能。我可以在该页面上放置一个列表,但是当我对页面进行排序/过滤/搜索/或更改页面时,它会重定向到 CRUD 列表而不是停留在仪表板上。所以我的问题是 - 如何禁用重定向?
      • @WilliamSchroederMcKinley 检查我的分页解决方案 - 在仪表板上添加过滤更新也应该很容易:)
      • @Thomas Halwax 如何实现自定义 api 加载到列表和数据网格中。请帮助我。我的 url 像这样localhost:3000/api/templates/…
      • @Santhosh 很抱歉,您的问题不是很具体。请创建一个新问题并添加更多详细信息。
      • @ThomasHalwax 请检查我的问题一次stackoverflow.com/questions/55370679/…
      【解决方案4】:

      我们请求在仪表板中创建一个列表,因此我使用了已接受的答案。虽然分页不会触发对服务器的新请求,即使 url 发生了变化。

      这是使用 react-router v4 进行分页的最终解决方案。

      &lt;Admin dashboard={Dashboard}&gt;我加了:

      <Resource name="dashboard-stats"/>
      

      在 Dashboard.js 中,这就是我所拥有的:

      import React, { Component } from 'react';
      import { GET_LIST } from 'react-admin';
      import Card from '@material-ui/core/Card';
      import CardHeader from '@material-ui/core/CardHeader';
      
      import dataProvider from './dataProvider';
      import {
          List,
          TextField,
          Datagrid
      } from 'react-admin';
      
      
      export default class Dashboard extends Component {
          state = {};
      
          initProps = {
              basePath: "/",
              hasCreate: false,
              hasEdit: false,
              hasList: true,
              hasShow: false,
              location: { pathname: "/", search: "", hash: "", state: undefined },
              match: { path: "/", url: "/", isExact: true, params: {} },
              options: {
              },
              permissions: null,
              resource: "dashboard-stats",
              perPage: 5
          };
      
          componentWillMount() {
              this.unlisten = this.props.history.listen((location, action) => {
      
              if (location.search) {
                  //regex from: https://stackoverflow.com/a/8649003/1501205
                  let queryParams = JSON.parse('{"' + decodeURI(location.search).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g,'":"') + '"}')
                  let perPage = queryParams.perPage;
                  let page = queryParams.page;
                  this.initProps.perPage = perPage;
                  this.initProps.page = page;
                  this.initProps.location = location;
                  this.setState({'initProps': this.initProps})
      
                  }
      
              });
          }
          componentWillUnmount() {
              this.unlisten();
          }
      
      
          componentDidMount() {
      
              this.setState({'initProps': this.initProps});
      
              dataProvider(GET_LIST, 'stats', {
                  sort: { field: 'date', order: 'DESC' },
                  pagination: { page: 1, perPage: 50 },
              })
              .then(response => {
                  this.setState({'stats':  response.data});
              });
          }
      
          render() {
      
              const {
                  initProps
              } = this.state;
      
              if(!initProps) {
                  return false;
              }
      
      
              return <Card>
                  <CardHeader title="Welcome to the Dashboard" />
      
      
                  <List {...initProps} >
                          <Datagrid>
                              <TextField source="description" />
                              <TextField source="state" />
                              <TextField source="date" />
                          </Datagrid>
                      </List>
      
              </Card>;
      
          }
      }
      

      不要忘记用刚刚更改的位置更新位置this.initProps.location - 否则它将在第一次单击(路线更改)时起作用,然后它将停止工作

      【讨论】:

      • 我也有同样的要求。看起来 react-admin 在这方面不是很灵活。有人试过直接用 ListController 吗?
      【解决方案5】:

      您一定希望显示来自各种资源的数据,否则您只会使用常规的“列表”页面。

      仪表板可以做到这一点。看看演示Dashboard

      您传递给组件的多个 dataProvider(GET_LIST,...。您可以使用此 Demo Dashboard 组件作为示例。Pending Orders

      【讨论】:

      • 你说得对,我想展示来自多个资源的最新/重要数据。演示仪表板是手动制作的,没有任何 react-admin 的“魔法”。更具体地说:我的问题是是否可以使用 react-admin 中的“魔术”组件(如 List、Datagrid、TextField ......)以获得过滤器、排序等所有好处。
      猜你喜欢
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      • 2016-05-17
      相关资源
      最近更新 更多