Javascript 在Redux状态下分派未更改的对象

Javascript 在Redux状态下分派未更改的对象,javascript,reactjs,redux,redux-saga,redux-thunk,Javascript,Reactjs,Redux,Redux Saga,Redux Thunk,因此,我正在构建一个电子商务应用程序,我在redux状态中存储了两个值来处理购物车。一个是对象数组,每个对象包含两个objectID和quantity键。另一个是包含产品信息的对象,其objectID作为键。这是我的行动代码 addToCart:(产品)=>{ 返回(调度,获取状态)=>{ const{productQuantity,storeSelected,products,storeKeys}=getState()。电子商务; const UPC=product.UPC; 设newQua

因此,我正在构建一个电子商务应用程序,我在redux状态中存储了两个值来处理购物车。一个是对象数组,每个对象包含两个objectID和quantity键。另一个是包含产品信息的对象,其objectID作为键。这是我的行动代码

addToCart:(产品)=>{
返回(调度,获取状态)=>{
const{productQuantity,storeSelected,products,storeKeys}=getState()。电子商务;
const UPC=product.UPC;
设newQuant=1;
让新产品;
对于(产品数量中的var p){
if(产品数量[p].UPC==UPC){
新产品=新产品
newQuant+=productQuantity[p]。数量;
productQuantity[p]=({UPC,数量:newQuant});
}
}
如果(!新产品){
console.log(“未找到”)
productQuantity.push({UPC,数量:1});
新产品={
…产品,
[UPC]:{
…产品,
价格:product.stores[storeKeys[storeSelected]]。价格,
fromStore:storeKeys[storeSelected],
}
}
}
派遣({
类型:actions.CHANGE\u CART,
产品:新产品,
产品数量
});
};

},
第一个问题是,在分派操作之前,您正在更改现有状态,并且:

const{productQuantity,storeSelected,products,storeKeys}=getState();
const UPC=product.UPC;
设newQuant=1;
让新产品;
对于(产品数量中的var p){
if(产品数量[p].UPC==UPC){
新产品=新产品
newQuant+=productQuantity[p]。数量;
productQuantity[p]=({UPC,数量:newQuant});
}
}
此处对
productQuantity
的任何更改都会改变Redux存储中的现有数据。不要那样做

我不太清楚
产品在这里发生了什么,因为逻辑有点混乱

我的建议是:

首先,开始使用。它有一个
configureStore()
函数,可以自动设置意外突变的检测,如果发生突变,将抛出错误

第二,不要在动作创建方面这样做


第三,使用Redux Toolkit,它使用Immer库允许您在还原程序中编写“变异”逻辑,并安全地将其转换为正确的、不可变的更新结果。

多亏了markerikson的回应,我修改了我的操作,以不可变地处理Redux状态,问题得到了解决。这是我的最新行动供参考

addToCart: (product) => {
        return (dispatch, getState) => {
            const {productQuantity, storeSelected, products, storeKeys} = getState().Ecommerce;
            const UPC = product.UPC;

            let newQuantity = 1;
            for(var p in productQuantity) {
                if (productQuantity[p].UPC === UPC) {
                    newQuantity += productQuantity[p].quantity;
                }
            }

            dispatch({
                type: actions.CHANGE_CART,
                products: {
                    ...products,
                    [UPC]: {
                        ...product,
                        price: product.stores[storeKeys[storeSelected]].price,
                        fromStore: storeKeys[storeSelected],
                    }
                },
                productQuantity: productQuantity
                    .filter((value, index) => value.UPC !== product.UPC)
                    .concat([{UPC, quantity: newQuantity}])
            });
        };
    },

听从你的建议,我会向你汇报的。非常感谢您的帮助。永久性地处理Redux状态修复了该问题。非常感谢。很酷,很高兴听到。根据我的回答,我的下一个建议是,如果可能的话,将更多的逻辑移到减速机端。我也这样做了。再次感谢你所做的一切。