#reactjs #use-state
#reactjs #use-state
Вопрос:
В значительной степени то, что написано в названии. Когда я console.log(репозитории), он возвращает пустой массив. Почему repos
состояние не обновляется?
import React, { useEffect, useState } from "react";
import axios from "axios";
export default () => {
const [repos, setRepos] = useState([]);
useEffect(() => {
(async () => {
try {
let repo_lists = await axios.get(
"https://api.github.com/users/Coddielam/repos"
// { params: { sort: "created" } }
);
setRepos(repo_lists.data.slice(1).slice(-10));
console.log(repo_lists.data.slice(1).slice(-10));
console.log(repos);
} catch (err) {
setRepos([
"Something went wrong while fetching GitHub Api./nPlease use the link below to view my git repos instead ",
]);
}
})();
}, []);
return (
<div className="content">
<h2>View my recent git repos:</h2>
<ul>
...
</ul>
</div>
);
};
Комментарии:
1. Поведение установки состояния является асинхронным по своей природе, поэтому оно не будет немедленно устанавливать состояние.
Ответ №1:
Ответ очень прост. Ваш useState
обновляется.. поверьте мне. Причина, по которой вы не видите его, когда вы console.log()
, потому SetRespos
что это асинхронная функция.
По сути, когда вы объявляете функцию для обновления useState
своего значения, react будет использовать ее как async
функцию
ПРИМЕР
const [example, setExample] = useState('');
useEffect(() => {
setExample('Hello');
console.log('I'm coming first'); // This will be executed first
console.log(example); // This will come after this
}, [])
Вывод будет :
I'm coming first
// Blank Line
Но все равно ваш useState
будет обновляться после этого. Если вы хотите это увидеть, сделайте это :
useEffect(() => {
console.log(respose); // This will give you the value
}, [respos])
Я использую отдельное useEffect
значение для console.log()
значения. В []
(массиве зависимостей) мы передаем respos
, что просто означает, что useEffect
он будет выполняться каждый раз respos
, когда изменяется значение.
Подробнее об useStates and useEffects
этом читайте в документации react
Ответ №2:
Обновления состояния являются асинхронными. Вы увидите их отражение только при следующем рендеринге. Если вы регистрируете состояние консоли сразу после вызова setState, оно всегда будет регистрировать текущее состояние, а не будущее состояние.
Вы можете регистрировать состояние в эффекте каждый раз, когда оно изменяется, и вы увидите, что оно меняется:
useEffect(() => console.log(repos), [repos]);
Этот эффект будет вызван после применения обновления состояния.