我刚开始学习react,遇到了这个问题,我有两个按钮(菜单项中的添加按钮和购物车中的添加按钮),每个按钮都在不同的组件中定义。我通过菜单项中的添加按钮的属性定义了功能和添加逻辑,当用户单击时,添加按钮会更新数量、cartCount并将项目详细信息和数量添加到购物车中。现在,当我单击购物车中的添加按钮时,我想要一个类似的功能,如它应该更新购物车数量,菜单项和购物车数量计数。我知道应该有一些方法,而不是重复整个逻辑了。我知道这是一个很长的一个。谢谢提前回答!!!
App.js
import react, { useState, useEffect } from "react";
import Header from "./components/Header";
import LandingPage from "./components/LandingPage";
import MenuItems from "./components/menuItems";
import Cart from "./components/Cart";
import ItemContext from "./store/item-context";
function App() {
const [items, setItems] = useState([]);
const [total, setTotal] = useState(0);
useEffect(() => {
setTotal(() => {
return items.reduce((acc, eachItem) => {
return eachItem.quantity + acc;
}, 0)
})
}, [items])
const [cartBool, setCartBool] = useState(false);
function AddedItem(item) {
const foundIndex = items.findIndex(eachItem => {
return eachItem.title === item.title;
})
if (foundIndex !== -1) {
setItems(prev => {
prev[foundIndex].quantity = item.quantity;
return [...prev];
})
}
else {
setItems(prev => {
return [...prev, item]
})
}
}
function handleCartClick() {
setCartBool(true);
}
function handleCloseClick() {
setCartBool(false);
}
return (
<react.Fragment>
<ItemContext.Provider value={{
items: items
}}>
{cartBool &&
<Cart onCloseClick={handleCloseClick} />}
<div className="parent-container">
<Header cartCount={total} onCartClick={handleCartClick} />
<LandingPage />
<MenuItems onAddItem={AddedItem} />
</div>
</ItemContext.Provider>
</react.Fragment>
);
}
export default App;
Menu-items.js
import react from "react";
import MenuItem from "./menuItem";
import MenuContent from "./menuContent";
function MenuItems(props) {
function handleItems(item){
props.onAddItem(item);
}
return (
<div className="menu">
{MenuContent.map(eachItem =>{
return <MenuItem title={eachItem.title} description={eachItem.description} price={eachItem.price} key={eachItem.key} onAdd={handleItems}/>
})}
</div>
);
}
export default MenuItems;
Menu-item.js
import react , { useState } from "react";
function MenuItem(props) {
const [item, setItem] = useState({
title: "",
quantity: 0,
price: ""
});
function handleClick(){
setItem(prev =>{
return {
title: props.title,
quantity: prev.quantity + 1,
price: props.price
}
})
}
function handleSubmit(event){
event.preventDefault();
props.onAdd(item);
}
return (
<div className="menu-item">
<div className="menu-content">
<h3>{props.title}</h3>
<p>{props.description}</p>
<h4>{props.price}</h4>
</div>
<form onSubmit={handleSubmit} className="add-items">
<label htmlFor="Amount">Amount</label>
<input onChange={() => {}} type="number" name="Amount" value={item.quantity}/>
<button onClick={handleClick} type="submit" className="btn btn-lg">Add</button>
</form>
</div>
);
}
export default MenuItem;`
现在,我希望在单击Cart组件内CartItem组件中的AddButton时创建menuItem组件中定义的此项。
1条答案
按热度按时间7cwmlq891#
请参见以下示例,其中包含我所做更改的注解和说明。
听起来好像您希望购物车在
MenuItem
中单击Add
时更新。修复
onClick
和onSubmit
的使用这是您的问题的一部分。在
MenuItem
中,您使用了一个表单,并且表单提交按钮上有onClick
。由于您的按钮有type="submit"
,它将激发提交事件沿着onSubmit
处理程序。我们可以在此处简单地使用onSubmit
作为处理程序,并从按钮中删除onClick
。我简化了
MenuItem
来更新和读取状态中的数量值,然后在添加项目时,我们只需传递项目(因为它已经有了最新的数量)。你的逻辑基本上是存在的。我给每个产品一个
id
,以简化跟踪所有的支柱钻井与使用title
或key
,因为它只是有点容易让我把我的头周围。希望变化和评论是有意义的。示例/演示(点击查看)
https://codesandbox.io/s/update-cart-example-veic1h