如何将sagaMiddleWare.run(RootSaga)集成到Redux storeFactory中?
解决Redux Saga Middleware集成报错的正确姿势
兄弟,我太懂你这个报错的糟心了!之前我也踩过这个顺序坑,其实问题核心就俩字——顺序错了:你必须先把saga中间件挂载到Redux Store上,才能调用sagaMiddleware.run(RootSaga),反过来操作肯定会触发那个"必须先挂载中间件"的错误。
下面直接给你能跑通的storeFactory完整代码,再拆解关键步骤:
"use strict"; import { createStore, combineReducers, applyMiddleware } from 'redux'; import createSagaMiddleware from 'redux-saga'; // 替换成你自己的根saga和根reducer路径 import RootSaga from './your-root-saga-path'; import rootReducer from './your-root-reducer-path'; export const storeFactory = () => { // 步骤1:先创建saga中间件实例 const sagaMiddleware = createSagaMiddleware(); // 步骤2:把saga中间件注入到applyMiddleware中,生成store增强器 // 如果还有其他中间件(比如logger),可以一起加在这里,顺序从左到右执行 const middlewareEnhancer = applyMiddleware(sagaMiddleware); // 步骤3:创建Store——这一步会把saga中间件正式挂载到Store上 const store = createStore( combineReducers(rootReducer), // 若根reducer已合并,直接传rootReducer即可 middlewareEnhancer ); // 步骤4:最后再运行RootSaga!这一步必须在Store创建完成后执行 sagaMiddleware.run(RootSaga); return store; };
关键逻辑解释
报错的本质是:sagaMiddleware.run()需要依赖已经完成中间件挂载的Store。如果颠倒顺序(先run再创建Store),中间件还没和Store建立绑定关系,Redux自然会提示你"先挂载中间件"。
另外补充个小细节:如果同时使用多个中间件(比如redux-logger),注意中间件的顺序——applyMiddleware的参数顺序就是中间件的执行顺序,比如你想让logger先捕获action,就把它放在sagaMiddleware前面:
applyMiddleware(loggerMiddleware, sagaMiddleware)
内容的提问来源于stack exchange,提问作者Aran Freel
相关产品推荐
相关产品推荐

