英文:
How can I sum up a value from a loop of child components in react?
问题
我有两个React组件,一个是Cart,另一个是CartItem,在Cart中,我使用.map循环CartItem。在CartItem中,我有一个名为total的行,它等于price * item.count。我要如何计算所有行的总和,而不管有多少个CartItem,然后返回总计,以便我可以得到购物车的总值。
我尝试添加一个handleTotal函数,但它只返回一个元素的行总和,而不是所有元素的总和。
以下是CartItem组件:
const CartItem = ({ item, handleTotal }) => {
  var [itemCount, setItemCount] = useState(1);
  var [lineTotal, setLineTotal] = useState(item.price);
  const incrementCount = () => {
    setItemCount(++itemCount);
  };
  const decrementCount = () => {
    setItemCount(--itemCount);
  };
  useEffect(() => {
    handleTotal(item.id, lineTotal);
  }, []);
  return (
    <div>
      <Product>
        <ProductDetail>
          <Image src={item.image} />
          <Details>
            <ProductName>
              <b>产品:</b> {item.name}
            </ProductName>
            <ProductId>
              <b>ID:</b> {item.id}
            </ProductId>
            <ProductColor color={item.color} />
            <ProductSize>
              <b>尺码:</b> {item.size}
            </ProductSize>
          </Details>
        </ProductDetail>
        <PriceDetail>
          <ProductAmountContainer>
            <Add onClick={() => { incrementCount(); setLineTotal(item.price * itemCount) }} />
            <ProductAmount>{itemCount}</ProductAmount>
            <Remove onClick={() => { decrementCount(); setLineTotal(item.price * itemCount) }} />
          </ProductAmountContainer>
          <ProductPrice>$ {item.price * itemCount}</ProductPrice>
        </PriceDetail>
      </Product>
    </div>
  );
};
export default CartItem;
这是Cart组件:
const Cart = () => {
  var [total, setTotal] = useState(0);
  const handleTotal = (id, price) => {
    setTotal(total + price);
  };
  return (
    <Container>
      <Navbar />
      <Announcement />
      <Wrapper>
        <Title>YOUR BAG</Title>
        <Top>
          <TopButton>CONTINUE SHOPPING</TopButton>
          <TopTexts>
            <TopText>购物袋(2)</TopText>
            <TopText>愿望清单(0)</TopText>
          </TopTexts>
          <TopButton type="filled">立即结账</TopButton>
        </Top>
        <Bottom>
          <Info>
            {IntheCart.map((item) => (
              <CartItem key={item.id} item={item} handleTotal={handleTotal} />
            ))}
            <Hr />
          </Info>
          <Summary>
            <SummaryTitle>订单摘要</SummaryTitle>
            <SummaryItem>
              <SummaryItemText>小计</SummaryItemText>
              <SummaryItemPrice>$ {total}</SummaryItemPrice>
            </SummaryItem>
            <SummaryItem>
              <SummaryItemText>预计运费</SummaryItemText>
              <SummaryItemPrice>$ 5.90</SummaryItemPrice>
            </SummaryItem>
            <SummaryItem>
              <SummaryItemText>运费折扣</SummaryItemText>
              <SummaryItemPrice>$ -5.90</SummaryItemPrice>
            </SummaryItem>
            <SummaryItem type="total">
              <SummaryItemText>总计</SummaryItemText>
              <SummaryItemPrice>$ {total + 5.90}</SummaryItemPrice>
            </SummaryItem>
            <Button>立即结账</Button>
          </Summary>
        </Bottom>
      </Wrapper>
      <Footer />
    </Container>
  );
};
export default Cart;
英文:
I have two react components one is Cart and the other is CartItem, Inside Cart I am looping using .map the CartItem. Inside CartItem I have a line total which is price * item.count. How can I sum up all the line totals regardless how many CartItems I have, and return the Total so that I can have the overall value of the cart.
I tried to add a handle total function but its only returning line total of one element not all of them.
Here is the CartItem:
const CartItem = ({item, handleTotal}) => {
var [itemCount, SetItemCount] = useState(1);
var [Linetotal, SetLineTotal] = useState(item.price);
const incrementcount = () => {
SetItemCount(++itemCount);
};
const decrementcount = () => {
SetItemCount(--itemCount);
};
useEffect(() => {
handleTotal(item.id,Linetotal)
},[])
return (
<div>
<Product>
<ProductDetail>
<Image src={item.image} />
<Details>
<ProductName>
<b>Product:</b> {item.name}
</ProductName>
<ProductId>
<b>ID:</b> {item.id}
</ProductId>
<ProductColor color={item.color} />
<ProductSize>
<b>Size:</b> {item.size}
</ProductSize>
</Details>
</ProductDetail>
<PriceDetail>
<ProductAmountContainer>
<Add onClick={() => {incrementcount(); SetLineTotal(item.price*itemCount)}} />
<ProductAmount>{itemCount}</ProductAmount>
<Remove onClick={() => {decrementcount(); SetLineTotal(item.price*itemCount)}} />
</ProductAmountContainer>
<ProductPrice>$ {item.price*itemCount}</ProductPrice>
</PriceDetail>
</Product>
</div>
);
};
export default CartItem;
and Here is the Cart:
const Cart = () => {
var [total, setTotal] = useState([]);
const handleTotal = (id,price) => {
setTotal(id,price);
};
return (
<Container>
<Navbar />
<Announcement />
<Wrapper>
<Title>YOUR BAG</Title>
<Top>
<TopButton>CONTINUE SHOPPING</TopButton>
<TopTexts>
<TopText>Shopping Bag(2)</TopText>
<TopText>Your Wishlist (0)</TopText>
</TopTexts>
<TopButton type="filled">CHECKOUT NOW</TopButton>
</Top>
<Bottom>
<Info>
{IntheCart.map((item) => (
<CartItem key={item.id} item={item} handleTotal={handleTotal} />
))}
<Hr />
</Info>
<Summary>
<SummaryTitle>ORDER SUMMARY</SummaryTitle>
<SummaryItem>
<SummaryItemText>Subtotal</SummaryItemText>
<SummaryItemPrice>$ 80</SummaryItemPrice>
</SummaryItem>
<SummaryItem>
<SummaryItemText>Estimated Shipping</SummaryItemText>
<SummaryItemPrice>$ 5.90</SummaryItemPrice>
</SummaryItem>
<SummaryItem>
<SummaryItemText>Shipping Discount</SummaryItemText>
<SummaryItemPrice>$ -5.90</SummaryItemPrice>
</SummaryItem>
<SummaryItem type="total">
<SummaryItemText>Total</SummaryItemText>
<SummaryItemPrice>$ 80</SummaryItemPrice>
</SummaryItem>
<Button>CHECKOUT NOW</Button>
</Summary>
</Bottom>
</Wrapper>
<Footer />
</Container>
);
};
export default Cart;
答案1
得分: 1
你可以在 Card 组件中创建 updateTotal 函数,然后在 CardItem 中的 increse 或 decrement 项目时更新 total 值。
const CartItem = ({item, handleTotal, updateTotal}) => {
// 代码...
const incrementcount = () => {
  SetItemCount(++itemCount);
  updateTotal(item.price);
};
const decrementcount = () => {
  SetItemCount(--itemCount);
  updateTotal(-item.price);
};
// 代码...
updateTotal 函数。
var [totalPrice, setTotalPrice] = useState(0);
const updateTotal = (value) => {
  setTotalPrice(prev => prev + value)
} 
将 updateTotal 函数添加到 CardItem。
<CartItem key={item.id} item={item} handleTotal={handleTotal} updateTotal={updateTotal} />
英文:
You can create updateTotal function in the Card component and once you increse or decrement item in the CardItem update the total value.
const CartItem = ({item, handleTotal, updateTotal}) => {
// code...
const incrementcount = () => {
SetItemCount(++itemCount);
updateTotal(item.price);
};
const decrementcount = () => {
SetItemCount(--itemCount);
updateTotal(-item.price);
};
// code...
updateTotal function.
var [totalPrice, setTotalPrice] = useState(0);
const updateTotal = (value) => {
setTotalPrice(prev => prev + value)
} 
Add the updateTotal function to CardItem
 <CartItem key={item.id} item={item} handleTotal={handleTotal} updateTotal={updateTotal} />
答案2
得分: 1
如果您需要将子总和添加到总和中,可以按照以下方式操作。
    const Cart = () => {
      ...
    
      var [subSum, setSubSum] = useState(null);
      var [totalSum, setTotalSum] = useState(0);
      
      const handleTotal = (id, price) => {
        setSubSum({ ...subSum, id: price });  
      };
      useEffect(() => {
        var sum = 0;
        for (const [key, value] of Object.entries(subSum)) {
           sum += value;
        }
        setTotalSum(sum);
      }, [totalSum])
    
      ...
    }
英文:
If you need sub sum to so sub total, you can do like this.
const Cart = () => {
...
var [subSum, setSubSum] = useState(null);
var [totalSum, setTotalSum] = useState(0);
const handleTotal = (id,price) => {
setSubSum({...subSum, id:price});  
};
useEffect(()=>{
var sum = 0;
for (const [key, value] of Object.entries(subSum)) {
sum += value;
}
setTotalSum(sum);
},[total])
...
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论