【问题标题】:Objects are not valid as a React child (found: object with keys {id, name}). If you meant to render a collection of children, use an array instead对象作为 React 子对象无效(找到:带有键 {id, name} 的对象)。如果您打算渲染一组孩子,请改用数组
【发布时间】:2021-02-21 19:04:04
【问题描述】:

我要做的是从API 中提取数据并使用material-table library 将其显示在表格中。我相信是我没有设法以正确的方式操作对象和数组。

我的 api 返回这个响应:

{
  "data": [
    {
      "id": 7,
      "field01": 1,
      "field02": 1,
      "field03": false,
      "people": {
        "id": 1,
        "name": "John"
      },
       "id": 8,
       "field01": 2,
       "field02": 2,
       "field03": false,
       "people": {
         "id": 2
         "name": "Mattew"
      },
    },
  ]
}

我用来从api 中提取数据的代码:

const [data, setData] = useState([]);

  const getValues = async () => {
    await api.get("/myrequest")
      .then(response => {
        setData(response.data.data);

      }).catch(error => {
        console.log(error);
      })
  }

我使用material-table创建的表:

<MaterialTable
            columns={[
              { title: 'Field 01', field: 'field01' },
              { title: 'Field 02', field: 'field02' },
              { title: 'Field 03', field: 'field03' },
              { title: 'Field 04',field: 'people.name' },
            ]}
            data={data}
            title="My table"
          />

查看文档我注意到了这一点:对象作为 React 子级无效(发现:带有键 {id, name} 的对象)。如果您打算渲染一组子项,请改用数组。

我相信这个错误是因为我的 api 返回了一个数组并且表格无法识别。

但我仍然无法做到这一点。我这样做的方式返回以下错误: 道具类型失败:提供给 MaterialTable 的道具 data 无效

【问题讨论】:

  • 好吧,试试:response.data.data.
  • @EmanueleScarabattoli 我照我说的做了,这又给我带来了另一个错误。我相信这是因为 api 返回数组中的一个对象。对象作为 React 子对象无效(找到:带有键 {id, name} 的对象)。如果您打算渲染一组子项,请改用数组。
  • 好吧,我认为您使用的包不支持嵌套对象。您可以更改包或创建使您的阵列扁平化的适配器。
  • @EmanueleScarabattoli 你能帮我创建这个适配器吗?我对此真的很陌生,我不知道该怎么做。
  • 检查答案:)

标签: arrays json reactjs material-table


【解决方案1】:

好吧,您使用的包似乎无法处理嵌套对象,因此您有两个选择:

  • 考虑使用另一个包,例如react-table

https://github.com/tannerlinsley/react-table

  • 创建一个具有平面对象数组的适配器
const adapter = data => data.map(item => (
    {
        id: item.id,
        field01: item.field01,
        field02: item.field02,
        field03: item.field03,
        name: item.people.name,
    }
));

然后在你的组件中

<MaterialTable
    columns={[
        { title: 'Field 01', field: 'field01' },
        { title: 'Field 02', field: 'field02' },
        { title: 'Field 03', field: 'field03' },
        { title: 'Field 04',field: 'name' },
    ]}
    data={adapter(data)}
    title="My table"
/>

注意:

您应该使用此字段来访问您的数据

response.data.data

因为,正如您所写,response.data 有一个附加字段 data,其中包含您的对象数组。

【讨论】:

  • 我要在哪里调用常量适配器?
  • 更新了答案。
  • 有效!非常感谢!
猜你喜欢
  • 2021-09-28
  • 2020-10-18
  • 2021-11-18
  • 2019-10-12
  • 2021-04-19
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多