我正在购买购物车样品。
每次单击,我将项目的对象添加到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>
)
}
只是因为你没有在console.log
中看到它并不意味着它无法正确呈现,这里的问题是setState
是异步的,因此你不会看到它,如果你console.log它立即执行(console.log将执行之前状态已更新),但如果您仍想记录您的购物车,您可以:
this.setState(
{ Cart: [...this.state.Cart, ProductsJSON[productKey]] },
() => console.log(this.state.Cart)
)
一旦状态更新,setState就接受一个函数作为回调。