redux中间件 - >截距/块/变换?

时间:2017-03-18 02:19:41

标签: javascript redux react-redux redux-middleware

我们正在运行SPA。调度的操作(不是组件)是基于身份验证的。

是否可以拦截和转换调度的动作?

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

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

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

else continue

请注意'FOO'永远不应该击中减速器

2 个答案:

答案 0 :(得分:3)

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

您可能需要阅读Redux文档中的Middleware页面以及Redux MiddlewareReact/Redux links list类别中的文章。这些应该可以让您更好地了解中间件的工作方式以及如何使用它们。

答案 1 :(得分:0)

为什么不让那个动作击中减速器而忽略呢? (最佳选择IMO)

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

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

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