1 回答

TA貢獻1744條經驗 獲得超4個贊
您正在應用于key={index}
渲染中的多個元素(<div>
和<ul>
each <Button />
),但它只需要在數組中呈現的頂級元素上進行,在您的情況下是<div className="products">
.
順便說一句,數組索引通常不是鍵的好候選 - 它應該對正在呈現的每個項目都是唯一的。在您的示例中,我認為producNumber
這是最好的選擇,因為我假設它是每個產品的唯一標識符。
key={index}
從你擁有的所有東西中刪除添加
key={producNumber}
到內部<div className="products">
這是一個很好的資源來了解更多關于 React 的key
prop。
每個產品的數量相同的原因是您的州只有一個數字:
React.useState(0);
您正在嘗試跟蹤每個產品的數量,因此您需要每個產品的數量。您可以做到這一點的一種方法是使用一個對象 ( {}
),該對象 ( ) 具有您的屬性producNum
和數量的屬性作為它們的值。例如:
const products = [
{ name: "thing", num: 152 },
{ name: "other-thing", num: 254 },
];
const initialQuantities = products.reduce(
(quantities, product) => ({ ...quantities, [product.num]: 0 }),
{}
);
console.log(initialQuantities);
這將使用初始數量為 0 的每個產品創建對象。
然后當您增加或減少數量時,您會將您單擊的產品的產品編號傳遞給函數,然后您可以設置該產品的新數量,而使用Spread語法(. ..):
const initialQuantities = products.reduce(
(quantities, product) => ({ ...quantities, [product.producNumber]: 0 }),
{}
);
const [quantities, setQuantities] = React.useState(initialQuantities);
const increase = (productNum) => {
setQuantities({
...quantities,
[productNum]: quantities[productNum] + 1,
});
};
const decrease = (productNum) => {
setQuantities({
...quantities,
[productNum]: Math.max(0, quantities[productNum] - 1),
});
};
然后你onClick會變成:
onClick={() => increase(producNumber)}
和
onClick={() => decrease(producNumber)}
在這里可以看到一個簡單的實現:https ://codesandbox.io/s/icy-dust-nbetq?file=/src/App.js:175-655
添加回答
舉報