2017-10-04 1 views
0

Hallo, ich versuche map meine Daten, die ich von meinem Firebase, in eine Reihe von Karten fechtete. Aber da ich den Zustand in meiner constructor definiert habe, wird eine Karte mit keinen Werten am Anfang zurückgegeben. Was kann ich tun, um die Rückgabe dieser ersten leeren Kartenkomponente zu vermeiden? Danke im Voraus.
(die Karte Komponente ist eine Komponente mit einem Thumbnail, die ich importiert)Warum wird mein Zustand in ReactJS zu oft gemappt?

class List extends Component { 
     constructor(props){ 
     super(props) 

     this.db = firebase.database().ref().child('app').child('cards'); 

     this.state = { 
      cards: [ 
       { 
       id: "", 
       cardDesc: "", 
       cardPrice: "", 
       cardHeading: "", 
       } 
      ] 
      } 
     } 

     componentWillMount(){ 
     const previousCards = this.state.cards 

     this.db.on('child_added', snap => { 
      previousCards.push ({ 
      id: snap.key, 
      cardDesc: snap.val().cardDesc, 
      cardPrice: snap.val().cardPrice, 
      cardHeading: snap.val().cardHeading, 
      }) 
      this.setState ({ 
      cards: previousCards 
      }) 
     }) 
     } 

     render(){ 
     return(
      <div className='list'> 
      <Row> 
      { this.state.cards.map((card) => { 
      return(<Card cardHeading={card.cardHeading} cardDesc={card.cardDesc} 
       cardPrice={card.cardPrice} key={card.id} />) 
       }) 
      } 
      </Row> 
      </div> 
     ) 
     } 
    } 

    export default List 

Antwort

0

Sie können nur Ihre Ersteinrichtung für den Staat entfernen und Ihre Methode

Danke zu sagen, machen ändern
this.state.cards && this.state.cards.(your stuff) 
+0

Sie meinen, dass ich meinen Zustand in den Konstruktor legte und die Rückgabefunktion so betrieb? 'return (

{ this.state.cards && this.state.cards.map((card) => { return() }) }
' – HarryTgerman

+0

Ja, wenn Sie Sie nicht die leere Karte sehen keinen ursprünglichen Zustand haben, und wenn Sie auf das Vorhandensein überprüfen von 'state.cards' in Ihrer Methode machen, kein' 'Komponenten werden angezeigt, bis sich der Status ändert Ihr Status wird sich ändern, wenn der' db'-Aufruf abgeschlossen ist, was zu einem 're-render' führt, den Null-Test auf' card' übergibt und Ihr zugeordnetes 'cards' Array rendert . – dougajmcdonald

1

Es gibt keinen Weg, um die Berufung einer Render-Methode zu verzögern, bis die Daten zurückkommt, so können Sie entweder überprüfen, ob cards.length < 1 und nichts anzeigen oder einen Ladebildschirm anzeigen, bis diese Daten zurückkommen.

+0

für die Beantwortung meiner Frage, aber ich denke, Sie es falsch verstanden. Ich möchte nichts verzögern, ich möchte alle Daten von meinem Firebase zurückgeben. Aber mit dieser 'previousCards' Methode gibt es die erste Karte leer zurück und dann gibt sie die Karten mit den Daten zurück. Ich bin totaler Anfänger, ich bin dankbar für jede Beratung. – HarryTgerman

+0

Die erste Karte wird leer zurückgegeben, da Ihr Kartenarray leer ist, wenn die Komponente zum ersten Mal gerendert wird. Wenn Sie innerhalb von componentWillMount Ihre Firebaseanforderung stellen, wartet die Komponente nicht auf das Zurückkommen der Daten, sondern auf die Anforderung Komponente und wenn Daten zurückkommen, wird der Callback innerhalb der Anfrage ausgeführt und aktualisiert den Zustand, der ein erneutes Rendern verursacht und jetzt wird Ihre Karte sichtbar – linasmnew

Verwandte Themen