ReactuseState钩子未通过axios调用更新
我知道这是一个常见问题,因为我在过去的两个小时里浏览了每个答案并试图让我的状态更新,但没有任何效果。
我正在从 cms 获取文本,但是在第一次加载时状态未定义并且我的应用程序崩溃。但是,如果我注释掉该行,加载页面并取消注释该行,则会显示正确的值。
这是我尝试过的一些代码。
我希望得到的数据
[
{id:1},
{id:2},
{id:3},
{id:4},
]
import react, {useEffect, useState} from 'react'
import axios from 'axios'
const [carouselTitle, setCarouselTitle] = useState([])
useEffect(() => {
fetchData();
}, []);
const fetchData = async () => {
await axios('api').then(
response => {
console.log(response.data)
setCarouselTitle(response.data)
console.log(carouselTitle)
})
};
return(
<h1>{carouselTitle[1].id}</h1>
)
控制台记录数据工作正常,但是当我控制台记录状态时它不起作用。
我尝试的第二种方法
useEffect(() => {
const fetchData = async () => {
const res = await axios('api');
const carouselTitleAlt = await res.data;
setCarouselTitle({ carouselTitleAlt });
console.log(carouselTitleAlt);
console.log(carouselTitle);
};
fetchData();
}, []);
再次控制台记录 useEffect 内的 const 显示正确的信息,但记录状态不起作用。
感谢您的回答或显示数据的更好方法。
回答
setState是异步的:https : //reactjs.org/docs/faq-state.html#why-doesnt-react-update-thisstate-synchronously
这意味着您不能期望在您调用 之后的行中 console.log 新状态值setCarouselTitle。
要记录新值,您可以使用另一个 useEffect,在依赖项数组中带有 carouselTitle,您可以console.log(carouselTitle):
useEffect(() => {
console.log(carouselTitle);
}, [carouselTitle]);
也就是说,您的组件应该正确运行,它会在状态更新时刷新。
在 JSX 中,您应该检查 carouselTitle 是否未定义(意味着请求失败或仍在等待中):
{carouselTitle && <H1>{carouselTitle[0].id}}
https://reactjs.org/docs/conditional-rendering.html#gatsby-focus-wrapper