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 {}

但这并没有什么区别。

我做错了什么?

基本上如果你调用setOddsodds的值不会立即改变。它仍然是钩子减速时可用的最后参考。

如果要在更新后访问 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
        })

    })()
}, [])