reactjs - React 状态钩子无法正确处理异步数据
问题描述
我正在尝试通过处理后端 API 的效果挂钩来设置组件的状态。由于这只是一个模拟,我想使用 vanilla react 方法而不是 redux-saga 之类的方法。
问题是当获取部分工作时,useState 钩子不会更新状态。
const [odds, setOdds] = useState({})
useEffect(() => {
(async () => {
fetchMock.once('odds', mocks.odds)
let data = await fetch('odds').then(response => response.json())
setOdds(data)
console.log(odds, data) // {}, {...actual data}
})()
}, [])
我试图在 fetch 之上通过管道传输整个过程,例如
fetch('odds')
.then(res => res.json())
.then(data => setOdds(data))
.then(() => console.log(odds)) // is still {}
但这没有任何区别。
我究竟做错了什么?
解决方案
基本上,如果您调用setOdds
, 的值odds
不会立即改变。它仍然是钩子释放时可用的最后一个参考。
如果要在更新后访问新值,则必须使用更新odds
值的源(data
useEffect
useEffect
odds
useEffect(() => {
console.log(odds);
// Do much more
}, [odds]) // <- Tells the hook to run when the variable `odds` has changed.
推荐阅读
- xcode - objc_direct_members 在 Xcode 11.4 beta 中不起作用
- flutter - 列表视图在流完成检索数据之前引发错误
- postgresql - 我可以配置 Aurora DB 最大标识符长度吗?如何?
- c# - Powershell 脚本无法执行。请参阅输出中的 Service Fabric 工具窗格
- python - 从其他数据框填充空值
- javascript - Passport + Express + Typescript req.user.email 未定义
- python - Cloud NDB:事务性 put() 多个实体
- arrays - 在vb中复制字符串数组中重复n个字节的最佳方法
- random - 没有 unsigned int 的 RNG 实现
- bash - 在 .profile 中创建函数以使用 zsh 转到特定文件夹