Redux 如何将参数从sagaMiddleware传递给动作观察者

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

我是新来的传奇人物,过去的背景是雷多克斯·图恩(redux thunk), 因此,我不确定什么是将论点传递给最终行动的最佳方式。 我会很感激一些“虚幻的回答”

问题是,我的store.js中有一个名为session的对象 我在sagaMiddleware中创建了这个会话,但是为了使我在sagas中的功能正常工作,我总是需要与这个对象交互

所以,问题是。 使用我当前的代码,如何能够将一些参数传递给sagas.js中的最终操作(在本例中为“session”)

store.js这里是“会话”

saga1.js

Expor行动:

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);
}