在下面的useEffect中,成功获取并记录数据:
const [allBooks, setAllBooks] = useState([]);
useEffect(() => {
axios.get('/all_books').then(res => {
setAllBooks(res.data);
console.log(res.data)
//console.log(allBooks)
}).catch(error => {
console.log(error);
});
}, []);
//...
return(
{allBooks.length > 0 ? (
<div className="books__directory">
<ul>
{allBooks.map(book => (
<li key={book.id}>
<h3>{book.title}</h3>
<h3>{book.language}</h3>
<h3>{book.category}</h3>
</li>
))}
</ul>
</div>
) : (
<Spinner animation='border'/>
)});
但是,当我尝试以下日志时:console.log(allBooks)
,它记录一个空对象。这意味着状态变量没有更新。jsx组件总是显示微调器。我尝试了这里建议的方法React Native: useState inside of useEffect does not update the state variable,但问题仍然存在。这是我在useEffect中使用的另一种方法:
async function fetchData() {
let response = await axios.get(`/all_books`)
let data = response.data
setAllBooks(data)
console.log(allBooks)
}
fetchData()
任何帮助都很感激。
2条答案
按热度按时间lyfkaqu11#
当我尝试console.log一个临时数组时,我可以在控制台上看到值。我只是在useEffect钩子之外,就在返回之前写入console.log。在这里,您可能会发现demo in this link.
另一种解决方案可能是使用async函数来获取数据。但是无论你做什么,状态设置器函数都是同步函数,你不能等待它们,你不能编写依赖于等待状态设置器的逻辑。
下面是useEffect的异步逻辑:
vi4fp9gy2#
setAllBooks
本身是异步的,并且会随时更新allBooks
。只需添加一些逻辑,以便仅在allBooks
不为空时才执行操作。就像你可以有这样的效果:
或者,如果您只是将
console.log
放在当前useEffect
之外,您应该会看到它会运行多次,并最终打印出数据。