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
添加回答
举报