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