计算不会在DOM上实时呈现。
一个) setState 是 异步 ,在同一更新周期中的后续调用将覆盖以前的更新,之前的更改将丢失。
setState
所以如果你想使用 this.setState 您应该使用回调函数的值。
this.setState
this.setState({value: 'value'},() => {return : /*something here ..*/});
而不是改变状态( this.state.someValue )直接它是一个很好的做法,以返回一个新的国家副本。
this.state.someValue
return { ...previousState, value: updated new state };
你可以阅读更多 这里
对我来说,我使用async等待并且工作得非常好
async updateDailySavings() { if (this.state.timeLeft !== 0) { await this.setState({dailyCost: (this.state.totalCost / this.state.timeLeft).toFixed(2)}); } else { await this.setState({dailyCost: 0}); } } async changeCost(newCost) { await this.setState({totalCost: Math.round(newCost)}); this.updateDailySavings() } async changeTimeLeft(newTimeLeft) { await this.setState({timeLeft: Math.round(newTimeLeft)}); this.updateDailySavings() }
我希望它可以帮到你
正如@bennygenel所指出的,setState是异步的,所以你应该这样做:
updateDailySavings() { if (this.timeLeft !== 0) { this.setState({dailyCost: (this.totalCost / this.timeLeft).toFixed(2)}); } else { this.setState({dailyCost: 0}); } } changeCost(newCost) { this.totalCost = Math.round(newCost); this.setState({totalCost: this.totalCost}); this.updateDailySavings() } changeTimeLeft(newTimeLeft) { this.timeLeft = Math.round(newTimeLeft); this.setState({timeLeft: this.timeLeft}); this.updateDailySavings() }
*注意可能不再需要两个以后的setStates,但我不知道你是否使用它们