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

首次使用Redux开发时状态无法更新,useEffect订阅也无法获取新值

问题原因&修复方案

1. Reducer写法错误

Redux Toolkit的createReducer内置Immer,仅支持两种状态更新写法:直接修改state的属性、return新的状态对象。你当前直接给局部参数state重新赋值是无效操作,不会触发状态更新。
修改reducer.ts中的reducer逻辑:

export default createReducer(initialState, builder=>
  builder
.addCase(setUsername, (state ,action)=>{
  // 直接修改属性即可,RTK会自动生成不可变更新
  state.username = action.payload
})
.addCase(setPassword,(state,action)=>{
  state.password = action.payload
})
.addCase(setModalOpen,(state,action)=>{
  state.modalOpen = action.payload
})
  )

2. 状态选择器路径错误

hooks.ts中的useGetAuthState选择器取值路径错误,你需要对应store中注册auth reducer的挂载key,比如你注册reducer时配置为{ auth: authReducer },就修改为:

export function useGetAuthState():IAuth {
  return useSelector((state:AppState)=>state.auth)
}

3. 组件调用逻辑错误

你直接在组件顶层调用setUsername,会导致每次组件渲染都触发dispatch,进而触发无限重渲染。同时内部组件Topic访问的是外层的authState闭包值,无法拿到最新状态。
修改implementation.tsx逻辑:

function Review():JSX.Element {
  const match = useRouteMatch()
  const setUsername = useSetUsername()

  // 放到useEffect中仅挂载时执行一次
  useEffect(() => {
    setUsername('why wont this work?')
  }, [setUsername])


  function Topic(){
    let {topicId} = useParams<{topicId:string}>()
    // 内部直接调用选择器获取最新状态
    const authState = useGetAuthState()
    console.log(authState)
    console.log(topicId)
    return <>The topic is... {topicId}</>
  }

  function Main(){
    return (
      <div>
        Primary Page
      </div>
    )
  }

  return(
    <Switch>
      <Route path={`${match.path}/:topicId`}>
        <Topic/>
      </Route>
      <Route path={`${match.path}/`}>
        <Main />
      </Route>
    </Switch>
  )
}

额外修复(可选,不影响当前问题)

actions.ts中setModalOpen的action type存在拼写错误,'auth/setModalOpan'应改为'auth/setModalOpen',避免后续调用该接口时状态不更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:06:03