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
相关产品推荐
相关产品推荐

