如何在两个或多个减速器之间共享只读状态
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);
我需要从两个或多个减速器访问用户可编辑状态。有没有一种方法可以访问由另一个 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);