2016-07-20 3 views
0

zurückbleibt In meiner React-Komponente habe ich eine Funktion, die this.setState aufruft, und aktualisiert einige Zustände. Einer von ihnen ist jedoch immer ein Zustand "hinter", und ich vermute, dass es daran liegt, wie es heißt. HierEin Zustand, der nach setState

ist die Funktion, in der die Zustände eingestellt sind:

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 
    }); 
} 

nun alle diese Aktualisierung in Ordnung, und sind in der DOM geändert, aber der average Zustand ist immer ein Zyklus hinter sich. Das heißt, es zeigt immer den Wert an, den es VOR der letzten Änderung hätte haben sollen. I.e. das letzte Mal setState wurde aufgerufen.

Gibt es bekannte Faktoren, die diese Verzögerung in einem der Zustände verursachen können?

EDIT: Hier ist die getAverage() Funktion.

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 
    ]) 
} 
+0

Gibt es etwas in der Methode this.getAverage(); das verwendet Wert von einer Variablen, die aktualisiert wird, wenn der setState geschieht? Wenn Sie getAverage-Code anzeigen können, könnte dies helfen, das Problem zu lösen, aber ich schätze, dass getAverage eine Variable verwendet, die nach setState nicht aktualisiert wurde, um den Durchschnittswert zurückzugeben, bevor er auf Sie aktualisiert wird. Sie können auch die react-Methode componentDidUpdate überprüfen, um damit umzugehen. Ref: https://facebook.github.io/react/docs/component-specs.html#updating-componentdidupdate –

+0

@ViniciusVieira - Ja, die 'getAverage'-Funktion verwendet ALLE Zustände, die vor der letzten gesetzt sind. In Frage gestellt. – Alec

+0

Ich denke, es ist nicht mit getAverage verwandt, versuchen Sie, den Durchschnitt in den reactjs Methoden componentDidUpdate und componentWillUpdate zu protokollieren und Durchschnittswerte dort zu überprüfen, sollte es helfen, zu klären. –

Antwort

1

Das Problem hier war zweifach.

Wie Igorsvee genau darauf hingewiesen, berechnete ich den Durchschnitt mit alten Staaten. Anfängerfehler meinerseits.

Das Problem jedoch beharrte, nachdem ich anfing, "neue" Zustände zu verwenden. An diesem Punkt erfuhr ich, dass die Zustände nicht sofort mutieren, also selbst wenn ich die richtige Reihenfolge hatte, verwendete es immer noch Ein-Zyklus-alte Zustände.

Dies wurde gelöst, indem ein Callback als zweites Argument an die setState-Funktion übergeben wurde. Dieser Rückruf wird als AFTER-Mutation bezeichnet und verwendet brandneue Werte.

2

Sie verwenden, um die aktuellen Werte aus dem Zustand den Mittelwert zu berechnen, aber zur gleichen Zeit, die Sie den Zustand mit dem neuen values.So aktualisieren, im Grunde, speichern Sie die veralteten Daten für die average.I'd vorschlagen Speichern Sie die berechneten Daten nicht, sondern rufen Sie die Berechnungsmethode auf, sobald Sie sie benötigen.

+0

Das war eines der Probleme, aber auch, die Staaten wurden nicht sofort mutiert, also selbst wenn ich den Durchschnitt mit den "now-updated" Zuständen berechnete, verwendete er immer noch die alten Werte. Ich habe es gelöst, indem ich einen Callback an die 'setState'-Funktion übergeben habe, die als AFTER-Status bezeichnet wurde und mutiert wurde. – Alec