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

React Redux中从Reducer/Store读取值为何出现undefined?

React Redux中URL参数存入Reducer后Component读取undefined的问题解决

问题描述

使用React Redux开发时,从URL参数获取micSessionId并存入Reducer,但在Component1中读取该值时显示undefined。App.js可正常获取micSessionId并执行dispatch更新动作,相关代码如下:

URL地址

http://localhost:3000?micSessionId=89e2ff80-c1d7

App.js代码

import * as types from '../lib/store/action';
import { useDispatch } from 'react-redux';

const App = () => {
  const dispatch = useDispatch();
  useEffect(function () {
    const params = new URLSearchParams(window.location.search);
    const SessionId = params.get('micSessionId');

    if (SessionId != null && SessionId.length) {
      console.log("saving SessionId: " + SessionId);
      dispatch(
        types.updateData({
          micSessionId: SessionId
        })
      );
    }
 })
}

Reducer.js代码

import * as types from './action';

export const initialState = {
    recDetails: {
        name: '',
       country: '',
        city: ''
    },
    micSessionId: ''
}

const Datareducer = (state = initialState, action) => {
    switch (action.type) {
        case types.UPDATE__DATA:
            const output = action.payload;
            if (output.recDetails) {
                state.recDetails = output.recDetails;
            }
            if (output.micSessionId) {
                state.micSessionId = output.micSessionId;
            }
            return {
                ...state,
            }
            break;
        default:
            return state;
    }
}

export default Datareducer;

Action.js代码

export const UPDATE_DATA = 'UPDATE_DATA';

export const updateData = payload => ({
    type: UPDATE_DATA,
    payload
});

Component1.js代码

import * as types from '../../lib/store/action';
import { useSelector, useDispatch } from 'react-redux';

const Component1 = () => {
  const { SessionId } = useSelector(state => state.app.DataReducer.micSessionId);
  const uDispatch = useDispatch();

  useEffect(() => {
      alert(SessionId);
  })
}

问题原因及修正方案

1. Action Type拼写不匹配

Reducer中使用的types.UPDATE__DATA多了一个下划线,与Action.js中定义的UPDATE_DATA不一致,导致Reducer无法识别dispatch的动作,不会更新state。

修正后的Reducer.js关键代码:

switch (action.type) {
    // 修正为与Action一致的type
    case types.UPDATE_DATA:
        const output = action.payload;
        // 采用Immutable方式更新state,避免直接修改原对象
        return {
            ...state,
            recDetails: output.recDetails ? { ...state.recDetails, ...output.recDetails } : state.recDetails,
            micSessionId: output.micSessionId || state.micSessionId
        }
    default:
        return state;
}

2. useSelector值解构错误

state.app.DataReducer.micSessionId本身是字符串类型,不能用对象解构const { SessionId } = ...,应直接赋值。

修正后的Component1.js关键代码:

// 直接获取值,无需解构
const SessionId = useSelector(state => state.app.DataReducer.micSessionId);

useEffect(() => {
    alert(SessionId);
}, [SessionId]); // 添加依赖项,确保值更新时触发alert

3. Reducer直接修改原state

原Reducer中直接赋值state.recDetails = output.recDetails违反Redux Immutable更新原则,可能导致state更新不被检测到。修正为创建新对象的方式更新state(见上面Reducer修正代码)。

4. useEffect缺失依赖项

App.js中的useEffect未添加dispatch作为依赖项,可能导致dispatch引用失效。

修正后的App.js关键代码:

useEffect(() => {
    // 原有逻辑
}, [dispatch]); // 添加dispatch依赖

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 07:37:59