Объекты недопустимы в качестве дочернего элемента React (найдено: объект с ключами {id, name}). Если вы хотели отобразить коллекцию дочерних элементов, вместо этого используйте массив

#arrays #json #reactjs #material-table

#массивы #json #reactjs #материал-таблица

Вопрос:

То, что я пытаюсь сделать, это извлечь данные из API и отобразить их в таблице, используя библиотеку material-table . Я считаю, что это мне не удается правильно манипулировать объектами и массивами.

Мой 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 возвращает массив, а таблица не распознается.

Но я до сих пор не смог этого сделать. И то, как я это сделал, возвращает следующую ошибку: Сбой типа реквизита: недопустимый реквизит data , предоставленный MaterialTable

Комментарии:

1. Что ж, попробуйте: response.data.data .

2. @EmanueleScarabattoli Я сделал то, что сказал, и это вызвало у меня еще одну ошибку. Я полагаю, это потому, что api возвращает объект в массиве. Объекты недопустимы в качестве дочернего элемента React (найдено: объект с ключами {id, name}). Если вы хотели отобразить коллекцию дочерних элементов, вместо этого используйте массив.

3. Ну, я думаю, что используемый вами пакет не поддерживает вложенные объекты. Вы можете изменить пакет или создать адаптер, который сделает ваш массив плоским.

4. @EmanueleScarabattoli Не могли бы вы помочь мне создать этот адаптер? Я действительно новичок в этом, и я понятия не имею, как это сделать.

5. Проверьте ответ 🙂

Ответ №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 , содержащее ваш массив объектов.

Комментарии:

1. Где я собираюсь вызвать постоянный адаптер?

2. Обновил ответ.

3. Работает! Большое вам спасибо!