Почему данные приходят не так, как ожидается?

Имеется такой React Component

import React, {useState, useEffect} from 'react';

//UI

import PokemonItem from './../PokemonItem';

function PokemonList() {

    const [pokemons, setPokemons] = useState({
        pokemonList: null,
        loading: true,
    }); 

    useEffect(()=>{
        fetch('https://pokeapi.co/api/v2/pokemon/')
        .then(res => res.json())
        .then(body => {
            setPokemons({
                pokemonList: body.results,
                loading: false,
            })

        })
    }, [])

    console.log(pokemons); 

    return(
        <div className="pokemon-list">
        </div>
    )
}

export default PokemonList;

После вызова хука useEffect(), я смотрю в консоли, что у меня находится в pokemons (В переменной, в которую должны были придти данные)

Но почему-то в консоли появляется 2 лога, один с начальными данными, а потом с уже пришедшими данными, почему так происходит?

введите сюда описание изображения

Эта проблема в дальнейшем не позволяет мне работать с данными, видимо происходит какая-то ошибка, что я делаю не правильно?

Пытался добавить эту строку console.log(pokemons); после setPokemons();, в таком случаи в консоли появляется один лог с начальными данными, т.е. null в pokemonList, данные еще не успевают придти.


Ответы (1 шт):

Автор решения: Илья Паймушкин

как правильно сказал Сергей

useEffect(() => {}, [])

срабатывает после первого рендера компоненты. Это эквивалентно componentDidMount в классовых компонентах.

соответственно вы видете 2 разных состояния - начальное и когда пришел ответ от сервера и поменялся state компоненты

предположу что ваша проблема связана с тем что вы делаете map для pokemons.pokemonList и ваше начальное значение это null.

самый простой способ решения этой проблемы инициализировать начальное состояние как

const [pokemons, setPokemons] = useState({
    pokemonList: [],
    loading: true,
});
→ Ссылка