Redux中间件在next()

时间:2016-05-13 19:58:07

标签: javascript redux middleware react-redux

我想在调用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正在检测有效负载内是否存在路径和对象,并尝试从中减少新状态。

最糟糕的解决方案是指示用户在减速器内的任何其他动作之前,从他们自己的减速器调用减速器。这不是一个坚实的模式。所以起初,我正在思考尽可能多的不可知的中间件,它们可以自动完成工作。这就是为什么我会尝试从中间件修改状态的原因。

1 个答案:

答案 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的缩减器产生的新状态。