问题
- 您正在严重改变
AppLogic 实用程序中的购物车项目状态。
- 您正在为手动输入呈现“不受控制”的输入。这意味着它最初使用一个值呈现,但是当您从外部更改“状态”时,该值表示它不会更新,因为它不受控制。
解决方案
AppLogic.js
修复您的减速器实用程序,使其不会改变购物车项目。更新它们时,您应该浅层复制整个购物车项目数组,然后浅层复制特定的购物车项目。
export const checkIfItemInCart = (item, array, sum) => {
const index = array.findIndex((object) => object.id === item.id);
if (index !== -1) {
const newArray = array.map((item, i) => i === index ? {
...item,
quantity: item.quantity + (sum === "add" ? 1 : -1)
} : item)
if (!newArray[index].quantity) {
return deleteItemLookup(item, newArray);
}
return newArray;
}
return array.concat(item);
};
export const customQuantityUpdate = (item, array, newQuantity) => {
const index = array.findIndex((object) => object.id === item.id);
const oldQuantity = array[index]?.quantity;
// This could be more DRY, but edited to work
if (newQuantity > oldQuantity) {
return { array: array.map((item, i) => i === index ? {
...item,
quantity: newQuantity
} : item), type: "add", newQuantity, oldQuantity };
} else if (newQuantity < oldQuantity) {
return { array: array.map((item, i) => i === index ? {
...item,
quantity: newQuantity
} : item), type: "subtract", newQuantity, oldQuantity };
} else {
return { array, type: "", newQuantity, oldQuantity };
}
};
CartItem.js
使用value 属性和onChange 属性将输入转换为完全受控的输入。
<Quantity
type="number"
min="1"
value={quantity}
ref={itemRef}
onChange={handleChange}
/>
演示