javascript - React 对选中的复选框项目的价格进行汇总
问题描述
嗨,我正在做一个简单的购物车。每个购物车项目旁边都有一个复选框,选中后,将该项目添加到orderedItems 数组,然后应用程序打印出所有选中项目的总和。
我已将其设置为每个项目都是一个子组件,并在父组件中设置了一个与复选框的 onChange 属性挂钩的 handleChange 事件处理程序。问题是,我不知道如何将某个复选框的 Item 组件“传递”到父级中。
有关应用程序的现场演示,请查看 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;
解决方案
由于您没有将其作为一个组进行维护,因此您可以每次都使用状态来维护购物车项目。所以需要在handleChange中传递item数据和事件数据。
物品成分:
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;
在 App 组件中,您将能够处理数据。我已经以这种方式处理它(我添加了另一个状态变量来获得总成本,我不想每次进行更改时都运行循环,所以我保持状态)
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
推荐阅读
- scala - Scala 中单例类型的 GADT 类型细化
- javascript - 使用多个指针作为解决方案的averagePair问题
- javascript - 在柱形图上显示 Datalabels(总数和 dataLabel 名称)-ReactJs highcharts
- python - 我不想以二进制存储它,所以我没有将它设置为“wb”我该怎么办?
- javascript - 将数组变量从控制器传递到Angular中的html
- java - 如何在openapi驱动的spring boot应用程序中接受json、xml、x-www-form-urlencoded?
- vba - 无法将选定范围存储到变量中
- php - 我不断收到以下错误:除以零(php)
- javascript - 如何在 javascript 中向 d3.js 中的非连接对象添加力?
- angular - 如何使用输入装饰器单页从父组件到子组件获取特定 ID