javascript - 增加数组中对象的数量Javascript,React,RecoilJs

标签 javascript reactjs recoiljs

在控制台中检查时,结果很好,但如果在 setCart 中替换该数组,则不会发生,RecoilJS

const cartState=[
    { id:1, productName:'Apple',price:100,quantity:1}
    { id:2, productName:'Cherry',price:70,quantity:1}
    { id:3, productName:'Orange',price:60,quantity:1}
    { id:4, productName:'Grapes',price:69,quantity:1}
]

const [cart, setCart] = useRecoilState(cartState)

对象是 { id:4, ProductName:'Grapes',price:69,quantity:1}

const addToCart =(object) => {
        
            if(!cart.includes(object))
            {
                setCart([...cart, object])  
            }else 
            {
                let f= cart.map(items=>
                        {
                            if(items.id==object.id)
                            {
                                return {...items, quantity:items.quantity+ 1}
                            }
                            return items
                        })
                      
                        setCart(f)
                    
         }       
                    
}

最佳答案

问题

Array.prototype.includes 基本上使用浅引用相等。基元和字符串类型在值上始终等于自身,但对象必须引用完全相同的引用内存以便 .includes 为它们工作。在 React 中几乎不会出现这种情况,但添加到购物车的商品通常是 也是对象。

通过特定属性匹配对象总是更安全。

解决方案

按购物车商品 ID 进行搜索和匹配。如果购物车中的某些商品具有匹配的id属性,则更新购物车,否则将新商品添加到购物车数组中。

我建议还使用功能状态更新来正确更新之前的状态,而不是在任何范围内关闭任何购物车状态。这些有时可能是过时的引用,尤其是在任何循环中调用 addToCart 来添加多个项目时。

const addToCart = (newItem) => {
  if (cart.some(item => item.id === newItem.id)) {
    setCart(cart => cart.map(item => item.id === newItem.id
      ? { ...item, quantity: item.quantity + 1 }
      : item,
    ));
  } else {
    setCart(cart => [...cart, newItem]);
  }                 
}

关于javascript - 增加数组中对象的数量Javascript,React,RecoilJs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68670437/

相关文章:

javascript - react : How to send data on Popup close?

css - 使用 JS 小部件时忽略父样式

reactjs - 如何增加 react 自动完成中的输入文本框大小?

javascript - 刷新页面时,反冲不持久状态

reactjs - 如何创建 Recoil MutableSnapshot?

javascript - 如何更新 Recoil.js 外部组件中的原子(状态)? ( react )

javascript - 如何在 window.resize 上动态调整 3 个 div 的大小?

javascript - 如何检查从 javascript 正确加载的网络资源?

javascript - 我在哪里可以研究有关此进展 'scroll to page' 的信息

javascript - 音频持续时间返回 NaN