2017-06-25 3 views
0

Ich habe eine Container-Komponente, die gameId für eine Spielkomponente in seinem Zustand verwaltet. Am Ende des Spiels erhält der Benutzer eine Punktzahl. Der Benutzer trifft auf playAgain und möchte eine laufende Summe von totalScore behalten, indem er userScore hinzufügt.Reagieren: Wie man eine laufende Summe in einem Spiel hält

aktualisiert

Um den Zustand in der oberen Komponente Container zu ändern, muss ich dies in einer Funktion binden, und senden Sie es an Footer unten. Bevor ich versuchte, diese Funktion aufzurufen und bekam eine Fehlermeldung "nicht den Zustand ändern innerhalb eines render()"

this.props.addToTotalScore(this.props.userScore); 

Der Code:

class Container extends React.Component {  

constructor(props) { 
super(props); 
this.state = { 
    gameId:1, 
    ... 
    totalScore:0 
}; 
} 

    addToTotalScore(val){ 
     this.setState({ totalScore: this.state.totalScore + val }); 
    } 
..... 
render(){ 
    return (
     <div> 
      <Game 
       key={this.state.gameId} 
       ... 

       addToTotalScore={this.addToTotalScore.bind(this)} 
      /> 
     </div> 
    ); 
} 
} 

Und Spiel:

class Game extends React.Component { 

    .... 

    finishGame(gameState) { 

    let completedTime = this.secondsRemaining; 
    let userScore = 0; 
    if (gameState === "won"){ 

     let wrongGuesses = 3 - this.state.wrongGuesses.length; 
     userScore = wrongGuesses < 1? 1: wrongGuesses; 


    } 
    // want to change the userScore and update the totalScore here 
    this.setState({ userScore: userScore }); 
    this.props.addToTotalScore(this.props.userScore); 
    }); 

    clearInterval(this.playTimerId); 
    return gameState; 
    } 

Was ich getan habe, um dies zu lösen, war eine Variable zu erstellen und den Game-Status zu setzen und dann die selbe Variable zu verwenden, anstatt props.userState aufzurufen, um die Summe zu aktualisieren. Dies aktualisiert die Gesamtzahl wie erwartet.

In finishGame:

... 
let wrongGuesses = 3 - this.state.wrongGuesses.length; 

let _userScore = wrongGuesses < 1? 1: wrongGuesses; 
this.setState({userScore: _userScore}); 
this.props.addToTotalScore(_userScore); 
+0

Könnten Sie näher erläutern, was Sie meinen, indem Sie hier ein Problem bc des Festlegens von Status innerhalb einer render() aufrufen? Weil ich nicht sehe, wo Sie innerhalb des Status in render-Methode aktualisieren –

+0

Nicht wirklich sicher, was Ihr Problem ist, aber wenn Sie meinen, dass Sie Ihren Zustand irgendwo in Ihrer Rendermethode setzen, dann sollten Sie das nicht tun – Jayce444

Antwort

0

Ich glaube, das über Reagieren nicht wirklich eine Frage ist, es geht um Ihr Spiel. Was Sie fragen ist: Wann ist der beste Zeitpunkt, um die Punktzahl zur Gesamtpunktzahl hinzuzufügen.

Die einfachste Antwort ist: sobald die Spielrunde beendet ist. Das hängt natürlich von deinem Spiel ab. Wie entscheiden Sie, dass die Runde beendet ist? basiert es auf einem Timer? oder basierend auf einem bestimmten Ereignis?

Wenn Ihre Methode finishGame ausgeführt wird, wenn die Spielrunde beendet ist, dann ist es ein guter Platz, um zur Gesamtpunktzahl hinzuzufügen. Ich sehe nicht, warum das render beeinflussen würde. Ich verstehe nicht, was Sie meinen, indem Sie sagen Adding this bound function and calling it here is a problem bc of setting state within a render(). Sie übergeben es als eine Prop innerhalb der render() -Methode, das ist nicht das gleiche wie das Aufrufen. Sobald es aufgerufen wird, ändert sich der Status und React wird rendern() erneut ausführen.

Verwandte Themen