【问题标题】:Redux middleware not dispatching new actionsRedux 中间件未调度新操作
【发布时间】:2018-06-12 07:23:01
【问题描述】:

我正在创建一个监听特定操作的 Redux 中间件。如果该操作类型与我要查找的内容匹配,我想发送另一个操作。这样做的原因是因为我有一些共享功能的不同组件,所以我想更新操作以具有相似的类型,但不同的有效负载(术语),如下所示:

const updateActions = store => next => action => {
    console.log(action);
    if (action.type === 'UNIQUE_ACTION_A') {
        return next({ type: 'NEW_ACTION', term: 'new_action_a_test' });
    } else if (action.type === 'UNIQUE_ACTION_B') {
        return next({
            type: 'NEW_ACTION',
            term: 'new_action_b_test'
        });
    }
    return next(action);
};

const store = createStore(
    rootReducer,
    composeWithDevTools(applyMiddleware(thunk, updateActions))
);

我遇到的问题是这些操作没有调度。当我 console.log 所有动作时,它们会继续正常运行,而不是调度新动作。就好像调度这些动作的调用被忽略了。我在这里做错了什么?谢谢!

【问题讨论】:

  • 你有没有看到顶部的console.log
  • @Krasimir 是的。它记录了每一个动作,所以我看到它忽略了我想要调度的动作。
  • 我认为您不会看到NEW_ACTION 注销,因为这不是通过相同的功能。它被发送到减速器。您可以尝试将 console.log 放在您的减速器中,看看您是否得到 NEW_ACTION 而不是 UNIQUE_ACTION_A 例如。

标签: redux


【解决方案1】:

中间件内部的nextdispatch 之间存在差异。 dispatch 向调度链的最开始发送一个动作,这将导致它运行通过管道中的所有中间件。 next 在这个中间件之后将其发送到 next 中间件,并最终发送到 reducer。通过调用next({type : "NEW_ACTION"}),您将其发送到下一个中​​间件,而这个中间件永远不会看到"NEW_ACTION"

另见the Redux FAQ entry on next vs dispatch in middleware

【讨论】:

  • 谢谢。我更新为使用store.dispatch({ type: 'NEW_ACTION', term: 'new_action_a_test' }),而不是next,但我收到Uncaught RangeError: Maximum call stack size exceeded 错误,因为它会产生无限循环。有没有办法在不陷入无限循环的情况下使用dispatch
  • 您的逻辑一定有问题,以至于您总是调度这个新动作,而不是仅仅有条件地调度。您需要修复您的逻辑,使其仅在特定条件下调度新操作,并且这些条件不会重复。
  • 是的!你是对的。我的工作代码库的逻辑存在问题(不在上面的示例中)。我正在检查并将操作类型设置为相同,这会导致循环。基于上面的这个例子,它不会进入循环,因为它在匹配一次后将类型设置为不同。谢谢马克!
猜你喜欢
  • 2019-12-04
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 2017-11-09
  • 2021-10-08
  • 1970-01-01
相关资源
最近更新 更多