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

React Native集成Redux报错求助:Expected the reducer to be a function

解决React Native Redux报错:Expected the reducer to be a function

兄弟,太懂你卡四天的崩溃感了!我当初集成Redux的时候也栽过这个一模一样的坑,咱们一步步排查,绝对能揪出问题!

先从单个Reducer文件(redux/reducers/users_reducer.js)查起

这是最容易出问题的起点,一定要确保你导出的是纯函数:

  • 必须用export default导出你的reducer函数,别用命名导出(export function xxx),否则后面导入的时候容易出错
  • 函数必须有默认的state参数,并且每个分支(包括default)都要返回新的state

正确示例:

const initialState = {
  users: [],
  loading: false
};

// 这里是默认导出,关键!
export default function usersReducer(state = initialState, action) {
  switch (action.type) {
    case 'SET_USERS':
      return { ...state, users: action.payload };
    case 'SET_LOADING':
      return { ...state, loading: action.payload };
    // 绝对不能忘default分支!否则触发未匹配的action时会返回undefined
    default:
      return state;
  }
}

常见错误:

  • 写成export const usersReducer = (...) => {...}(命名导出,后面导入如果用默认导入就会拿到undefined)
  • 忘了写default case,导致某些action触发后reducer返回undefined
  • 不小心导出了对象或者其他非函数值(比如误写export default { usersReducer })

再检查Reducer合并文件(redux/reducers/index.js)

这里要用Redux的combineReducers把多个reducer合并成根reducer,重点看导入和导出:

  • 导入单个reducer时,如果是默认导出,别加花括号{}
  • 一定要把合并后的根reducer用export default导出

正确示例:

import { combineReducers } from 'redux';
// 因为users_reducer是默认导出,所以直接导入,不用花括号
import usersReducer from './users_reducer';

const rootReducer = combineReducers({
  // 键名可以自定义,对应store里的state结构
  users: usersReducer
});

// 导出合并后的根reducer,关键!
export default rootReducer;

常见错误:

  • 导入时错误使用花括号:import { usersReducer } from './users_reducer'(如果users_reducer是默认导出,这会拿到undefined)
  • 合并后没导出rootReducer,或者导出的是别的东西
  • combineReducers里传的不是键值对对象(比如误传数组或者单个reducer)

最后检查Store创建文件(store/index.js)

确保你传给createStore的是正确的根reducer函数:

  • 检查导入rootReducer的路径是否正确
  • 打印一下rootReducer的类型,确认是function而不是undefined/object

正确示例:

import { createStore } from 'redux';
// 路径要对应你的文件结构,别写错了!
import rootReducer from '../redux/reducers';

// 可以先打印确认类型,排除问题
console.log('根reducer类型:', typeof rootReducer); // 必须输出function

const store = createStore(rootReducer);

export default store;

常见错误:

  • 导入rootReducer的路径错误(比如少写了一层目录,或者文件名拼写错)
  • 不小心把combineReducers的结果赋值给变量但没导出,导致导入的rootReducer是undefined
  • 传给createStore的不是根reducer,而是直接传了对象或者其他值

最后几个容易忽略的小坑

  • 有没有在某个文件里重名覆盖了reducer?比如不小心定义了和reducer同名的变量
  • 检查你的Redux版本?虽然概率低,但某些旧版本的combineReducers用法可能有差异(不过核心逻辑没变)

按这个顺序排查,90%的概率能找到问题!我当初就是因为在reducer合并文件里导入时多写了花括号,卡了一下午……

内容的提问来源于stack exchange,提问作者Napoleon Ike Jones

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:27:26