React state hook 不能正确处理异步数据
React state hook doesn't properly handle async data
我正在尝试通过处理后端 API 的效果挂钩来设置组件的状态。由于这只是一个模拟,我想使用香草反应方法而不是像 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('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.
如果你想在这里看到状态发生了变化,你可以使用
const [odds, setOdds] = useState({})
useEffect(() => {
(async () => {
fetchMock.once('odds', mocks.odds)
let data = await fetch('odds').then(response => response.json())
setOdds(prevData => {
console.log(prevData, data) // {}, {...actual data}
return data
})
})()
}, [])
我正在尝试通过处理后端 API 的效果挂钩来设置组件的状态。由于这只是一个模拟,我想使用香草反应方法而不是像 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('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.
如果你想在这里看到状态发生了变化,你可以使用
const [odds, setOdds] = useState({})
useEffect(() => {
(async () => {
fetchMock.once('odds', mocks.odds)
let data = await fetch('odds').then(response => response.json())
setOdds(prevData => {
console.log(prevData, data) // {}, {...actual data}
return data
})
})()
}, [])