Javascript 更新对象数组中的单个对象键值会对redux状态作出反应

Javascript 更新对象数组中的单个对象键值会对redux状态作出反应,javascript,reactjs,redux,react-redux,redux-thunk,Javascript,Reactjs,Redux,React Redux,Redux Thunk,我正在尝试使用react-redux更新数组中的对象及其键值,但由于我是react-redux新手,因此我没有找到一个好方法来完成此操作,而且值也没有更新到 这是我的行动 export const addIngredientToMenuItemCartA = (menu_item_id,timestamp,ingrediant,ingrediant_type,selectedMenuItemIngrediantType) => async dispatch => { dis

我正在尝试使用react-redux更新数组中的对象及其键值,但由于我是react-redux新手,因此我没有找到一个好方法来完成此操作,而且值也没有更新到

这是我的行动

export const addIngredientToMenuItemCartA = (menu_item_id,timestamp,ingrediant,ingrediant_type,selectedMenuItemIngrediantType)
=> async dispatch => {

    dispatch({
        type: ADD_INGREDIENT_TO_MENU_ITEM_CART,
        payload: {
            menu_item_id,
            timestamp,
            ingrediant,
            ingrediant_type,
            ingrediant_category_type_blue: selectedMenuItemIngrediantType
        }
    }); 
};
这是我的减速机

export default function(state=[],action){
    case ADD_INGREDIENT_TO_MENU_ITEM_CART:
                let menu_item_id = action.payload.menu_item_id;
                let ingrediant = action.payload.ingrediant;
                let timestamp = action.payload.timestamp;
                let items1 = state.slice();
                const itemIndexi1 = items1.findIndex(item => item.menu_item_id === menu_item_id);
                if(true){
                    items1[itemIndexi1].ingrediantTotal = ingrediant.price;
                }
                items1[itemIndexi1].ingrediants.push(ingrediant);
                return items1;
            default:
                return state;
        }

我有一个购物车数组,里面有对象,我想找到特定的对象,然后更新它们,但是如果我在reducer中更新它们,那么存储中的值就不会改变。

看起来你在改变对象。有一种简单的模式可以在列表上循环并仅处理相关项,同时创建没有变化的新对象

在您的情况下,您的代码可能如下所示:

case ADD_INGREDIENT_TO_MENU_ITEM_CART: {
    const { menu_item_id, ingrediant } = action.payload;

    const nextState = state.map(item => {
        if (item.menu_item_id !== menu_item_id) {
            // not our item, return it as is
            return item;
        }

        // this is our relevant item, return a new copy of it with modified fields
        return {
            ...item,
            ingrediantTotal: ingrediant.price,
            ingrediants: [
                ...item.ingrediants,
                ingrediant
            ]
        }
    });

    return nextState;
}

请记住,
对象
数组
是可变的,因此我们可以使用(
..
)或
.slice
等。

谢谢让我试试。你能告诉我为什么不能使用.slice()吗?因为在一些叠加流中,我看到有人使用slice方法。因为它是变异的。您希望避免redux中的直接变异。您可以使用
.slice
我甚至在回答中提到了这一点,问题是它将返回一个新数组,但不会创建深度副本(其中的对象是相同的),而您确实对它们进行了变异。我使用
.map
在更改其值时返回一个新数组,并对数组和对象使用扩展语法(我也可以对数组使用
.slice