如何在 React 中更改个人购物车数量?
How to change individual cart quantity in React?
我正在构建一个基本的购物车示例,它有 2 个按钮,addtoCart 用于计算总金额和 Quantity 用于更新数量。但是当我点击它时,所有产品的数量都会立即更新。我该如何为特定产品做这件事?
import React,{useContext, useState, useReducer, useEffect} from 'react'
const Wishlist=()=>{
const product=[
{ name: "Apple", price: 10 },
{ name: "Banana", price: 20 },
{ name: "Cherry", price: 30 }
]
const [total,setTotal]=useState(0)
const [qty,setQty]=useState(1)
const handleClick = e => {
setTotal(prevState=>prevState+e)
};
const handleQty=e=>{
setQty(prevState=>prevState+1)
}
return(
<div>
{product.map((p)=>
<li key={p.name}>{p.name}{p.price}
<button onClick={()=>handleClick(p.price)}>Add to cart</button>
<button onClick={()=>handleQty(p)}>x{qty}</button>
</li>)
}
Price: {total}
</div>
)
}
export default Wishlist
有没有办法让多次点击“添加到购物车”按钮也更新单个数量并计算总金额?我好像想不通。
[编辑]
现在我也添加了一个单位 属性,所有数量仍然会立即更新。这是代码:
import React,{useContext, useState, useReducer, useEffect} from 'react'
const Wishlist=()=>{
const product=[
{ name: "Apple", price: 10,unit:1},
{ name: "Banana", price: 20,unit:1 },
{ name: "Cherry", price: 30,unit:1 }
]
const [total,setTotal]=useState(0)
const [qty,setQty]=useState(1)
const handleClick=e=>{
setTotal(prevState=>prevState+e.price),
setQty(e.unit+1)
console.log(e)
};
return(
<div>
{product.map((p)=>
<li key={p.name}>{p.name}{p.price}
<button onClick={()=>handleClick(p)}>Add to cart </button>
{qty}
</li>)
}
Price: {total}
</div>
)
}
export default Wishlist
您可以将产品及其数量存储在状态中,并在点击时相应地进行更新。
const [products, setProducts]= useState([
{ name: "Apple", price: 10, quantity:0 },
{ name: "Banana", price: 20, quantity:0 },
{ name: "Cherry", price: 30, quantity:0 }
]);
const [total,setTotal]=useState(0);
const handleClick = (product = {}) => {
// update quantity
const newProducts = [
...products,
{...product,
quantity: product.quantity+1}
];
// update total
setTotal(total+product.price)
}
return (
<div>
{products.map((p) => (
<li key={p.name}>{p.name}{p.price}
<button onClick={()=>handleClick(p)}>Add to cart</button>
<button onClick={()=>handleQty(p)}>x{p.quantity}</button>
</li>
))}
</div>
)
你的 total
没问题,但你的 quantity
不行 - 你不能指望它用一个数字来代表你的个人数量。您可以将它们存储在 products
对象中(见下文)或将其设为数组(我认为这是一种更糟糕的方法)。
handleClick = (p) => {
setTotal(prevState=>prevState+p.price);
let product = products.find((pr) => pr.name === p.name);
product.unit += 1;
const updatedProducts = products.map(p => {
if (product.name === p.name) return product;
return p;
});
setProducts(updatedProducts);
}
我正在构建一个基本的购物车示例,它有 2 个按钮,addtoCart 用于计算总金额和 Quantity 用于更新数量。但是当我点击它时,所有产品的数量都会立即更新。我该如何为特定产品做这件事?
import React,{useContext, useState, useReducer, useEffect} from 'react'
const Wishlist=()=>{
const product=[
{ name: "Apple", price: 10 },
{ name: "Banana", price: 20 },
{ name: "Cherry", price: 30 }
]
const [total,setTotal]=useState(0)
const [qty,setQty]=useState(1)
const handleClick = e => {
setTotal(prevState=>prevState+e)
};
const handleQty=e=>{
setQty(prevState=>prevState+1)
}
return(
<div>
{product.map((p)=>
<li key={p.name}>{p.name}{p.price}
<button onClick={()=>handleClick(p.price)}>Add to cart</button>
<button onClick={()=>handleQty(p)}>x{qty}</button>
</li>)
}
Price: {total}
</div>
)
}
export default Wishlist
有没有办法让多次点击“添加到购物车”按钮也更新单个数量并计算总金额?我好像想不通。
[编辑] 现在我也添加了一个单位 属性,所有数量仍然会立即更新。这是代码:
import React,{useContext, useState, useReducer, useEffect} from 'react'
const Wishlist=()=>{
const product=[
{ name: "Apple", price: 10,unit:1},
{ name: "Banana", price: 20,unit:1 },
{ name: "Cherry", price: 30,unit:1 }
]
const [total,setTotal]=useState(0)
const [qty,setQty]=useState(1)
const handleClick=e=>{
setTotal(prevState=>prevState+e.price),
setQty(e.unit+1)
console.log(e)
};
return(
<div>
{product.map((p)=>
<li key={p.name}>{p.name}{p.price}
<button onClick={()=>handleClick(p)}>Add to cart </button>
{qty}
</li>)
}
Price: {total}
</div>
)
}
export default Wishlist
您可以将产品及其数量存储在状态中,并在点击时相应地进行更新。
const [products, setProducts]= useState([
{ name: "Apple", price: 10, quantity:0 },
{ name: "Banana", price: 20, quantity:0 },
{ name: "Cherry", price: 30, quantity:0 }
]);
const [total,setTotal]=useState(0);
const handleClick = (product = {}) => {
// update quantity
const newProducts = [
...products,
{...product,
quantity: product.quantity+1}
];
// update total
setTotal(total+product.price)
}
return (
<div>
{products.map((p) => (
<li key={p.name}>{p.name}{p.price}
<button onClick={()=>handleClick(p)}>Add to cart</button>
<button onClick={()=>handleQty(p)}>x{p.quantity}</button>
</li>
))}
</div>
)
你的 total
没问题,但你的 quantity
不行 - 你不能指望它用一个数字来代表你的个人数量。您可以将它们存储在 products
对象中(见下文)或将其设为数组(我认为这是一种更糟糕的方法)。
handleClick = (p) => {
setTotal(prevState=>prevState+p.price);
let product = products.find((pr) => pr.name === p.name);
product.unit += 1;
const updatedProducts = products.map(p => {
if (product.name === p.name) return product;
return p;
});
setProducts(updatedProducts);
}