Проблема
Ошибка возникает из-за способа установки состояния в функции componentDidMount
. Чтобы понять, почему это происходит, я объясню, что код пытается сделать: во-первых, Ax ios отправит запрос на получение для получения сообщений, потому что это асинхронное действие c, которое выполняется awaited javascript будет работать над чем-то другим во время получения данных. Так что он продолжится и запустит функцию render
в первый раз. Функция рендеринга вернет No Posts!
, поскольку this.state.posts.length ?
равно false
.
Затем, когда мы закончим sh получение сообщений, componentDidMount
продолжится, в этом случае будет обновлено состояние this.setState({posts: res.data.slice(0,10)})
, каждый раз, когда вызывается setState
, он будет реагировать на повторное выполнение функции render
для этого компонента, чтобы убедиться, что страница отражает то, что находится в нашем состоянии. Затем мы переходим к следующей строке, где ожидаем получения фотографий, в то время как мы ожидаем, что функция render
запустится во второй раз, потому что (как только что было сказано) мы изменили состояние компонента. На данный момент у нас по-прежнему нет фотографий, так как мы ожидаем их получения, но у нас есть сообщения, поэтому проверка на наличие сообщений this.state.posts.length ?
будет true
. Затем, когда мы доберемся до images[index]
, оно будет неопределенным, потому что мы еще не завершили получение фотографий и не установили их в состояние. (Надеюсь, это поможет вам понять проблему).
Решение
Обновите состояние после того, как мы получим все данные, чтобы второй раз использовать функцию render
запускает, у нас есть изображения:
const res = await axios.get("https://jsonplaceholder.typicode.com/posts");
const res2 = await axios.get("https://jsonplaceholder.typicode.com/photos");
this.setState({
posts: res.data.slice(0, 10),
images: res2.data.slice(0, 10)
});
Я бы также предложил добавить проверку безопасности к this.state.images
, как вы делали с постами, чтобы убедиться, что у вас действительно есть данные, прежде чем пытаться их использовать. Это хорошая практика для всех данных, которые поступают из сетевых вызовов, потому что при попытке получить данные из службы может произойти много неожиданных вещей.
Наконец, я также предлагаю вам попробовать выполнить код с помощью chrome отладчик. Это поможет вам понять, что делает код, чтобы лучше понять, почему может происходить такая проблема. Вот хорошее руководство о том, как это сделать. https://developers.google.com/web/tools/chrome-devtools/javascript