0
votes

Poussez les données ASYNC à un réagir de la matrice

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


3 commentaires

Pourquoi ne pas faire this.state.top_score.push (this.state.core) où vous obtenez une bonne réponse pour score ?


comment? J'ai essayé score: prevstate.score + 1; this.state.top_score.push (this.state.score) et j'ai eu une erreur.


La façon dont j'ai mentionné dans ma réponse


4 Réponses :


0
votes

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


0 commentaires

0
votes

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



0 commentaires

0
votes

Si j'ai bien compris votre question correctement, vous voulez score pour être enfoncé dans top_score tableau.

solution: xxx

Conseil: vous n'avez jamais retour dans réact du monde.

Mise à jour dans le code

Précédent:

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

actuel:

this.setstate ({top_score: [... ceci.state.top_score, cela.state.score]}) // sans mutation de l'état


2 commentaires

J'ai aussi essayé votre solution, mais j'ai eu une erreur: Erreur d'analyse: jeton inattendu, attendu ","


C'est parce que} dans mon code n'était pas sur le bon endroit. Mis à jour mon code. :)



0
votes

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 python ). Au lieu de cela, le moteur JavaScript n'attend pas que des blocs de code à terminer l'exécution (telle que votre pour boucle) avant d'exécuter d'autres déclarations à venir. Donc, dans votre cas, le bloc: xxx

peut être exécuté avant le pour 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 se produit après avoir essayé d'accéder à la valeur de score , et comme il n'a pas encore été mis à jour, c'est toujours mis à jour, c'est toujours 0 . Un autre aspect clé que je vois dans votre code est un anti-motif de modification directe état . En réagissant, vous ne devriez pas faire cela et utiliser plutôt this.setstate , qui est optimisé pour mettre à jour état . 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.

Ma suggestion pour votre code serait: xxx


0 commentaires