gpt4 book ai didi

javascript - componentDidMount 同步更新

转载 作者:行者123 更新时间:2023-12-02 08:03:28 26 4
gpt4 key购买 nike

我正在使用以下方式从保存的 session 中加载数据:

componentDidMount() {
if (JSON.parse(localStorage.getItem('savedData')) !== null) {
this.setState({
cartItems: JSON.parse(localStorage.getItem('savedData')),
totalPrice: this.getPriceOnLoad(),
totalItems: this.getItemsOnLoad(),
});
}
}

cartItems 是一个对象数组。哪个好像之前更新过

this.getPriceOnLoad();
this.getItemsOnLoad();

函数被调用,例如this.getPriceOnLoad函数:

getPriceOnLoad() {
let itemsPrice = 0;
for (let i = 0; i <= this.state.cartItems.length - 1; i++) {
itemsPrice += this.state.cartItems[i].quantity * this.state.cartItems[i].price;
}
return itemsPrice;
}

但是,在getPriceOnLoad函数中,this.state.cartItems.length等于0,所以for循环没有执行。我可以在 React 开发工具中看到这个数组有一定的长度。是因为 componentDidMount() 正在同步执行状态变化,不能立即看到更新的数组吗?所以我的问题是如何在数组初始化后更新商品的价格和数量?

最佳答案

您的状态未按顺序更新。为此,您可以将 cartItems 存储在一个临时值中,并将其发送到每个函数:

componentDidMount() {
if (JSON.parse(localStorage.getItem('savedData')) !== null) {
const cartItems = JSON.parse(localStorage.getItem('savedData'))
this.setState({
cartItems, //Short syntax for 'cartItems: cartItems'
totalPrice: this.getPriceOnLoad(cartItems),
totalItems: this.getItemsOnLoad(cartItems),
});
}
}

您还可以使用 reduce 显着缩短您的函数:

this.setState({
cartItems,
totalPrice: cartItems.reduce((total, item) => total + (item.quantity * item.price), 0),
totalItems: cartItems.reduce((total, item) => total + item.quantity, 0),
});

您也可以向我们展示您的第二个功能吗?它也可能被优化。 完成。

关于javascript - componentDidMount 同步更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54292698/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com