Ceci est mon code:
if (this.state.counter===questions.length-1)
{
for(let i = 0 ; i < this.state.user_answer.length; i++){
if(this.state.user_answer[i]===key[i]){
//problem starts here
this.setState(prevState => {return {score: prevState.score + 1}},()=>{
//gives me correct data for score
console.log("score1:",this.state.score);
})
}
}
//gives me score:0 (always)
console.log("score2:",this.state.score);
//i want to add correct data to my array but it adds number 0
this.state.top_score.push([this.state.score])
}
4 Réponses :
Essayez de vous installer en dehors de:
if (this.state.counter===questions.length-1)
{
let score = this.state.score;
for(let i = 0 ; i < this.state.user_answer.length; i++){
if(this.state.user_answer[i]===key[i]){
//problem starts here
score += 1;
}
}
console.log("score2:",score);
this.setState({score});
//i want to add correct data to my array but it adds number 0
this.state.top_score.push([score])
}
Tout d'abord, essayez de détruire votre état pour une meilleure utilisation de votre état et de votre code de nettoyage et de mettre à jour votre propriété Array dans votre état, comme vous le souhaitez:
let {top_score , score , counter , user_answer} = this.state;
if (counter===questions.length-1)
{
let tempScore = score;
for(let i = 0 ; i < user_answer.length; i++){
if(user_answer[i]===key[i]){
score += 1;
}
}
console.log("score2:",tempScore);
let tempArr = [...top_score];
tempArr.push(tempScore)
this.setState({score : tempScore , top_score : tempArr});
}
Si j'ai bien compris votre question correctement, vous voulez solution: p> Conseil: vous n'avez jamais actuel: strong> p> score code> pour être enfoncé dans top_score code> tableau. this.state.top_score.push (this.state.score) // Cela fonctionnerait mais la mutation de l'état directement qui est découragé dans le réagisme de réagir code> p> this.setstate ({top_score: [... ceci.state.top_score, cela.state.score]}) // sans mutation de l'état code> p> p> p> P> P>
J'ai aussi essayé votre solution, mais j'ai eu une erreur: Erreur d'analyse: jeton inattendu, attendu "," code>
C'est parce que} dans mon code n'était pas sur le bon endroit. Mis à jour mon code. :)
Très bien, vous avez trouvé l'un des concepts les plus difficiles à comprendre à JavaScript: le fait qu'il soit asynchrone. Il y a beaucoup à dire à propos de ce sujet, mais la clé principale de comprendre est que le code n'est pas nécessairement exécuté de haut en bas (comme dans d'autres langues, telles que peut être exécuté avant le Ma suggestion pour votre code serait: p> python code>). Au lieu de cela, le moteur JavaScript n'attend pas que des blocs de code à terminer l'exécution (telle que votre pour code> boucle) avant d'exécuter d'autres déclarations à venir. Donc, dans votre cas, le bloc: pour code> boucle supérieure aux finitions (en fonction de la durée de fonctionnement). Ce que cela signifie dans la pratique est que, l'appel à SetState code> se produit après avoir essayé d'accéder à la valeur de score code>, et comme il n'a pas encore été mis à jour, c'est toujours mis à jour, c'est toujours 0 code>. Un autre aspect clé que je vois dans votre code est un anti-motif de modification directe état code>. En réagissant, vous ne devriez pas faire cela et utiliser plutôt this.setstate code>, qui est optimisé pour mettre à jour état code>. Vous pouvez également utiliser une approche plus fonctionnelle de JavaScript en utilisant Méthodes de tableau et ES6 fonctionnalités pour rendre votre nettoyeur de code. P>
Pourquoi ne pas faire
this.state.top_score.push (this.state.core) code> où vous obtenez une bonne réponse pourscore code>?comment? J'ai essayé
score: prevstate.score + 1; this.state.top_score.push (this.state.score) code> et j'ai eu une erreur.La façon dont j'ai mentionné dans ma réponse