Javascript 在React中的两个状态之间传输对象
我正在创建一个购物车,上面有如下的react钩子Javascript 在React中的两个状态之间传输对象,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我正在创建一个购物车,上面有如下的react钩子 const ShoppingCart = () => { const [products, setProducts] = useState([ {id: 1, name: 'Product 1', price: 2500}, {id: 2, name: 'Product 2', price: 2000}, {id: 3, name: 'Product 3', price: 2500},
const ShoppingCart = () => {
const [products, setProducts] = useState([
{id: 1, name: 'Product 1', price: 2500},
{id: 2, name: 'Product 2', price: 2000},
{id: 3, name: 'Product 3', price: 2500},
])
const [cart, setCart] = useState()
const addToCart = (item) => (
setCart([cart, {item}])
// setCart([...cart, {item}])
// setCart([{item}])
)
return (
{
products.map((product, i) => (
<>
<Product name={product.name} price={product.price} key={product.id} />
<button
value='Add to cart'
// onClick={((product) => setCart(...cart, product))}
onClick={(product) => addToCart(product)}
// onClick={console.log(i)}
/>
{console.log(cart)}
</>
))
}
)
}
onClick={() => addToCart(product)}
如果可能的话,我还想向对象添加另一个字段,它将是amount使用
onClick={((产品)=>setCart([…cart,product])}
使用onClick={((产品)=>setCart([…cart,product])}
设置购物车的初始值
const [cart, setCart] = useState([]); // [] is the initial value of the cart
从传递给onClick
的回调中删除product
,因为它不是产品,而是click事件
<button value="Add to cart" onClick={() => addToCart(product)} />
编辑
如果只想添加一次项目,请先检查购物车中是否存在该项目:
const addToCart = item => {
const ndx = cart.findIndex(e => e.id === item.id);
if (ndx === -1) {
setCart([...cart, item]);
}
};
设置购物车的初始值
const [cart, setCart] = useState([]); // [] is the initial value of the cart
从传递给onClick
的回调中删除product
,因为它不是产品,而是click事件
<button value="Add to cart" onClick={() => addToCart(product)} />
编辑
如果只想添加一次项目,请先检查购物车中是否存在该项目:
const addToCart = item => {
const ndx = cart.findIndex(e => e.id === item.id);
if (ndx === -1) {
setCart([...cart, item]);
}
};
请在addToCart函数中使用…cart,因为cart将是以前的数据数组,当您使用该[…cart,item]时,以前的数组将合并到新数组中,并将在该新数组中添加新产品对象
const addToCart = (item) => (
setCart([...cart,item])
)
请不要将param传递给您的click回调函数,因为您是从上面而不是从click函数获取此产品的。请使用如下匿名函数
const ShoppingCart = () => {
const [products, setProducts] = useState([
{id: 1, name: 'Product 1', price: 2500},
{id: 2, name: 'Product 2', price: 2000},
{id: 3, name: 'Product 3', price: 2500},
])
const [cart, setCart] = useState()
const addToCart = (item) => (
setCart([cart, {item}])
// setCart([...cart, {item}])
// setCart([{item}])
)
return (
{
products.map((product, i) => (
<>
<Product name={product.name} price={product.price} key={product.id} />
<button
value='Add to cart'
// onClick={((product) => setCart(...cart, product))}
onClick={(product) => addToCart(product)}
// onClick={console.log(i)}
/>
{console.log(cart)}
</>
))
}
)
}
onClick={() => addToCart(product)}
请在addToCart函数中使用…cart,因为cart将是以前的数据数组,当您使用该[…cart,item]时,以前的数组将合并到新数组中,并将在该新数组中添加新产品对象
const addToCart = (item) => (
setCart([...cart,item])
)
请不要将param传递给您的click回调函数,因为您是从上面而不是从click函数获取此产品的。请使用如下匿名函数
const ShoppingCart = () => {
const [products, setProducts] = useState([
{id: 1, name: 'Product 1', price: 2500},
{id: 2, name: 'Product 2', price: 2000},
{id: 3, name: 'Product 3', price: 2500},
])
const [cart, setCart] = useState()
const addToCart = (item) => (
setCart([cart, {item}])
// setCart([...cart, {item}])
// setCart([{item}])
)
return (
{
products.map((product, i) => (
<>
<Product name={product.name} price={product.price} key={product.id} />
<button
value='Add to cart'
// onClick={((product) => setCart(...cart, product))}
onClick={(product) => addToCart(product)}
// onClick={console.log(i)}
/>
{console.log(cart)}
</>
))
}
)
}
onClick={() => addToCart(product)}
您需要定义初始状态,即使它只是一个空数组:const[cart,setCart]=useState([])您需要定义初始状态,即使它只是一个空数组:const[cart,setCart]=useState([])非常感谢,请问您知道如何添加检查数组中是否已存在项吗?您可以使用array.includes检查该值是否存在于数组中。谢谢,请问您知道如何添加检查数组中是否已存在项吗?您可以使用array.includes检查该值是否存在于数组中。这是这正是我们所需要的!非常感谢。请您知道一种添加检查数组中是否已经存在项目的方法吗?这样您就不会添加asme项目两次了?可以添加两次相同的项目,但根据数量,它应该显示2x、3x等,还可以读取数组的长度,包括like
{cart.length}中的项目数量购物车中的物品
这正是我们所需要的!非常感谢。请您知道一种添加检查数组中是否已经存在项目的方法吗?这样您就不会添加asme项目两次了?可以添加两次相同的项目,但根据数量,它应该显示2x、3x等,还可以读取数组的长度,包括like{cart.length}中的项目数量购物车中的物品