Redux-persist 不是持久化数量,而是持久化购物车总数?
Redux-persist not persisting quantity, but still persisting cart total?
我正在尝试保留购物车的状态(商品、每个所述商品的数量、小计和总计)。为此,我正在使用 redux-persist
。
我的问题是,当我更改购物车中的商品数量(例如,从 1 到 5),然后刷新页面时,数量会变回 1。小计和总计仍然反映所述商品的价格 x 5。刷新后数量无法更改,如果我一直尝试增加数量,购物车小计和总数仍然增加。
数量在 Chrome DevTools 中也没有变化(在“应用程序”、“存储”>“本地存储”选项卡下),所以我认为这不是显示问题。
我在 configureStore.js
文件中尝试了 whitelisting
/blacklisting
某些状态。我不认为 redux-persist
包有问题——我认为这是我实施它的方式或我的商店设置方式的问题。
如何让我的购物车中的商品、每件商品的数量和 subtotal/total 保持不变?更重要的是,我关心商品的数量和购物车小计和总计是否保持同步。
我已将我的代码上传到 codesandbox,因此您可以看到所有内容以及它们如何交互。
问题不在于 redux-persist
,而是您的 ADD_QUANTITY
reducer 中存在错误。
目前看起来是这样的:
if (action.type === ADD_QUANTITY) {
let addedItem = state.items.find(item => item.id === action.id);
addedItem.quantity += 1;
let newSubTotal = state.subTotal + addedItem.price;
return {
...state,
subTotal: newSubTotal,
cartTotal: newSubTotal + shippingCost
}
}
所以此操作从所有可用项目的列表中找到该项目,然后增加其数量(通过改变原始对象,这不是最佳做法,但不是这里的问题)并计算新的小计。然后它对更新的项目不做任何事情。
因为您已经将您的项目添加到您所在州的 addedItems
数组中,您需要在那里找到它并更新它的 that 版本的副本,然后 return 这个更新的列表作为你的新 addedItems
数组:
if (action.type === ADD_QUANTITY) {
const addedItem = state.addedItems.find(item => item.id === action.id);
let newSubTotal = state.subTotal + addedItem.price;
const updatedItems = state.addedItems.map(item =>
item.id === action.id ? { ...item, quantity: item.quantity + 1 } : item
);
return {
...state,
addedItems: updatedItems,
subTotal: newSubTotal,
cartTotal: newSubTotal + shippingCost
};
}
我正在尝试保留购物车的状态(商品、每个所述商品的数量、小计和总计)。为此,我正在使用 redux-persist
。
我的问题是,当我更改购物车中的商品数量(例如,从 1 到 5),然后刷新页面时,数量会变回 1。小计和总计仍然反映所述商品的价格 x 5。刷新后数量无法更改,如果我一直尝试增加数量,购物车小计和总数仍然增加。
数量在 Chrome DevTools 中也没有变化(在“应用程序”、“存储”>“本地存储”选项卡下),所以我认为这不是显示问题。
我在 configureStore.js
文件中尝试了 whitelisting
/blacklisting
某些状态。我不认为 redux-persist
包有问题——我认为这是我实施它的方式或我的商店设置方式的问题。
如何让我的购物车中的商品、每件商品的数量和 subtotal/total 保持不变?更重要的是,我关心商品的数量和购物车小计和总计是否保持同步。
我已将我的代码上传到 codesandbox,因此您可以看到所有内容以及它们如何交互。
问题不在于 redux-persist
,而是您的 ADD_QUANTITY
reducer 中存在错误。
目前看起来是这样的:
if (action.type === ADD_QUANTITY) {
let addedItem = state.items.find(item => item.id === action.id);
addedItem.quantity += 1;
let newSubTotal = state.subTotal + addedItem.price;
return {
...state,
subTotal: newSubTotal,
cartTotal: newSubTotal + shippingCost
}
}
所以此操作从所有可用项目的列表中找到该项目,然后增加其数量(通过改变原始对象,这不是最佳做法,但不是这里的问题)并计算新的小计。然后它对更新的项目不做任何事情。
因为您已经将您的项目添加到您所在州的 addedItems
数组中,您需要在那里找到它并更新它的 that 版本的副本,然后 return 这个更新的列表作为你的新 addedItems
数组:
if (action.type === ADD_QUANTITY) {
const addedItem = state.addedItems.find(item => item.id === action.id);
let newSubTotal = state.subTotal + addedItem.price;
const updatedItems = state.addedItems.map(item =>
item.id === action.id ? { ...item, quantity: item.quantity + 1 } : item
);
return {
...state,
addedItems: updatedItems,
subTotal: newSubTotal,
cartTotal: newSubTotal + shippingCost
};
}