Ich arbeite an einer kleinen Anwendung, mit der Sie einige Spielstände verfolgen können.React: Wie verwenden Sie this.state in nachfolgenden setState() -Aufrufen? Wie erzwinge ich ein Update auf this.state?
Das Spiel wird zwischen zwei Spielern gespielt. Ein Spieler kann Punkte erzielen, kann aber auch bestraft werden. Anstatt die Strafe von der Punktzahl des Spielers abzuziehen, wird sie dem Spielstand seines Gegners hinzugefügt. Der Gegner sollte auch die nächste Runde bekommen.
ich Setup eine Demo, die die obige Beschreibung implementiert: https://codepen.io/anon/pen/ybLQvR
Wie Sie in der Demo sehen es nicht ganz funktioniert: wenn ein Spieler verursacht eine Strafe er den Strafstoß zugesprochen bekommt, statt seines Gegners.
Dies ist aufgrund setState
innerhalb setTurn
nicht sofort verarbeitet werden. setScore
verwendet immer noch den 'alten' Status, in dem der Turn nicht aktualisiert wurde.
Ich bin mir bewusst, dass dies durch die Übergabe eines Callbacks an setState
statt eines Objekts (siehe den kommentierten Code) behandelt werden kann, die den zuvor festgelegten Zustand übernimmt. Wenn ich das tue, funktionieren die Dinge wie erwartet.
Ich brauche jedoch den aktualisierten Wert des Status (in diesem Fall this.state.turn
) in der addScore
außerhalb der setState
Aufruf auch. Wie würde ich das erreichen? Ich habe this.forceUpdate()
vergeblich versucht.
Sollte ich den gesamten Funktionskörper von addScore
in den Rückruf setState
wrappen? Wie würde ich dann irgendwelche Berechnungen basierend auf this.state.turn
von der addScore
Methode zurückgeben, sollte ich es brauchen?
Seitliche Frage: Warum funktioniert this.forceUpdate()
nicht? Wird nur die Komponente erneut gerendert, ohne die Statuswarteschlange zu verarbeiten?
Vielen Dank für Ihre Hilfe!
Wenn Sie wirklich auf dem aktuellen Stand sind, um den nächsten Zustand zu ändern, dann verwenden Sie die Callback-Funktion in setState Der bessere Weg zu gehen –
Danke für Ihren Kommentar, @ CallumLinington. Wenn ich also den gesamten Funktionskörper in den 'setState'-Callback umschließe, wie würde ich irgendwelche Werte aus dem Callback-Body in den' addScore'-Methodenkörper zurückgeben? Sagen wir, ich möchte einen Wert von "addScore" zurückgeben, wenn Spieler 1 eine Punktzahl von 50 erreicht. – Meldon