У меня проблема с useEffect и useState. Я пытаюсь заполнить состояние данными из api, но это приводит к бесконечному циклу, даже если я использую массив с зависимостями. Это работает, когда я пытаюсь узнать имя. Проблема возникает, когда я пытаюсь получить массив или объект.
Вот код:
const id = props.match.params.id;
const [pokemon, setPokemon] = useState({});
useEffect(() => {
let cancelRequest;
axios
.get(`https://pokeapi.co/api/v2/pokemon/${id}`, {
cancelToken: new axios.CancelToken(
(cancel) => (cancelRequest = cancel)
),
})
.then((res) => {
setPokemon(res.data);
console.log(pokemon);
})
.catch((err) => {
console.log(`ERROR:: ${err.message}`);
});
return () => {
cancelRequest();
};
}, [id, pokemon]);
Вот пример данных из консоли:
{abilities: Array(2), base_experience: 64, forms: Array(1), game_indices: Array(20), height: 7, …}
Спасибо.
1 ответ
Не используйте запрос axios внутри useEffect.
Создайте для этого другую функцию и используйте useCallback
. Например:
const fetchPokemon = useCallback(() => {
axios.get(`https://pokeapi.co/api/v2/pokemon/${id}`)
.then((res) => {
setPokemon(res.data);
})
.catch(() => {}
}, [id])
useEffect(() => {
fetchPokemon()
}, [fetchPokemon])
Если вы передадите pokemon
в массив зависимостей, он будет обновляться каждый раз, когда вы вызываете setPokemon
с момента обновления покемона, иначе говоря, у вас есть бесконечный цикл.
Похожие вопросы
Новые вопросы
reactjs
React - это библиотека JavaScript для создания пользовательских интерфейсов. Он использует декларативную компонентную парадигму и стремится быть одновременно эффективным и гибким.