我想在调用next()
之前修改状态,以便在中间件之后应用的每个reducer都获得新状态。 有可能吗?怎么样?
我想到的唯一想法是非常hacky,并且会是这样的:
export const myMiddleware = (store) => (next) => (action) => {
const oldReducer = ????
store.replaceReducer(myReducer);
store.dispatch(action);
const newState = store.getState();
store.replaceReducer(oldReducer);
return next(newState);
}
由于我还没有看到任何获得当前减速器的方法,因此应该以任何方式将其提供给中间件:
export const myMiddleware = (oldReducer) => (store) => (next) => (action) => {
...
}
const store = createStore(originalReducer, applyMiddleware(myMiddleware(originalReducer)));
这似乎更加骇人!
主要目的是构建一个包,用于映射商店action.payload
中的操作对象(action.meta
)和路径(state
)。在这种情况下,reducer以npm包的形式分发,因此它应该是"链接"不知何故。现在,reducer正在检测有效负载内是否存在路径和对象,并尝试从中减少新状态。
最糟糕的解决方案是指示用户在减速器内的任何其他动作之前,从他们自己的减速器调用减速器。这不是一个坚实的模式。所以起初,我正在思考尽可能多的不可知的中间件,它们可以自动完成工作。这就是为什么我会尝试从中间件修改状态的原因。
答案 0 :(得分:0)
您可能不希望从中间件中调用单个Reducer。听起来你正在将多个连续动作应该集中在一个动作中,这就是导致你出现问题的原因。如果您使用redux-saga之类的东西来管理行动链,那么您可以轻松地完成您正在寻找的内容。
以下是使用redux-saga管理一系列操作的基本示例:
import { takeEvery } from 'redux-saga'
import { put } from 'redux-saga/effects'
export function * watchForSomeAction () {
// Every time SOME_ACTION is dispatched, doSomethingElse() will be called
// with the action as its argument
yield * takeEvery('SOME_ACTION', doSomethingElse)
}
export function * doSomethingElse (action) {
// put() is redux-saga's way of dispatching actions
yield put({ type: 'ANOTHER_ACTION', payload: action.payload })
}
此示例只是监视SOME_ACTION
,当它发生时,它会调度ANOTHER_ACTION
。通过这样的事情,您可以确保ANOTHER_ACTION
的缩减器处理由SOME_ACTION
的缩减器产生的新状态。