我需要从两个或更多缩减器访问用户可编辑状态。有没有办法通过动作的有效负载访问由另一个减速器控制的状态而不将其传递给减速器?我想避免让每个操作都将用户设置发送到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
});
}
...
我不希望必须通过以下操作发送userSettings:
export function calculate(userSettings) {
return {
type: constants.REDUCER_1.CALCULATE,
userSettings: userSettings
};
}
答案 0 :(得分:5)
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);