首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当状态是对象数组时更新状态。反应

当状态是对象数组时更新状态。反应
EN

Stack Overflow用户
提问于 2021-11-14 23:27:22
回答 1查看 89关注 0票数 0

我正在通过使用上下文来处理购物车的问题。我的问题是改变有一个对象数组的状态。

我的数组看起来像这个[{itemId: 'ps-5', qty:4}, {itemId: 'iphone-xr', qty:2}]

这是我的代码--检查注释

代码语言:javascript
复制
export const CartContext = createContext()

class CartContextProvider extends Component {

    state = {
        productsToPurchase: []
    }

    addProduct = (itemId)=> {
        if (JSON.stringify(this.state.productsToPurchase).includes(itemId)){
            // Add one to the qty of the product
            this.state.productsToPurchase.map(product=>{
                if (product.itemId === itemId){
                    // This is wrong I have to use setState(), but the syntax is a little bit complex
                    product.qty = product.qty + 1
                }
            })
        }
        else {
            this.state.productsToPurchase.push({itemId: itemId, qty: 1})
        }
    }

    render() {
        return (
            <CartContext.Provider value={{...this.state, addProduct: this.addProduct}}>
                {this.props.children}
            </CartContext.Provider>
        )
    }
}

export default CartContextProvider;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-15 00:31:01

您正在直接更新状态,但是您必须使用this.setState更新它,

现场演示

代码语言:javascript
复制
addProduct = (itemId) => {
  this.setState((oldState) => {
    const objWithIdExist = oldState.productsToPurchase.find((o) => o.itemId === itemId);
    return {
      productsToPurchase: !objWithIdExist
        ? [...oldState.productsToPurchase, { itemId, qty: 1 }]
        : oldState.productsToPurchase.map((o) =>
            o.itemId !== itemId ? o : { ...o, qty: o.qty + 1 }
          )
    };
  });
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69968017

复制
相关文章

相似问题

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