React:状态不会在第一次点击时更新

问题描述 投票:0回答:1

我正在购买购物车样品。

每次单击,我将项目的对象添加到Cart数组。当我第一次单击添加购物车按钮时,它不会更新购物车,但会在第二次更新。

虽然,当我单击render的return语句中的viewCart按钮时,它会显示购物车中准确的项目数。请参阅下面的代码:

我需要能够在不单击viewCart按钮的情况下查看购物车中的准确物品数量。这些产品来自本地JSON文件,因此我认为加载JSON文件没有任何问题。

constructor (props) {
    super(props);
    this.state = {
        Cart: []
    };
    this.addItem = this.addItem.bind(this);
}

addItem(productKey) {
    this.setState({ Cart: [...this.state.Cart, ProductsJSON[productKey]]})
    console.log(this.state.Cart);
}

viewCart() {
    console.log(this.state.Cart);
}

render() {
  const AllProducts = ProductsJSON;

  var Products = AllProducts.map((item) => {
    return (
            <div className="col-4" key={item.key} >
                <a onClick={() => this.addItem(item.key)} className="btn btn-primary btn-sm">Add to Cart</a>
            </div> 
        )
})

return (
        <div className="container">
            <div className="row">
                {Products}
                <a onClick={() => this.viewCart()} className="btn btn-primary btn-sm">viewCart</a>
            </div>
        </div>
    )
}
javascript reactjs jsx setstate
1个回答
3
投票

只是因为你没有在console.log中看到它并不意味着它无法正确呈现,这里的问题是setState是异步的,因此你不会看到它,如果你console.log它立即执行(console.log将执行之前状态已更新),但如果您仍想记录您的购物车,您可以:

this.setState(
   { Cart: [...this.state.Cart, ProductsJSON[productKey]] },
   () => console.log(this.state.Cart)
)

一旦状态更新,setState就接受一个函数作为回调。

© www.soinside.com 2019 - 2024. All rights reserved.