【问题标题】:Updating state when state is an array of objects. React当状态是对象数组时更新状态。反应
【发布时间】:2021-12-26 06:48:15
【问题描述】:

我正在使用上下文处理购物车。我的问题是更改具有对象数组的状态。

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

这是我的代码检查评论

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;

【问题讨论】:

  • 您是否有要分享的具体问题或错误情况,或者您尝试开始工作但无法编写代码示例,或者您只是想找人为您编写代码?跨度>
  • 您在这里遇到什么问题?
  • @decpk 我正在尝试使用useState() 来更改对象数组中的某个值。
  • 我的数组看起来像这样[{itemId: 'ps-5', qty:4}, {itemId: 'iphone-xr', qty:2}] 我将编辑我的问题,以便向大家提及。
  • @asemshaat 你有一个类组件,useState 是一个钩子,钩子在类组件中不起作用

标签: javascript reactjs react-context


【解决方案1】:

你是直接更新状态,但是你必须使用this.setState来更新它,

现场演示

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 }
          )
    };
  });
};

【讨论】:

  • 效果很好。但是我不明白 return 之后的语法
  • 我没搞清楚的是[...oldState.productsToPurchase, { itemId, qty: 1 }]o.itemId !== itemId ? o : { ...o, qty: o.qty + 1 }
猜你喜欢
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 2021-10-22
  • 2020-03-29
  • 2020-07-01
相关资源
最近更新 更多