Redux 如何在执行reducer之前向所有操作添加一组参数?
我正在寻找一种方法,在输入(根)减速机时为每个操作添加一些参数 举个简单的例子,假设我有一个Redux 如何在执行reducer之前向所有操作添加一组参数?,redux,Redux,我正在寻找一种方法,在输入(根)减速机时为每个操作添加一些参数 举个简单的例子,假设我有一个userState,其中包含了当前登录的用户,甚至可能处于某个子状态 rootState | +-------------------------------------+ | | userState +----+-----+ |
userState
,其中包含了当前登录的用户,甚至可能处于某个子状态
rootState
|
+-------------------------------------+
| |
userState +----+-----+
| | |
+---+-----------+ ... salesState
| |
... currentlySignedInUserState
为了在另一个reducer(例如,salesReducer
)中执行操作,我需要当前登录的用户,该用户不可用(处于同级状态或更糟的状态),因此我必须在根状态下拦截该操作,从userState
读取currentlySignedInUserState
,将用户添加到操作负载,并使用更改的负载重新发出操作
case SALES_ACTIONS.ADD_SALE:
return Object.assign({}, state, {
let payload = Object.assign({}, action.payload, {
userName: state.user.signedIn.name
});
sales: salesReducer(state.sales, {
type: SALES_ACTION.ADD_SALE,
payload
});
});
这会在一瞬间变得混乱,并阻止我使用combinereducer
,因为我必须在我自己制作的根减缩器中转发每一个操作
所以我想出了一个主意,当用户进入根减速机时,将用户添加到每个操作中,然后一直添加到combinereducer
这是一种公认的方法吗?如果是的话,是否有一种方法可以扩展组合减速机
,这样它就需要额外的有效负载参数(我在想,但我不确定这是否会实现我的想法)
如果没有,我的替代方案是什么?您可以使用一个简单的方法,从状态中获取用户名
,并将其作为元
数据添加到所有操作中,除非未在中签名。您可以添加其他条件,例如应跳过的特定操作。
我更喜欢将附加数据添加为meta
,而不是有效负载。
我已经介绍了两种增强动作的方法
(未经测试的)代码:
const middleware = ({ getState }) => next => action => {
const state = getState();
if(!state.user.signedIn) { // if not signed in skip
return next(action);
}
const userName = state.user.signedIn.name;
/** add userName using assign **/
const meta = Object.assign({}, action.meta, { userName });
const newAction = Object.assign({}, action, { meta });
/**********************/
/** or add userName using object spread **/
const newAction = {
...action,
meta: { ...action.meta, username }
};
/**********************/
next(newAction);
};