Redux 重复使用复杂对象不';t触发器更新

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

大家好,我正在尝试更新具有4个嵌套级别的redux对象。我使用Object.Assign()和redux开发工具显示了一个差异。但由于某些原因,订阅它的组件没有将其标记为已更改。我想我的免疫兼容性做得不对,但我检查了多次,看不出我做错了什么

我的redux减速机:

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

但在未来,我会尽量保持我的减速器平坦

我对这一点的最初反应是——您需要稍微平展一下这个数据结构。这太复杂了,我明白你的意思了,但这必须是可行的。