[英]How to pass data out of map function to sibling component in React?
我有一个购物车,它使用map
根据数组对象呈现多张卡片。 每张卡片包含商品价格、点击按钮可增加的商品数量、商品总价=价格*数量。 底部有一个信息栏,我想在用户单击添加按钮时显示所有卡片的总价。 这是一个工作示例: https : //codesandbox.io/s/brave-hamilton-4o1l1 ?
这是代码:
主页.js:
import React, {useState} from 'react'; import Card from './Card'; import Infobar from './Infobar'; const Home = () => { const dummyData = [ { id: 1, title: 'hat', price: 10 }, { id: 2, title: 'tshirt', price: 11 } ] const [quantity, setQuantity] = useState([]); const changeItemQuantity = (id, itemQty) => { let _newState = [...quantity]; let _itemInfo = _newState.find(item => item.id === id); if (_itemInfo !== undefined) { _itemInfo.itemQty += 1; } else { _newState.push({ id: id, itemQty: itemQty + 1 }); }; setQuantity(_newState); } const RenderCards = () => { let _totalPrice = 0; return ( dummyData.map( (d) => { const stateItem = quantity.find(item => item.id === d.id); const itemQty = stateItem ? stateItem.itemQty : 0; _totalPrice += d.price * itemQty; console.log(_totalPrice); // correct value to send to Infobar return ( <Card key={d.id} id={d.id} title={d.title} price={d.price} quantity={itemQty} changeItemQuantity={changeItemQuantity} itemTotalPrice={d.price * itemQty} /> ) } ) ) } return ( <> <RenderCards/> <Infobar totalPrice={0}/> // here Infobar should take total price as an input </> ) } export default Home;
Card.js:
import React from 'react'; const Card = ({ id, title, price, quantity, changeItemQuantity, itemTotalPrice }) => { return ( <> <div key={id}> <p>{id}. {title}</p> <p>Quantity: {quantity}</p> <p>Price: {price}</p> <p>Item total price: {itemTotalPrice}</p> <button onClick={() => changeItemQuantity(id, 0)}>Add item</button> </div> </> ) } export default Card
信息栏.js:
import React from 'react'; const Infobar = ({ totalPrice }) => { return ( <div>Total Price: {totalPrice}</div> ) } export default Infobar;
现在的问题是,信息栏中所有项目的总价不会改变(我将 0 作为虚拟数据传递)。 我需要计算所有商品的总价并将其传递给Infobar
。 我已经计算了_totalPrice
中 _totalPrice 的正确值,如何将_totalPrice
传递给 Infobar?
为什么不添加一个新状态const [total, setTotal] = useState(0);
和你设置数量的方式一样吗? 您设置放置日志的总数并将总数传递给您的信息栏组件。
但是,尽管它有效,但我发现您放置代码的方式存在一些问题,为什么要在您的主组件中创建一个组件而不是让 Card 处理所有逻辑?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.