1
votes

Rendu du composant React à l'aide des données Firestore

J'essaye de rendre mon composant Guild avec les données de Firestore. Je mets les données de Firestore dans mon état sous forme de tableau, puis lorsque j'appelle le composant et que j'essaye de le rendre, rien ne s'affiche. Je veux croire que je fais quelque chose de très mal ici (je n'ai pas travaillé avec React depuis très longtemps), mais je ne reçois aucune erreur ou avertissement, donc je ne suis pas sûr de ce qui se passe exactement.

guildInfo() {
Fire.firestore().collection('guilds')
  .get().then(snapshot => {
    snapshot.forEach(doc => {
      this.setState({
        guilds: [{
          id: doc.id,
          guildDesc: doc.data().guildDesc,
          guildFaction: doc.data().guildFaction,
          guildName: doc.data().guildName,
          guildRegion: doc.data().guildRegion,
          guildServer: doc.data().guildServer
        }]
      })
      console.log(doc.data().guildName)
    })
  })
}

Fonction de rendu

renderCards() {
var guildComp = this.state.guilds.map(guild => {
  console.log(guild)
  return <Guilds
          key={guild.id}
          guildFaction={guild.guildFaction} 
          guildServer={guild.guildServer}
          guildName={guild.guildName} 
          guildDesc={guild.guildDesc} />
 })
return <CardDeck>{guildComp}</CardDeck>
}
Récupération des données Firestore
<Col>
    <Card>
      <CardBody>
        <CardTitle className={this.props.guildFaction}>{this.props.guildName}</CardTitle>
        <CardSubtitle>{this.props.guildServer}</CardSubtitle>
        <CardText>{this.props.guildDesc}</CardText>
      </CardBody>
    </Card>
  </Col>

MISE À JOUR: résolu, le correctif est dans la fonction de rendu.


10 commentaires

Pouvez-vous partager votre code pour récupérer les données de Fire Store et peut-être un journal de la console de la réponse?


@WilliamChou désolé j'ai écrit ce post rapidement, continuez à trouver des choses qui me manquent. c'est trop long pour poster ici apparemment donc je dois le poster dans un pastebin. MODIFIER: pastebin.com/Lw4XGNJ4


Le code atteint-il parfois l'intérieur du puis ? Si tel est le cas, y a-t-il des données dans l ' snapshot ? console.log () imprime-t-il quelque chose?


@FrankvanPuffelen Oui, il imprime les 2 seules colonnes de la base de données. Je peux obtenir les données, je ne peux tout simplement pas obtenir le rendu du composant de guilde


Ah ok. Si l'appel à setState () se produit avec les bonnes données de la base de données, j'ai bien peur de ne pas être la meilleure personne pour vous aider.


où appelez-vous votre fonction guildInfo ()? Vous devez vous assurer que les données sont renvoyées avant de pouvoir les utiliser, il peut s'agir d'un problème asynchrone


@gianni, il est appelé dans componentdidmount, je pensais que c'était un problème asynchrone mais il est appelé, je pense que je ne rend pas correctement les données.


ok, essayez de retourner null avant le contenu, si this.state.guilds n'est pas disponible: if (! guilds) {return null}


@gianni si vous regardez la fonction de rendu mise à jour dans mon message d'origine, le console.log renvoie 2 objets, qui sont les 2 documents de ma base de données qui ont été appelés et stockés localement. peut-être qu'il y a une faute de frappe quelque part? je pense que tout cela devrait fonctionner.


d'accord, j'écris une réponse pour un morceau de code que vous pouvez essayer ...


4 Réponses :


0
votes

Eh bien, vous utilisez des "guildes" d'état mais vous mettez à jour des "posts" d'état ou je rate quelque chose?


1 commentaires

ouais c'était une faute de frappe de ma part, j'ai corrigé ça mais ça ne marche toujours pas.



0
votes

Je vois peu de choses ici:

  1. votre composant est Guild.js , mais vous effectuez le rendu
  2. Vous définissez l'état sur posts , mais vous utilisez this.state.guilds pour afficher les composants
  3. Vous remplacez chaque fois cet état par le dernier objet de l'instantané, avec la façon dont vous mappez les données Firestore
  4. vous définissez mal les identifiants de la liste en utilisant doc.id au lieu de doc.data().id
  5. Vous ne mappez pas les guildes au rendu. guilds est un tableau d'objets de guilde, vous devriez donc faire quelque chose comme guilds.map (guild => {return }

Voici quelques problèmes à corriger, puis essayez de console.log (this.state.guilds) avant le rendu et voyez si vous obtenez les bonnes données


1 commentaires

# 1: Typo, c'est en fait Guilds.js dans le code source // # 2: Aussi une faute de frappe, corrigé ça, rien n'a changé. // # 3: J'ai 2 documents dans Firestore, ils sont tous deux stockés correctement lorsqu'ils sont appelés. // # 4: J'utilise doc.id au lieu de doc.data (). Id car l'id est l'id du document, pas un id stocké dans le document. // # 5: J'ai essayé de l'écrire comme guilds.map (guild => {return }), et rien ne se passe. Je peux me tromper étant donné que cela ne rend même rien du tout, mais cela fonctionne dans console.log



0
votes

Je pense que votre problème est que parce que setState est asynchrone, au moment où il définit réellement l'état, doc n'est plus défini. Essayez d'abord de créer le tableau, puis appelez setState en dehors de la boucle, c'est-à-dire:

guildInfo() {
Fire.firestore().collection('guilds')
  .get().then(snapshot => {
     let guilds = []
     snapshot.forEach(doc => {
       guilds.push({
          id: doc.id,
          guildDesc: doc.data().guildDesc,
          guildFaction: doc.data().guildFaction,
          guildName: doc.data().guildName,
          guildRegion: doc.data().guildRegion,
          guildServer: doc.data().guildServer
       });
     })
     this.setState({guilds});
  })
}


1 commentaires

J'ai essayé de faire cette modification, rien n'a changé. Je reçois toujours les données et aucun composant ne rend. Je pense qu'il y a quelque chose qui ne va pas dans la fonction de rendu. Je commence à penser que return ne fonctionne pas.



0
votes

Essayez d'utiliser une fonction de carte, et dans la fonction de rappel de setState, essayez de consigner votre état après la mise à jour:

guildInfo() {
  Fire.firestore().collection('guilds')
    .get()
    .then(snapshot => {
       const guilds = snapshot.map(doc => {
         return {
            id: doc.id,
            guildDesc: doc.data().guildDesc,
            guildFaction: doc.data().guildFaction,
            guildName: doc.data().guildName,
            guildRegion: doc.data().guildRegion,
            guildServer: doc.data().guildServer
         };
       this.setState({guilds}, () => console.log(this.state))
      })
    })     
  })
}

Si dans le journal de la console il y a un peu [i ] près de votre état, cela signifie que l'état n'est pas prêt, et donc c'est un problème asynchrone. Le remplacement de forEach par la fonction map peut cependant déjà aider.


0 commentaires