在不控制 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 };
}
...
我的处境不寻常: 在页面加载时,假设我的 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 };
}
...