【问题标题】:How to apply middleware selectively to reducers?如何有选择地将中间件应用于reducers?
【发布时间】:2020-10-26 17:01:57
【问题描述】:

使用 reduxjs-toolkit,我定义了我的商店和中间件,如下所示:

const store = configureStore({
    reducer: rootReducer,
    middleware: [reduxWebsocketMiddleware, adamBrownMiddleware]
});

但是我只想将此中间件应用于某些减速器,而不是全部。具体来说,我想将 websocket 中间件应用到某些 reducer,而在其他情况下,我正在调用 API,并且不需要这个 websocket 中间件。

似乎添加另一个商店来执行此操作是一种反模式。

那么我怎样才能只为某些 reducer 应用中间件呢?

【问题讨论】:

  • 不清楚你是否正在重新利用你的 schleem,所以也可以检查一下
  • 问题陈述听起来不正确。中间件不“适用于减速器”。中间件围绕dispatch 形成一个管道,然后分派的动作最终到达根reducer。你能提供更多的例子来说明你特别想做的事情吗?

标签: redux redux-toolkit redux-middleware


【解决方案1】:

您可以随时在中间件中检查 action.type 属性(例如,如果它以 "mySliceName/" 开头),否则跳过中间件的其余部分。

由于您没有真正举例说明您的中间件在做什么以及为什么要限制它,因此实际上不可能再给您更多的输入。

这可能看起来像这样:

const middleware = api => next => action => {
  if (!action.type.startsWith("myWebsocketSlice/") { return next(action); }
 // normal middleware code here
}

【讨论】:

  • 我已更新问题以包含原因。主要是我不想把 websocket 中间件应用到所有东西上。
  • 我在答案中添加了一个示例。只需检查操作类型。那个if 不会损害任何性能,实际上所有中间件都是这样工作的。另外,正如 Mark 正确提到的:中间件适用于动作,而不是减速器。
猜你喜欢
  • 1970-01-01
  • 2010-09-17
  • 2017-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
相关资源
最近更新 更多