Redux 如何将参数从sagaMiddleware传递给动作观察者
我是新来的传奇人物,过去的背景是雷多克斯·图恩(redux thunk), 因此,我不确定什么是将论点传递给最终行动的最佳方式。 我会很感激一些“虚幻的回答” 问题是,我的store.js中有一个名为session的对象 我在sagaMiddleware中创建了这个会话,但是为了使我在sagas中的功能正常工作,我总是需要与这个对象交互 所以,问题是。 使用我当前的代码,如何能够将一些参数传递给sagas.js中的最终操作(在本例中为“session”) store.js这里是“会话” saga1.js Expor行动:Redux 如何将参数从sagaMiddleware传递给动作观察者,redux,react-redux,redux-saga,Redux,React Redux,Redux Saga,我是新来的传奇人物,过去的背景是雷多克斯·图恩(redux thunk), 因此,我不确定什么是将论点传递给最终行动的最佳方式。 我会很感激一些“虚幻的回答” 问题是,我的store.js中有一个名为session的对象 我在sagaMiddleware中创建了这个会话,但是为了使我在sagas中的功能正常工作,我总是需要与这个对象交互 所以,问题是。 使用我当前的代码,如何能够将一些参数传递给sagas.js中的最终操作(在本例中为“session”) store.js这里是“会话” saga
export default function* root() {
yield [
fork(watchAction1),
fork(watchAction2),
];
}
行动观察者
function* watchMyAction() {
yield takeEvery(actionTypes.SEND_EVENT, myAction);
}
行动
function* myAction(action) { // Here I want again the sesssion
// Action.payload stuff, here I want my session arg from loadStore.js
}
有多种方法可以满足您的需求,选择一种取决于您的用例和偏好 传递方法 最简单的方法就是将对象一直传递到
myAction
saga
yield* saga1(session)
...
fork(watchAction1, session)
...
yield takeEvery(actionTypes.SEND_EVENT, myAction, session)
...
function* myAction(session, action) {
console.log(session);
}
这是一个很好的解决方案,如果你只有很少的传奇故事,或者如果你的传奇故事的结构是扁平的,所以你不必把它传得太深
导入方法
另一种方法是导入会话对象。如果需要先进行一些初始化,可以创建一个导出singleton对象的文件,如下所示:
// session.js
import Session from 'session-library';
const config = {foo: 'bar'};
export default new Session(config);
现在,您可以在需要访问会话的任何位置导入此文件。您不需要通过多个文件/传奇来传递它,只需要深入到您的传奇之一。但是,如果需要替换会话对象,则问题可能会更大
// action.js
import session from 'path/to/session';
function* myAction(action) {
console.log(session);
}
上下文方法
第三种方法是使用setContext/getContext
效果。这是我个人的最爱,因为它不依赖于模块系统,不需要任何特殊文件,您可以在需要时请求访问对象,如session
,甚至是在执行过程中
// store.js
const stuffYouWantToAccess = {session};
sagaMiddleware.run(function* (stuffYouWantToAccess) {
yield setContext(stuffYouWantToAccess);
...
}, stuffYouWantToAccess);
// action.js
function* myAction(action) {
const session = yield getContext('session');
console.log(session);
}
它也不是完美的,因为上下文的工作方式有点像全局变量,并且您需要使用字符串名('session'
)访问上下文值,这有时可能是一个问题(例如,在使用闭包编译器或类型检查时)
所以选择你的毒药:)FYI,会话对象来自一个包,所以我不能使用一些选项,比如使用状态引用。我想这样做。谢谢你,这真的是我的问题!
// store.js
const stuffYouWantToAccess = {session};
sagaMiddleware.run(function* (stuffYouWantToAccess) {
yield setContext(stuffYouWantToAccess);
...
}, stuffYouWantToAccess);
// action.js
function* myAction(action) {
const session = yield getContext('session');
console.log(session);
}