【问题标题】:updating a single object key value inside array of objects react redux state更新对象数组中的单个对象键值反应 redux 状态
【发布时间】:2019-04-27 15:18:24
【问题描述】:

我正在尝试使用 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;
        }

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

【问题讨论】:

    标签: javascript reactjs redux react-redux redux-thunk


    【解决方案1】:

    您似乎正在改变对象。有一种简单的模式可以遍历列表并仅处理相关项,同时创建没有突变的新对象。

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

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

    请记住,ObjectsArrays 是可变的,因此我们可以使用 spread syntax (...) 或 .slice 等。

    【讨论】:

    • 谢谢让我试一试,你能告诉我为什么我们不能使用 .slice() 因为在一些堆栈流答案中我看到有人使用 slice 方法。
    • 因为它是变异的。你想避免在 redux 中直接突变。
    • 可以使用.slice 我什至在我的回答中说过,问题是它会返回一个新数组但不会创建深层副本(对象里面是一样的),你确实改变了它们。我使用.map 在更改其值的同时返回一个新数组,并且我对数组和对象都使用了扩展语法(我也可以对数组使用.slice
    猜你喜欢
    • 1970-01-01
    • 2019-07-25
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 2017-08-08
    • 2021-12-26
    相关资源
    最近更新 更多