#javascript #reactjs
Вопрос:
Привет, я делаю простую корзину для покупок. Рядом с каждым товаром в корзине установлен флажок, который при установке флажка добавляет этот товар в массив orderedItems, а затем приложение выводит сумму всех отмеченных товаров.
Я настроил его так, чтобы каждый элемент был дочерним компонентом, а в родительском я настроил обработчик события handleChange, который привязан к свойству onChange флажка. Проблема в том, что я понятия не имею, как «передать» компонент элемента для определенного флажка в родительский элемент.
Чтобы ознакомиться с демонстрацией приложения в реальном времени, ознакомьтесь с этим https://codesandbox.io/s/checkbox-summation-p29pm?file=/src/Item.js:28-239
export default function App() {
const allItems = AllItems;
const [orderedItems, setOrderedItems] = useState([]);
const handleChange = (event) => {
console.log(event);
if (event.target.checked) {
console.log("checked", event.target.name);
// add item to orderedItems array
} else {
// remove item from orderedItems array
}
};
return (
<div className="App">
{allItems.map((item) => (
<Item item={item} key={item.name} handleChange={handleChange} />
))}
<div>
Total ={" "}
{orderedItems.length === 0
? "0"
: orderedItems.reduce((acc, item) => {
return acc Number(item.price);
}, 0)}
</div>
</div>
);
}
КОМПОНЕНТ ЭЛЕМЕНТА:
const Item = ({ item, handleChange }) => {
return (
<div>
<input type="checkbox" name={item.name} onChange={handleChange} />
{item.name} ${item.price}
</div>
);
};
export default Item;
Ответ №1:
Поскольку вы не поддерживаете его как группу, вы можете использовать состояние для поддержания товара в корзине каждый раз. Итак, вам нужно передать данные товара и данные события в handleChange.
Компонент товара:
const Item = ({ item, handleChange }) => {
return (
<div>
<input type="checkbox" name={item.name} onChange={event => handleChange(item, event)} />
{item.name} ${item.price}
</div>
);
};
export default Item;
и в компоненте приложения вы сможете обрабатывать данные. Я обработал это таким образом (я добавил еще одну переменную состояния для получения общей стоимости, я не хочу запускать цикл каждый раз, когда я вношу изменения, поэтому я поддерживал состояние)
const handleChange = (item, event) => {
if (event.target.checked) {
setOrderedItems((cartItem) => [...cartItem, item]);
setTotalCost((total) => total parseInt(item.price));
// add item to orderedItems array
} else {
// remove item from orderedItems array
setOrderedItems((cartItem) =>
cartItem.filter((i) => i.name !== item.name)
);
setTotalCost((total) => total - parseInt(item.price));
}
Здесь вы можете получить исполняемый код
https://codesandbox.io/s/checkbox-summation-forked-0wnp9?file=/src/App.js:296-750