在不控制 action creator 的情况下从 reducer 访问 Redux 存储值

Accessing a Redux store value from a reducer without control over the action creator

我的处境不寻常: 在页面加载时,假设我的 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 添加到我的操作负载中,但由于这是第三方库,我无法控制操作负载。这个问题有没有不需要我删除第三方库的简单解决方法?

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

您可能想看看 some of the existing middleware for intercepting and modifying dispatched actions

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

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