React+Redux如何解决Unhandled Rejection: Actions must be plain objects报错
Redux dispatch时报错"Actions must be plain objects. Use custom middleware for async actions." 解决方案
错误核心原因
传入dispatch的参数不是纯JavaScript对象,或Redux中间件未正确配置生效,是导致该报错的两类核心原因。结合你提供的代码,具体问题和修复步骤如下:
排查修复步骤
1. 优先检查同名函数导入错误
你在action定义文件和saga文件中都导出了名为lancarSumario的函数:
- action文件中的
lancarSumario是合法的action creator,返回纯对象,符合dispatch要求 - saga文件中的
lancarSumario是Generator函数,若误导入组件用于dispatch,就会直接触发该报错
请确认触发dispatch的组件中,导入路径指向的是action定义文件,而非saga文件,示例正确导入写法:
// 路径替换为你实际存放sumario action的文件路径 import { lancarSumario } from '@/store/modules/sumario/actions';
2. 修复store配置重复问题
你提供的代码中,createStore配置文件与createStore目录下的index.js内容完全重复,会导致循环引入、store重复初始化的问题,删掉其中一份,统一store的初始化入口即可。
3. 检查自定义createStore的中间件应用逻辑
你封装的自定义createStore函数必须正确调用Redux原生的applyMiddleware方法,才能让saga中间件生效,参考正确的封装写法:
// createStore目录下的createStore.js import { createStore, applyMiddleware } from 'redux'; export default (reducers, middlewares) => { const enhancer = applyMiddleware(...middlewares); return createStore(reducers, enhancer); };
4. 可选:排查rootSaga注册逻辑
若修复以上问题后saga逻辑不执行,请检查./modules/rootSaga.js是否正确引入并注册了sumario模块的saga:
import { all } from 'redux-saga/effects'; import sumarioSaga from './sumario/sagas'; // 替换为实际路径 export default function* rootSaga() { return yield all([sumarioSaga]); }
内容的提问来源于stack exchange,提问作者Ruben Martins
相关产品推荐
相关产品推荐

