React .map возвращает значение undefined с помощью Fetch API

Я хочу, чтобы мой метод React render возвращал объекты из API аналогично тому, что я получаю от Postman. Например:

{
  "meta": {
    "count": 807,
    "countReturned": 10,
    "requestTime": 1552524395,
    "responseTime": 1552524395,
    "responseMs": 7
  },
  "data": [
     {
        "type": "breeds",
        "id": "1",
        "attributes": {
            "name": "Abyssinian"
        },
        "relationships": {
            "species": {
                "data": [
                    {
                        "type": "species",
                        "id": "3"
                    }
                ]
            }
        },
        "meta": []
    },

Но у меня возникли проблемы с использованием .map для создания объектов, которые я хочу. Вот мой код:

class Results extends Component {
constructor() {
    super();
    this.state = {
        animals: [],
    };
}

componentDidMount() {
    var url = "https://test1-api.rescuegroups.org/v5/public/animals/breeds?fields[breeds]=name&fields[species]=singular,plural,youngSingular,youngPlural&include=species&options=meta&limit=10";
    const API_KEY = process.env.REACT_APP_API_KEY;

    fetch(url, {
        method: 'GET',
        headers: {
            Authorization: API_KEY,
            'Content-Type': 'application/json'}
    })
    .then(response => response.json())
    .then(data => this.setState({animals: data.results }))
}

render() {
    return (

        <div>
            {this.state.animals.map(animal => <div>{animal.results}</div>)}
        </div>

    )
}
}

export default Results;

Любые советы приветствуются!

then(data => this.setState({animals: data.results })), судя по вашему json, в нем нет поля results.
Spark.Bao 14.03.2019 02:42

Я знаю! Я должен был уточнить, что лучше я попробовал data.type, а также более глубокий уровень data.type.breeds, которые оба вызывают ошибки. Я не должен был использовать результаты в своем вопросе.

Cosmos 14.03.2019 02:53
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
1 280
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если вы уверены, что данные JSON, которые вы получаете, верны, вы можете перебрать объект, используя следующий код.

 Object.keys(this.state.animals).map((key) => {
    return <div value = {key}>{ this.state.animals[key] }</div>
});
Ответ принят как подходящий

Параметр метода обратного вызова с именем «данные» не означает, что это свойство data данных ответа.

Я думаю, что обратный вызов должен быть

...
.then(response => response.json())
.then(response => this.setState({animals: response.data}))

<div>
  {this.state.animals.map(animal => <div>{animal.type}</div>)}
</div>

Да, я не понимал, что «данные» - это то, что я определял сам. Мне нужно выяснить, как заставить работать ключи (сочетая ваш ответ с ответом Парта Пателя), но, по крайней мере, я вижу отображаемые данные, с которыми я могу работать. Спасибо!

Cosmos 14.03.2019 04:30

Я думаю, что это сбивает вас с толку из-за немного запутанного соглашения об именах, которое у вас есть. Ваша функция componentDidMount должна выглядеть следующим образом:

componentDidMount() {
    var url = "https://test1-api.rescuegroups.org/v5/public/animals/breeds?fields[breeds]=name&fields[species]=singular,plural,youngSingular,youngPlural&include=species&options=meta&limit=10";
    const API_KEY = process.env.REACT_APP_API_KEY;

    fetch(url, {
        method: 'GET',
        headers: {
            Authorization: API_KEY,
            'Content-Type': 'application/json'}
    })
    .then(response => response.json())
    .then(json => this.setState({animals: json.data }))
}

Вам нужно вытащить ключ data из ответа, который с вашим текущим именем будет data.data.

В вашей функции рендеринга вы будете использовать animals из своего состояния. Если вам нужно название животного, вы должны использовать следующее:

render() {
    console.info(this.state);
    return (

        <div>
            {this.state.animals.map(animal => <div>{animal.attributes.name}</div>)}
        </div>

    )
}

Другие вопросы по теме