从reducer访问Redux存储库值,而无需控制操作创建者

时间:2017-11-07 17:13:44

标签: javascript redux react-router-redux

我处于一种不寻常的情况: 在页面加载时,假设我的Redux商店获得了基本值的保湿:

{ foo: true }

在reducer中,我使用react-router-redux(或任何其他自行调度操作的库,只提供对操作类型的访问权限)来更新LOCATION_CHANGE类型操作的状态:

...
case LOCATION_CHANGE: {
  const deserialized = deserialize(action.payload.query, **foo**);
  return { ...state, deserialized };
}
...

我的deserialize函数需要foo的值来相应地更新我的状态。通常,我会将getState().foo添加到我的操作有效负载中,但由于这是第三方库,因此我无法控制操作负载。是否有一个简单的解决方法来解决这个问题,不要求我撕掉第三方库?

2 个答案:

答案 0 :(得分:1)

是的,使用Redux中间件来转换操作。

您可能需要查看some of the existing middleware for intercepting and modifying dispatched actions

答案 1 :(得分:1)

我接受了markerikson的answer,但这是我最后写的中间件:

const locationChangeMiddleware = store => next => action => {
  if (action.type === LOCATION_CHANGE) {
    const { foo } = store.getState();
    return next({
      ...action,
      payload: {
        ...action.payload,
        foo,
      },
    });
  }

  return next(action);
};

现在我的减速机看起来像:

...
case LOCATION_CHANGE: {
  const deserialized = deserialize(action.payload.query, action.payload.foo);
  return { ...state, deserialized };
}
...