如何在两个或多个减速器之间共享只读状态

How do I share readonly state between two or more reducers

我需要从两个或多个减速器访问用户可编辑状态。有没有一种方法可以访问由另一个 reducer 控制的状态,而无需通过操作的有效负载将其 传递给 reducer?我想避免让每个操作都将用户设置发送到 reducer。

{
  userSettings: {
    someSetting: 5
  },
  reducer1State: {
    someValue: 10 // computed with userSettings.someSetting
  },
  reducer2State: {
    someOtherValue: 20 // computed with userSettings.someSetting
  }
} 

我想从 reducer1 获得 userSettings.someSetting 使用类似下面的内容:

function update(state={}, action) {
  if (action.type === constants.REDUCER_1.CALCULATE) {
    return _.assign({}, state, {
      someValue: 2 * GETSTATE().userSettings.someSetting
    });
  }
...

我不想必须从这样的操作中发送用户设置:

export function calculate(userSettings) {
  return {
    type: constants.REDUCER_1.CALCULATE,
    userSettings: userSettings
  };
}

Redux 的黄金法则之一是,如果可以从其他状态计算数据,则应尽量避免将数据放入状态,因为这会增加获取不同步数据的可能性,例如臭名昭著的未读消息计数器会告诉您有未读消息,而实际上您没有。

您可以使用 Reselect 创建您在 connectStateToProps 函数中使用的记忆选择器,而不是在您的 reducer 中使用该逻辑,以获取您的派生数据,例如类似这样的事情:

const getSomeSettings = state => state.userSettings.someSetting;
const getMultiplier = state => state.reducer1.multiplier;

const getSomeValue = createSelector([getSomeSettings, getMultiplier],
    (someSetting, multiplier) => {

});

const mapStateToProps(state) => {
    return {
        someValue: getSomeValue(state)
    }
}

const MyConnectedComponent = connect(mapStateToProps)(MyComponent);