Javascript 设置状态后落后的一个状态
在React组件中,我有一个函数,它调用Javascript 设置状态后落后的一个状态,javascript,reactjs,ecmascript-6,Javascript,Reactjs,Ecmascript 6,在React组件中,我有一个函数,它调用this.setState,并更新一些状态。然而,其中一个总是一个状态“落后”,我怀疑这是因为它的名称 以下是设置状态的函数: handleReps(reps) { var average = this.getAverage(); this.setState({ var1: CALCULATORS.epley(reps, this.state.weight), var2: CALCULATORS.brzyck
this.setState
,并更新一些状态。然而,其中一个总是一个状态“落后”,我怀疑这是因为它的名称
以下是设置状态的函数:
handleReps(reps) {
var average = this.getAverage();
this.setState({
var1: CALCULATORS.epley(reps, this.state.weight),
var2: CALCULATORS.brzycki(reps, this.state.weight),
var3: CALCULATORS.lander(reps, this.state.weight),
// some more
average: average
});
}
现在,所有这些都可以很好地更新,并且在DOM中进行了更改,但是平均
状态总是落后一个周期。也就是说,它总是显示上次更改之前应该具有的值。即上次调用setState
是否有一些已知的因素可能导致其中一个州的延误
编辑:这里是getAverage()
函数
getAverage () {
return CALCULATORS.average([
this.state.epley, this.state.brzycki, this.state.lander,
this.state.lombardi, this.state.mayhew, this.state.oconner,
this.state.wathen
])
}
您使用状态中的当前值来计算平均值,但同时使用新值更新状态。因此,基本上,您存储平均值的陈旧数据。我建议不要存储计算数据,而是在需要时调用方法来计算它。这里的问题有两个方面 正如Igorsvee准确指出的那样,我是在使用旧状态计算平均值。我犯了一个新手错误 然而,在我开始使用“新”状态后,问题仍然存在。在这一点上,我了解到状态不会立即发生变异,所以即使我有正确的顺序,它仍然使用一个周期的旧状态
这可以通过将回调作为第二个参数传递给
setState
函数来解决。此回调在变异后调用,将使用全新的值。This.getAverage()方法中是否有内容;使用变量中的值,该值在设置状态发生时更新?如果您可以显示getAverage代码,它可能有助于解决问题,但我的猜测是getAverage使用了一些在setState之后未更新的变量,以在更新之前返回平均值。您还可以检查react方法componentDidUpdate来处理它。Ref:@ViniciusVieira-是的,getAverage
函数使用在最后一个状态之前设置的所有状态。编辑成问题。我认为它与getAverage无关,尝试在reactjs方法componentDidUpdate和componentWillUpdate中记录平均值,并检查那里的平均值,这应该有助于澄清。这是问题之一,但状态也没有立即发生变化,所以即使我使用“now updated”状态,它仍然使用旧值。我通过向setState
函数传递回调来解决它,该函数在状态发生变化后调用。