Вы применяете key={index}
к нескольким элементам в вашем рендере (<div>
, <ul>
и каждый <Button />
), но ему нужно только go на элементе верхнего уровня, который визуализируется в массиве. который в вашем случае является <div className="products">
.
В стороне, индекс массива обычно не является хорошим кандидатом на ключ - он должен быть уникальным для каждого элемента, который отображается . В вашем примере я думаю, что producNumber
будет лучшим выбором, поскольку я предполагаю, что это некий уникальный идентификатор для каждого продукта.
- удалите
key={index}
из всего, что у вас есть - добавьте
key={producNumber}
к внутреннему <div className="products">
Этот является хорошим ресурсом, чтобы узнать больше о React's 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.
Когда вы затем увеличиваете или уменьшаете количество, вы передаете номер продукта продукта, который вы нажали на функцию, а затем вы можете установить новое количество только этого продукта, оставив другие количества продукта нетронутыми, используя Синтаксис распространения (...) :
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