4

我们正在运行一个 SPA。分派的动作(不是组件)是基于身份验证的。

是否可以拦截和转换分派的动作?

IE

dispatch({
    type: 'FOO',
    payload: { some: value }
})

function magicMiddleware(action) => decide if authorized. 
if no...

dispatch({
    type: 'BAR',
    payload: { new: value }
})

else continue

请注意,'FOO' 不应该碰到减速器

4

2 回答 2

7

是的,这绝对是中间件的预期用例之一。任何中间件都可以在管道到达减速器之前检查和修改通过管道的任何操作,甚至阻止操作继续进行。

您可能需要阅读 Redux 文档中的中间件页面,以及我的React/Redux 链接列表中Redux 中间件类别中的文章。这些应该让您更好地了解中间件是如何工作的,以及如何使用它们。

于 2017-03-18T21:02:15.297 回答
0

为什么不让那个动作影响减速器并在那里忽略它呢?
(海事组织的最佳选择)

switch (action.type) {
  case SOMETHING_NOT_FOO:
    return Object.assign({}, state, {
      whatever other new object here...
  })
  default:
    return state
}

如果您通过中间件执行此操作,则需要决定是否要将该操作发送到减速器:

function yourMiddleware(nextDispatch) {
  return function(action) {
    // do stuff
    if (action.type !== 'FOO') {
      return nextDispatch(action);
    } else {
      return nextDispatch({type: 'dummy'}); // need to send an action 
    } 
  }
}
于 2017-03-18T21:53:10.717 回答