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

React-Redux返回数组遇undefined问题:如何用GET_类action处理?

问题根源分析

你的问题核心在于Reducer没有正确维护完整的State结构,同时对Redux的工作逻辑存在一个小误解:不需要通过GET_TODO这类Action来"主动获取"数组——Redux Store会持续保存你的状态,组件通过mapStateToProps就能直接订阅并获取最新的State值。

具体来说,你的Reducer里多数Case直接返回了单个数组(比如case 'ADD_TODO': return [...state.today, action.payload]),这会把原本包含today/finished/later的State对象,直接替换成一个数组。后续组件通过mapStateToProps访问state.important.today时,因为State已经变成了数组,自然会得到undefined。

修复步骤

1. 修正Reducer,始终返回完整的State对象

每个Action Case都应该复制原State,仅更新需要修改的属性,而非直接返回单个属性值。修改后的Reducer代码如下:

const initialState = { today: [1, 2, 3], finished: [3, 2, 1, 3], later: [2, 3, 1, 4, 2, 5] };

export default (state = initialState, action) => {
  switch (action.type) {
    // 处理today相关操作
    case 'ADD_TODO': 
      return {
        ...state,
        today: [...state.today, action.payload]
      };
    case 'DELETE_TODO': 
      return {
        ...state,
        today: state.today.filter((item, index) => index !== action.payload)
      };
    
    // 处理later相关操作
    case 'ADD_LATER': 
      return {
        ...state,
        later: [...state.later, action.payload]
      };
    case 'DELETE_LATER': 
      return {
        ...state,
        later: state.later.filter((item, index) => index !== action.payload)
      };
    
    // 处理finished相关操作
    case 'ADD_FINISHED': 
      return {
        ...state,
        finished: [...state.finished, action.payload]
      };
    case 'DELETE_FINISHED': 
      return {
        ...state,
        finished: state.finished.filter((item, index) => index !== action.payload)
      };
    
    default: return state;
  }
}

注:所有GET_*类型的Case都可以直接删除——因为State始终保存在Store中,组件不需要通过Dispatch这类Action来"获取"数据。

2. 移除不必要的GET类Action和组件调用

  • 从mapDispatchToProps中删除get方法
  • 移除组件componentDidMount里的this.props.get()调用

3. 简化mapStateToProps

由于初始State已经确保today/finished/later都是数组,不需要额外的空值判断,直接取值即可:

function mapStateToProps(state) {
  return {
    today: state.important.today,
    finished: state.important.finished,
    later: state.important.later,
  }
}
修复逻辑说明

Redux的Reducer必须遵循纯函数原则:每次触发Action后,要返回一个包含所有状态属性的新对象,不能直接修改原State,也不能只返回部分State值。这样mapStateToProps才能正确获取到各个属性的最新值。

而关于"获取数据":Redux Store是单一数据源,组件通过connect和mapStateToProps订阅Store变化,只要Store中的State更新,组件就会自动接收到最新的属性值,完全不需要主动Dispatch"GET"类型的Action来拉取数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:57:39