首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >增加数组Javascript、React、RecoilJs中对象的数量

增加数组Javascript、React、RecoilJs中对象的数量
EN

Stack Overflow用户
提问于 2021-08-05 16:39:54
回答 1查看 414关注 0票数 1

在控制台中检查它时,结果是很好的,但是如果在setCart中替换该数组--它没有发生,则RecoilJS

代码语言:javascript
复制
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:‘葡萄’,价格:69,数量:1}

代码语言:javascript
复制
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)
                    
         }       
                    
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-05 20:39:22

问题

Array.prototype.includes基本上使用浅引用相等。原语和字符串类型都是值总是等于自己,但是对象必须引用内存中完全相同的引用,这样.includes才能为它们工作。但是,当向购物车中添加的项通常也将是一个对象时,这种情况几乎没有发生过。

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

解决方案

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

我建议也使用函数状态更新来正确地从以前的状态更新,而不是在任何作用域中关闭任何cart状态。这些有时是过时的引用,特别是如果在任何循环中调用addToCart来添加多个项。

代码语言:javascript
复制
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]);
  }                 
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68670437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档