【问题标题】:How to pass args from sagaMiddleware to action watcher如何将 args 从 sagaMiddleware 传递给 action watcher
【发布时间】:2018-09-22 01:18:32
【问题描述】:

我是 Sagas 的新手,曾经来自 redux-thunk 背景, 所以我不确定将参数传递给我的最终行动的最佳方式是什么。 我会很感激某种“For dummy answer”

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

所以,问题是。 使用我当前的代码,如何传递一些 args (在这种情况下“会话”到 sagas.js 中的最终操作)

store.js这里是“会话”

sagaMiddleware.run(function* () {
    yield* saga1(session);
    yield* saga2(session);
  });

saga1.js

导出操作:

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
}

【问题讨论】:

  • 仅供参考,会话对象来自一个包,所以我不能使用像refer 这样的选项来使用状态。我想这样做。

标签: redux react-redux redux-saga


【解决方案1】:

有多种方法可以做你想做的事,选择一种取决于你的用例和偏好。

传下去方法

最简单的方法就是将对象一直向下传递到myAction saga。

yield* saga1(session)
...
fork(watchAction1, session)
...
yield takeEvery(actionTypes.SEND_EVENT, myAction, session)
...
function* myAction(session, action) {
    console.log(session);
}

如果您只有很少的 sagas 或者您的 sagas 的结构是扁平的,因此您不必将其传递得太深,这已经足够了。

导入方式

解决此问题的另一种方法是导入会话对象。如果您需要先进行一些初始化,您可以创建一个导出单例对象的文件,如下所示:

// 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') 访问上下文值,这有时会成为问题(例如,在使用闭包编译器或类型检查时)。

所以选择你的毒药:)

【讨论】:

  • 谢谢你,这真的是我的问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
相关资源
最近更新 更多