2016-11-22 6 views
2

Ich habe den folgenden Code, um ein Listenelement mit Schlüssel- und Wertpaaren von einem Objekt zurückzugeben, das von der übergeordneten Komponente mithilfe der Requisiten übergeben wurde. Warum funktioniert es nicht?Zugriff auf einen reaktiven Child-Objektschlüssel und ein Wertpaar

Ich bekomme eine Fehlermeldung, die besagt: TypeError: Kann Property 'von' undefined nicht lesen (...) Der Fehler ist wegen des Aufrufs this.props.data in meiner Return-Anweisung. Es ist kein Problem, dass die Daten nicht über die Requisiten weitergegeben werden. Ich habe den reaktiven Ausgabebaum durchgesehen und mein Datenobjekt wurde tatsächlich dem Kind übergeben.

class Parent extends React.Component { 
    render(){ 
    return (
     <div> 
      {this.props.transactions.map(function(el,i) { 
      return <div key={i}> 
       <div> 
        {el.category} 
       </div> 
       <Child data={el.months}/> 
      </div>; 
      })} 
     </div> 
    ); 
    } 
} 
class Child extends React.Component { 
    render(){ 
    return (
     <ul> 
     {Object.keys(this.props.data).map(function(key,index) { 
      return <li key={index}>{this.props.data[key]}</li> 
     })}; 
     </ul> 
    ); 
    } 
} 

Hier sind die in der übergeordneten Komponente übergebenen Daten:

[{ 
    "category": "Bills", 
    "month": { 
    "feb": 9, 
    "mar": 169, 
    "apr": 10, 
    "may": 867, 
    "jun": 394, 
    "jul": 787, 
    "aug": 1112, 
    "sep": 232, 
    "oct": 222, 
    "nov": 306, 
    "dec": 1096 
    } 
}]; 
+0

Nicht was Sie fragen, aber Sie sollten Array-Index nicht als Schlüssel verwenden, insbesondere nicht, wenn das Array neu geordnet werden kann und Elemente hinzugefügt oder entfernt werden. Wenn "Kategorie" eindeutig ist, können Sie dies stattdessen als Schlüssel verwenden. – ArneHugo

Antwort

4

this innerhalb der map Funktion auf die Funktion bezieht NICHT die Komponente Instanz reagieren, so dass Sie übergeben müssen this explizit wie folgt:

(1) Im laufenden Betrieb:

{ 
    Object.keys(this.props.data).map(function(key,index) { 
    return <li key={index}>{this.props.data[index]}</li> 
    }, this) 
}; 

(2) In einem separaten Verfahren:

{ 
    Object.keys(this.props.data).map(this.listItems.bind(this)) 
}; 

und listItems Methode Ihrer Klasse hinzufügen:

listItems(key, index) { 
    return <li key={index}>{this.props.data[index]}</li> 
} 

+0

Korrekt, außer "this" würde sich nicht auf eine Klasse beziehen, sondern auf eine Instanz einer Klasse. Ich bevorzuge den weiteren Begriff "Instanz der Reaktionskomponente", weil nicht alle Reaktionskomponenten Klassen sind. (Ich habe versehentlich eine Bearbeitung Ihrer Antwort vorgeschlagen, wenn Sie diesen Kommentar von meinem Telefon hinzufügen möchten, es tut mir leid :-() – ArneHugo

+1

@ArneHugo Danke, habe es bereits bearbeitet. –

3

@Basim gab bereits die richtige Antwort. Wenn Sie ES6 verwenden, können Sie dies auch tun.

Verwandte Themen