【发布时间】:2020-09-17 21:19:33
【问题描述】:
我有一个购物车,它使用map 根据数组对象呈现多张卡片。每张卡片包含商品价格、可通过点击按钮增加的商品数量、商品总价=价格*数量。底部有一个信息栏,我想在用户单击添加按钮时显示所有卡片的总价格。这是一个工作示例:https://codesandbox.io/s/brave-hamilton-4o1l1?
代码如下:
Home.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。我已经计算出 RenderCards 中 _totalPrice 中的正确值,如何将 _totalPrice 传递给 Infobar?
【问题讨论】:
标签: javascript reactjs