如何替换部分 Redux 状态

How to replace part of the Redux state

我有一个 packageReducer,它保存了 packageType 和 packageList 的相关细节。从服务器获取详细信息后,我需要用获取的新值替换初始状态值。例如,如果提取了 packageLists,我只需要替换 "packageList"

下面是我的 PackageState reducer,

const initialState = {
    packageList: packageListInitialState,
    packageTypes: [{title: 'Select Package Type', value: ''}],
};

export default function packageState( state = initialState, action ) {
    switch ( action.type ) {
        case FETCH_PACKAGE_LIST_SUCCESS:{
            return Object.assign( {}, state,  action.payload );
        }

        case FETCH_PACKAGE_TYPES_SUCCESS:{
           return Object.assign( {}, state,  action.payload );
        }

        default:
            return state;
    }
}

我认为我实现的方式正在替换整个状态,有人可以告诉我如何实现它吗?

谢谢你。

假设您要实现的操作只是 FETCH_PACKAGE_LIST_SUCCESS 操作,有效负载是 updated/fetched 列表,那么您只需要 return 如下图所示的对象。

由于您正在尝试 return 一个仅更改了两个属性之一的对象,因此您可以使用先前状态的值作为未更改的 属性 并更新另一个。

const initialState = {
    packageList: packageListInitialState,
    packageTypes: [{title: 'Select Package Type', value: ''}],
};

export default function packageState( state = initialState, action ) {
    switch ( action.type ) {
        case FETCH_PACKAGE_LIST_SUCCESS:{
            return { packageList: action.payload, packageTypes: state.packageTypes }
        }

        case FETCH_PACKAGE_SETTINGS_SUCCESS:{
           return Object.assign( {}, state,  action.payload );
        }

        default:
            return state;
    }
}

你不是:

var state = {a: 1, b: 2, c: 3}
var newData = {a: 4, b: 5}
console.log(Object.assign( {}, state,  newData )) // { a: 4, b: 5, c: 3 }

Properties in the target object will be overwritten by properties in the sources if they have the same key. Later sources' properties will similarly overwrite earlier ones. (docs)

因此,只要您的负载包含您真正想要更新的密钥,您就是安全的。如果您使用 ES6 的 spread syntax(我假设您的有效载荷看起来像 {packageList: data}),您也可以以更简单的方式进行操作:

const initialState = {
    packageList: packageListInitialState,
    packageTypes: [{title: 'Select Package Type', value: ''}],
};

export default function packageState( state = initialState, action ) {
    switch ( action.type ) {
        case FETCH_PACKAGE_LIST_SUCCESS:{
            return {...state, ...action.payload};
        }

        case FETCH_PACKAGE_SETTINGS_SUCCESS:{
           return {...state,  ...action.payload};
        }

        default:
            return state;
    }
}