我们正在运行SPA。调度的操作(不是组件)是基于身份验证的。
是否可以拦截和转换调度的动作?
即
dispatch({
type: 'FOO',
payload: { some: value }
})
function magicMiddleware(action) => decide if authorized.
if no...
dispatch({
type: 'BAR',
payload: { new: value }
})
else continue
请注意'FOO'永远不应该击中减速器
答案 0 :(得分:3)
是的,这绝对是中间件的预期用例之一。任何中间件都可以在到达Reducer之前检查和修改通过管道的任何操作,甚至可以防止操作继续进行。
您可能需要阅读Redux文档中的Middleware页面以及Redux Middleware中React/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
}
}
}