Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在React中的两个状态之间传输对象_Javascript_Reactjs_React Hooks - Fatal编程技术网

Javascript 在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},

我正在创建一个购物车,上面有如下的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 [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}中的项目数量购物车中的物品