Redux 重复使用复杂对象不';t触发器更新
大家好,我正在尝试更新具有4个嵌套级别的redux对象。我使用Object.Assign()和redux开发工具显示了一个差异。但由于某些原因,订阅它的组件没有将其标记为已更改。我想我的免疫兼容性做得不对,但我检查了多次,看不出我做错了什么 我的redux减速机:Redux 重复使用复杂对象不';t触发器更新,redux,react-redux,Redux,React Redux,大家好,我正在尝试更新具有4个嵌套级别的redux对象。我使用Object.Assign()和redux开发工具显示了一个差异。但由于某些原因,订阅它的组件没有将其标记为已更改。我想我的免疫兼容性做得不对,但我检查了多次,看不出我做错了什么 我的redux减速机: import { FETCH_SETTINGS, FETCH_SETTINGS_SUCCESS, FETCH_SETTINGS_FAILURE, UPDATE_USER_SETTINGS, UP
import {
FETCH_SETTINGS,
FETCH_SETTINGS_SUCCESS,
FETCH_SETTINGS_FAILURE,
UPDATE_USER_SETTINGS,
UPDATE_USER_SETTINGS_FAILURE,
UPDATE_USER_SETTINGS_SUCCESS
} from './actions';
const initialState = {
settingsError: '',
settingsLoading: false,
settings: [],
updateUSerSettingsLoading: false
};
const settingsReducer = (state = initialState, action) => {
switch (action.type) {
case UPDATE_USER_SETTINGS_SUCCESS: {
const newUserSettings = action.payload.settings.settings;
let currentState = Object.assign({}, state);
console.log('equals?', state === currentState);
const newSettingsArray = currentState.settings.settings.userSettings.map(
setting => {
if (setting.key === 'Language') {
// update the current setting with a particular key to the newSetting value
for (let newSetting of newUserSettings) {
if (newSetting.key === 'Language') {
const setSetting = Object.assign(
{},
{ key: newSetting.key, value: newSetting.value }
);
return setSetting;
break;
}
return newSetting;
}
return setting;
}
return setting;
}
);
currentState.settings.settings.userSettings = newSettingsArray;
return {
...state,
settings: currentState.settings
};
}
default: {
return state;
}
}
};
export default settingsReducer;
非常感谢您的帮助。干杯 我找到了一个不错的解决方案,避免了重写整个设置部分。我们必须确保每个对象都是不可变的,否则redux不会显示更改。因此,在我的情况下,这是可行的:
return {
...state,
settings: {
...state.settings,
settings: {
...state.settings.settings,
userSettings: newSettingsArray
}
}
};
但在未来,我会尽量保持我的减速器平坦 我对这一点的最初反应是——您需要稍微平展一下这个数据结构。这太复杂了,我明白你的意思了,但这必须是可行的。