我正在构建一个购物车应用程序,该应用程序将每个项目都包含为卡片组件。我通过映射一些虚拟对象数据来渲染这些卡:
const Home = () => {
const dummyData = [
{
id: 1,
title: 'tshirt',
price: 10
},
{
id: 2,
title: 'coat',
price: 20
}
]
const RenderCards = () => {
return (
dummyData.map(
(d) => {
return (
<Card key={d.id} title={d.title} price={d.price} handleAddToCart={handleAddToCart}/>
)
}
)
)
}
const handleAddToCart = () => {
// maybe access id and price here?
}
return (
<>
<RenderCards />
</>
)
}
和正在渲染的Card
组件:
const Card = ({id, title, price}) => {
return (
<>
<div key={id}>
<p>{title}</>
<p>{price}</>
<button onClick={handleAddToCart}>Add to cart</button>
</div>
</>
)
}
现在,单击每张卡中的按钮,我想将数据(卡的ID和商品价格)发送回父Home
组件。假设点击了第二张卡,我想访问id
中的price
和Home
。
编辑:
也许我没有说清楚,我想在handleAddToCart
函数中访问被点击的卡的价格和ID。
答案 0 :(得分:1)
您可以向下传递处理程序,让孩子将详细信息传递给它,如下所示:
items.map(item => <Item addToCart={addToCart} {...item} />)
const Item = ({ id, name, addToCart }) =>
<div>
{name}
<button onClick={() => addToCart(id)}>Add to Cart</button>
</div>
或者像这样传递包含值的回调:
items.map(item => <Item addToCart={() => handleAddToCart(item.id)} {...item} />)
const Item = ({ id, name, addToCart }) =>
<div>
{name}
<button onClick={addToCart}>Add to Cart</button>
</div>
答案 1 :(得分:0)
在<Home />
组件中,首先可以使用useState
引入一个新状态,如下:
const [selectedItem, setSelectedItem] = useState(null)
然后通过道具setSelectedItem
向下传递以便能够在那里触发:
<Card key={d.id} title={d.title} price={d.price} handleAddToCart={handleAddToCart}
setSelectedItem={setSelectedItem} />
然后在<Card />
组件中用作:
const Card = ({id, title, price, setSelectedItem}) => {
return (
<>
<div key={id}>
<p>{title}</>
<p>{price}</>
<button onClick={() => {
handleAddToCart();
setSelectedItem({ id, title, price});
}}>Add to cart</button>
</div>
</>
)
}
+1建议:
我会将一个属性中的详细信息传递给<Card />
组件:
<Card key={d.id}
data={d}
handleAddToCart={handleAddToCart}
setSelectedItem={setSelectedItem} />
然后将内部结构破坏为:
const Card = (props) => {
const { data, setSelectedItem, handleAddToCart } = props
const { id, title, price } = data
// more code
}