Javascript 在Redux状态下分派未更改的对象
因此,我正在构建一个电子商务应用程序,我在redux状态中存储了两个值来处理购物车。一个是对象数组,每个对象包含两个objectID和quantity键。另一个是包含产品信息的对象,其objectID作为键。这是我的行动代码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
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状态修复了该问题。非常感谢。很酷,很高兴听到。根据我的回答,我的下一个建议是,如果可能的话,将更多的逻辑移到减速机端。我也这样做了。再次感谢你所做的一切。