小编典典

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

reactjs

我正在研究购物车样本。

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

虽然,当我单击渲染器的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>
    )
}

阅读 268

收藏
2020-07-22

共1个答案

小编典典

仅仅因为您没有看到它console.log并不意味着它无法正确呈现,所以这里的问题setState异步的
,因此如果您立即console.log它,您将看不到它( console.log将在state为更新了
),但是如果您仍然想登录购物车,则可以执行以下操作:

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

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

2020-07-22