You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用useReducer Hook获取API数据时状态未更新问题排查

useReducer更新状态不生效问题排查与解决

问题描述

尝试使用useReducer Hook在API请求成功后更新状态,API返回数据正常,但状态始终未更新,控制台无报错,已检查拼写。相关代码如下:

function Provider (props) {
    let trackState = {
        trackList: [],
        heading: "Top 10 Tracks"  
    }

    const reducer = (state, action) => {
        switch (action.type) {
            case "SEARCH TRACKS":
                return {
                   ...state,
                    trackList: action.payload,
                    heading: 'Search results'
                }

            case "NOT_SEARCHING":
                return {
                    ...state,
                    trackList: action.payload,
                    heading: 'TOP 1O Tracks',
                }

            default:
                return state
        }
    }

    const [state, dispatch] = useReducer(reducer, trackState)

    React.useEffect(() => {
fetch(`https://thingproxy.freeboard.io/fetch/${API.url}${API.tracks}&apikey=${API.key}`) 
        .then(res => {
             if(res.ok) { 
                return res.json()
                }  
                else {
                    throw res;
                }
        
            })
            .then(result => {
                
                dispatch({ type: "NOT_SEARCHING", payload: result.message.body.track_list })
                
                console.log(state)
            }
            )
        }, [])  
        

    return (
        <Context.Provider value={{trackState, API, dispatch}}>

          {props.children}
        </Context.Provider>
    )

}

export {Provider, Context}

解决方案

1. 修正Context传递的状态对象

你在Context.Provider中传递的是初始定义的trackState,而非useReducer返回的实时更新的state,导致消费Context的组件始终拿到初始值。

修改Provider的value:

<Context.Provider value={{state, API, dispatch}}>
  {props.children}
</Context.Provider>

同时确保子组件中使用的是state.trackList和state.heading。

2. 正确查看更新后的状态

dispatch是异步操作,调用后立即console.log(state)打印的是当前闭包中的旧状态。若要查看更新后的状态,需通过useEffect监听state变化:

React.useEffect(() => {
  console.log('更新后的状态:', state);
}, [state]);

3. 修正拼写错误(潜在问题)

NOT_SEARCHING分支中heading的值写成了'TOP 1O Tracks',其中O是字母,应改为数字0:'TOP 10 Tracks',避免显示异常。

内容的提问来源于stack exchange,提问作者Abby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:20:42