Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 设置状态后落后的一个状态_Javascript_Reactjs_Ecmascript 6 - Fatal编程技术网

Javascript 设置状态后落后的一个状态

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

在React组件中,我有一个函数,它调用
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
函数传递回调来解决它,该函数在状态发生变化后调用。