You need to enable JavaScript to run this app. React-Redux登录后用户信息未存入Redux 报TypeError对象不可迭代错误
优惠活动
大模型
产品
解决方案
定价
更多

React-Redux登录后用户信息未存入Redux 报TypeError对象不可迭代错误

问题定位与修复方案
  • TypeError: Object is not iterable (cannot read property Symbol(Symbol.iterator)) 报错来源
    这个报错本质是你在App.js中对初始值为null的用户状态做了可迭代操作——比如误用数组解构写法const [user] = useSelector(selectUser)、或者对null值做展开运算。由于Redux中用户状态的初始值是null,本身不具备可迭代属性,只要触发迭代操作就会抛出该错误。
    正确取值写法:
// App.js中直接通过useSelector取值,不要额外加解构
const user = useSelector(selectUser);
// 可自行补充空值判断逻辑
useEffect(() => {
  if (!user) return;
  // 用户信息存在时的业务逻辑
}, [user])
  • Redux store读取到null的时序原因
    你当前的登录流程存在异步逻辑顺序问题:拿到登录接口返回的token后,直接触发获取用户信息的userInfo()异步请求,没有等待该请求完成、dispatch写入Redux store的动作执行,就直接调用history.push('/')跳转首页。此时首页组件刚挂载,读取的store还是未更新的初始值null。
    修正方式是将登录流程的异步逻辑改为串行await执行,等用户信息写入store后再跳转:
const handleSubmit = async (e) => {
    e.preventDefault();
    try {
        // 登录获取token
        const res = await axiosInstance.post(`api/accounts/token/`, {
            email: formData.email,
            password: formData.password,
        });
        localStorage.setItem('access_token', res.data.access);
        localStorage.setItem('refresh_token', res.data.refresh);

        // 等用户信息请求完成、Redux更新后再跳转
        await userInfo();
        history.push('/');
    } catch (err) {
        console.error('登录流程异常', err);
    }
};
  • Redux payload的传参与逻辑不匹配问题
    你现在的slice定义和dispatch传参存在结构错位:
  • UserSlice中login reducer的逻辑是直接将action.payload赋值给state.user,即期望payload为用户信息本身
  • 但你在login.js中dispatch时传入的是嵌套结构{user: currentUser},会导致store中存储的用户数据多套一层对象
    二选一修正即可:
  1. 调整dispatch传参,直接传入用户信息作为payload:
    // 修正后的dispatch逻辑
    await axiosInstance.get(url).then((res) => {
        const currentUser = res.data;
        dispatch(login(currentUser))
    })
    
  2. 调整slice的reducer取值逻辑,适配当前的payload结构:
    // 修正后的login reducer
    login: (state, action) => {
        state.user = action.payload.user;
    }
    
  • Provider包裹范围校验
    你当前的Provider结构只包裹了两个Route组件,需要保证所有路由下的子组件都在Provider的作用范围内,否则会出现组件无法访问Redux store的问题。正常的入口结构需要将Router、Provider放在最外层,覆盖全部渲染组件树:
// 正确的入口渲染结构示例
<Provider store={store}>
  <Router>
    <Route exact path="/login" component={HomeScreen} />
    <Route exact path="/" component={App} />
  </Router>
</Provider>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 02:06:05