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

NodeJS Discussion :

[React/Redux/Firestore] Parcourir des collections stockées en arbre (tree)


Sujet :

NodeJS

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur Informatique et Réseaux
    Inscrit en
    Avril 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Informatique et Réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 232
    Par défaut [React/Redux/Firestore] Parcourir des collections stockées en arbre (tree)
    Bonjour à tous,
    J'essaie depuis plusieurs jours de parcourir ma BDD (Firestore) afin de rendre les éléments dans un Tree.
    La parcours récursif dans Firestore fonctionne bien, cependant je n'arrive pas à stocker mon objet dans Redux une fois qu'il est fini d'être chargé.
    Je comprends pourquoi mon rendu ne donne que le 1er niveau et pourquoi le length affiche 0 alors qu'il y a bien des objets dans la liste (lié au fait que les fonctions sont asynchrones et que la console affiche les objets en référence), mais je n'arrive pas à trouver la solution pour mettre l'objet complet c'est à dire avec toutes les sous collections dans mon store au bon moment.

    Si quelqu'un à une idée, je suis preneur.
    Merci


    Un exemple de code parlera plus :
    Un objet "play" est une feuille de l'arbre et un objet "category" est un nœud.

    Ma base de données Firestore:
    Nom : FirestoreJSON.png
Affichages : 360
Taille : 22,0 Ko

    Collection users:
    Nom : userCollections.png
Affichages : 350
Taille : 66,4 Ko

    Sous collection plays (type = category)
    Nom : userSubCollectionCategory.png
Affichages : 338
Taille : 83,0 Ko

    Sous collection plays (type = play)
    Nom : userSubCollectionPlay.png
Affichages : 341
Taille : 96,4 Ko


    Fonctions de scrutation:
    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
     
      componentDidMount(){
        // Mise à jour de l'authentification
        this.authListener();
      }
     
      authListener = () => {
        firebase.auth().onAuthStateChanged((user) => {
          if(user){ // Si l'utilisateur est connecté
            firebase.firestore().collection("users").doc(user.uid).get().then(snapshot => {
              this.props.setUser(snapshot.data())
            })
            firebase.firestore().collection(`users/${user.uid}/plays`).onSnapshot(snapshot => {  // Si l'utilisateur est connecté parcours du 1er noeud de la collection
              let plays = []
              snapshot.forEach(doc => { 
                if(doc.data().type === "play"){ // Si l'objet est "play" alors c'est une feuille de l'arbre
                  plays.push(doc.data())
                }else if(doc.data().type === "category"){ // Si l'objet est "category" alors c'est un noeud de l'arbre
                  const cat = doc.data();
                  cat.plays = []
                  this.getAllPlaysForUser(cat.plays, `users/${user.uid}/plays/${doc.id}/plays`); // Récursivité avec en paramètre l'objet à mettre à jour et le path de la prochaine sous collection
                  plays.push(cat) // ajout du noeud au parent
                }
              })
              console.log("plays", plays);
              console.log("plays.length", plays.length);
              this.props.setPlays(plays) // mise à jour du store mais n'est pas complet car les appels sont asynchrone
            })
          }else{
            this.props.setPlays([]) // Vide le store si l'utilisateur n'est pas connecté
          }
        })
      }
     
      getAllPlaysForUser = (plays, path) => {
        firebase.firestore().collection(path).onSnapshot(snapshot => { // Parcours des noeuds suivant
          snapshot.forEach(doc => {
            if(doc.data().type === "play"){ // Si l'objet est "play" alors c'est une feuille de l'arbre
              plays.push(doc.data())
            }else if(doc.data().type === "category"){ // Si l'objet est "category" alors c'est un noeud de l'arbre
              const cat = doc.data();
              cat.plays = []
              this.getAllPlaysForUser(cat.plays, `${path}/${doc.id}/plays`);// Récursivité avec en paramètre l'objet à mettre à jour et le path de la prochaine sous collection
              plays.push(cat) // ajout du noeud au parent
            }
          })
        })
      }
    Le résultat mais seulement du 1er niveau
    Nom : TreeOnRender.png
Affichages : 335
Taille : 4,6 Ko

    Mon log console lors du parcours de l'objet mis dans le store pour la construction de l'arbre:
    Nom : consoleSynchro.png
Affichages : 331
Taille : 20,8 Ko

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2018
    Messages : 119
    Par défaut
    Bonjour,

    Je ne sais pas si ton pb vient de la, juste une idee qui me passe par la tete: avec redux on doit cloner toutes les couches, les embedded arrays et objects.

    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
     
     
    const paxInfo = {
       name: "paul",
       age: 23,
       adresse: {
          rue: "de la soif",
          numero: 12,
          contact: {
             tel: 54765475,
             email: "jgfj@khjgk.com"
          }
       }
    }
     
    // dans le reducer de redux
    const sendContact = (state, action) => {
       return {
          ...state,
              paxInfo: {
                 ...state.paxInfo,
                    adresse: {
                       ...state.paxInfo.adresse,
                          contact: {
                             ...state.paxInfo.adresse.contact
                         }
                      }
                }
         }
    }
    vois ce lien https://redux.js.org/recipes/structu...pdate-patterns

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur Informatique et Réseaux
    Inscrit en
    Avril 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Informatique et Réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 232
    Par défaut
    Salut,
    Merci pour ta réponse.
    Du coup j'ai géré autrement et mis en state local de chaque noeud la liste de ses fils. J'avais pas vraiment d'intérêt à les mettre dans un store.

    Et pour simplifier les appels firestore, j'ai chargé le 1er niveau puis chaque niveau suivant sera chargé dynamiquement à la première ouverture du noeud.

    Merci de ton aide en tout cas.

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

Discussions similaires

  1. KML : parcourir la "collection" des placemarks d'une couche
    Par saxrub dans le forum IGN API Géoportail
    Réponses: 2
    Dernier message: 04/01/2013, 21h55
  2. [AC-2003] Parcourir la collection Controls dans l'orde des tabIndex ?
    Par marot_r dans le forum IHM
    Réponses: 6
    Dernier message: 15/04/2009, 15h16
  3. Réponses: 5
    Dernier message: 04/10/2004, 18h20
  4. importer des procédures stockées
    Par mohamed dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/09/2004, 16h30
  5. Export des fonctions stockées
    Par bob_doulz dans le forum Oracle
    Réponses: 5
    Dernier message: 20/07/2004, 11h18

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