IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

React Discussion :

onChangeVariable exécuté que la 2eme fois (Fetch)


Sujet :

React

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2021
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2021
    Messages : 22
    Par défaut onChangeVariable exécuté que la 2eme fois (Fetch)
    Bonjour,
    Je travaille sur une application en React Native.

    Pour le formulaire d'enregistrement de nouveau compte, je souhaite vérifier que le nouveau Login n'est pas déjà présent en base de données. J'utilise un Fetch pour récupérer un tableau avec les Logins présents en bdd.
    Je parcours le tableau avec un for, et avec un if je modifie la variable Result de "déjà utilisé" à "disponible". J'utilise un composant fonctionnel et un hook d'état.
    J'affiche ensuite en console la valeur de résultat.
    Tout cela est déclenché par une pression sur un bouton.

    Tout cela fonctionne très bien, sauf que ... seulement la deuxième fois. Chaque fois que je change la valeur du Login (soit en dur, soit avec un textImput), l'état précédant s'affiche.

    Supposons que par défaut, Result vaut "déjà utilisé", je rentre un Login non présent en bdd. La console affiche "déjà utilisé" à la première pression, puis "disponible" à la deuxième. Même comportement dans l'autre sens.

    Voici des extraits de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    const SigninForm = ({ navigation: { navigate } }) => {
    (...)
     
    const [Login, onChangeLogin] = React.useState("");
    const [Result, onChangeResult] = React.useState("déjà utilisé");
     
    (...)
    <View style={styles.main_container}>
            <TextInput style={styles.textinput}
            onChangeText={onChangeLogin}
            value={Login}
            placeholder="Entrer votre identifiant"
             />
          </View>
     
    (...)
     
    <Button title="Soumettre" onPress={() => {
     
            fetch(url+queryCheck)
            .then(function(res) {
              if (res.ok) {
                return res.json()
              }
            })
            .then(function(value) {
              var cpt = 0
     
              for (var i in value) {
                if(value[i].Login != Login) {
                  //console.log(value[i].Login+" = " + Login)
                  cpt++
                }
              }
              //console.log("cpt =" + cpt, "tab = " + (value.length))
              if (cpt == value.length) {
     
                  onChangeResult("disponible")
              }
              else {
     
                  onChangeResult("déjà utilisé")
              }
                console.log(Result)
            })
            .catch(function(err) {
              console.log(err);
            })
     
          }
    }/>
    (...)
    J'ai déjà remarqué ce comportement dans un fetch où je voulais inclure une redirection (navigate("Login")) une fois la requête exécutée.

    Si quelqu'un sait comment arranger ça. Merci.

  2. #2
    Membre Expert
    Avatar de gwyohm
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 925
    Par défaut
    Ton souci, c'est que tu logs Result, qui est géré par useState.
    Quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    onChangeResult("disponible")
    , Result ne change pas immédiatement (d'ailleurs c'est une constante, il ne peut pas changer), tu indiques à React que tu veux changer la valeur de ton state, mais ca ne sera refléter dans ton code que lorsque ton composant se mettre à jour (notamment pcq tu as demandé à modifier le state), et que ton composant fonction va se ré-exécuter

    Au delà de ta question, je trouve la solution technique très étrange. L'api devrait renvoyer si un login est disponible, mais renvoyer tous les logins, ca ne peut que te poser des pbs par la suite. Si tu maitrises le back-end, je trouverai plus logique que ce soit lui qui cherche si le login est disponible.
    Si tu ne le maitrises pas, et que tu es obligé de chercher coté client, tu peux faire beaucoup plus simple aussi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <Button title="Soumettre" onPress={() => {
     
            fetch(url+queryCheck)
            .then(function(res) {
              if (res.ok) {
                return res.json()
              }
            })
            .then(function(value) {
             const alreadyUsed = (value.map(({Login: login } = {}) => login).includes(Login);
             // ou bien
             const alreadyUsed = value.findIndex(({ Login: login } = {}) => login === Login) !== -1;
             // ou au moins faire un break dès qu'il existe 
             let alreadyExists = false;
              for (var i in value) {
                if(value[i].Login == Login) {
                  //console.log(value[i].Login+" = " + Login)
                  alreadyExists = true;
                 break;
                }
              }
              //console.log("cpt =" + cpt, "tab = " + (value.length))
              if (alreadyUsed) {
                onChangeResult("déjà utilisé")
     
              }
              else {
               onChangeResult("disponible")
              }
                console.log(Result)
            })
            .catch(function(err) {
              console.log(err);
            })
     
          }
    }/>

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2021
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2021
    Messages : 22
    Par défaut
    Merci.

    J'ai défini une var result, et j'ai remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    onChangeResult("disponible")
    par
    Et du coup ça fonctionne comme attendu.

    Pour ta remarque, je vais en parler avec mon collègue en back-end.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/07/2015, 13h43
  2. Que faire une fois le thread exécuté ?
    Par Coussati dans le forum Langage
    Réponses: 10
    Dernier message: 09/12/2014, 19h47
  3. Mon programme ne s'exécute que deux fois !
    Par Goundy dans le forum jQuery
    Réponses: 2
    Dernier message: 17/02/2010, 15h45
  4. Réponses: 4
    Dernier message: 16/10/2008, 17h36
  5. Réponses: 1
    Dernier message: 16/10/2008, 15h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo