2016-10-10 6 views
14

Neu zu Reagieren und zu versuchen, Objektattribute zu loopen, aber Reaction beschwert sich über Objekte, die nicht gültig sind. Reaction children, kann mir bitte jemand einen Rat geben, wie man dieses Problem löst? Ich habe createFragment hinzugefügt, bin mir aber nicht ganz sicher, wohin das gehen soll oder welchen Ansatz ich wählen sollte?Wie schleift man ein Objekt in React?

JS

var tifs = {1: 'Joe', 2: 'Jane'}; 
var tifOptions = Object.keys(tifs).forEach(function(key) { 
    return <option value={key}>{tifs[key]}</option> 
}); 

Render-Funktion

render() { 
     const model = this.props.model; 

     let tifOptions = {}; 

     if(model.get('tifs')) { 
      tifOptions = Object.keys(this.props.model.get('tifs')).forEach(function(key) { 
       return <option value={key}>{this.props.model.get('tifs')[key]}</option> 
      }); 
     } 

     return (
      <div class={cellClasses}> 

        <div class="grid__col-5 text--center grid__col--bleed"> 
         <h5 class="flush text--uppercase">TIF</h5> 
         <select id="tif" name="tif" onChange={this.handleChange}> 
          {tifOptions} 
         </select> 
        </div> 

      </div> 
     ); 
    } 

Fehler in der Konsole

If you meant to render a collection of children, use an array instead or wrap the object using createFragment(object) 
+0

Ich habe einen ähnlichen Fehler wie diese zuvor. Die Verwendung von '.map() 'war seltsamerweise die Lösung für mich. Das war auch interessant: http://StackOverflow.com/Questions/37997893/Promise-error-Objects-are-not-valid-as-a-react-child –

Antwort

33

Das Problem ist die Art und Weise Sie forEach() verwenden, wie es wird ALW ays zurück undefined. Sie suchen wahrscheinlich für die map() Methode, die ein neues Array zurück:

var tifOptions = Object.keys(tifs).map(function(key) { 
    return <option value={key}>{tifs[key]}</option> 
}); 

Wenn Sie noch forEach() verwenden möchten, würden Sie haben, so etwas zu tun:

var tifOptions = []; 

Object.keys(tifs).forEach(function(key) { 
    tifOptions.push(<option value={key}>{tifs[key]}</option>); 
}); 

-Update :

:

Wenn Sie ES6 schreiben, können Sie die gleiche Sache etwas sauberere mit einem arrow function erreichen

const tifOptions = Object.keys(tifs).map(key => 
    <option value={key}>{tifs[key]}</option> 
) 

Hier ist eine Geige zeigt alle oben genannten Optionen: https://jsfiddle.net/fs7sagep/

+1

Hmm, mit einer dieser noch Flags die React Fehlerinvariante. js: 38 Nicht abgefangene invariante Verletzung: Objekte sind nicht als reagierendes Kind (gefunden: Objekt mit Schlüsseln {}) gültig. Wenn Sie eine Sammlung von untergeordneten Elementen rendern möchten, verwenden Sie stattdessen ein Array oder wickeln Sie das Objekt mithilfe von createFragment (Objekt) aus den React-Add-Ons um. Überprüfen Sie die Rendermethode 'Konstruktor'. – styler

+0

Machst du es so: https://jsfiddle.net/0fgv16dt/? – tobiasandersen

+0

Ah! Mein Problem war, dass ich model.get ('tifs') in Object.keys() übergeben habe und das wurde gemocht !!! Vielen Dank! – styler

-2

ich sehr empfehlen Sie ein Array zu verwenden, anstatt eines Objekts, wenn Sie tun, reagieren itteration, ist dies eine Syntax ich es ofen verwenden.

const rooms = this.state.array.map((e, i) =>(<div key={i}>{e}</div>)) 

Um das Element zu verwenden, nur {rooms} in Ihrem jsx platzieren.

Wobei e = Elemente der Arrays und i = Index des Elements. Lesen Sie mehr here. Wenn Sie nach Iteration suchen, ist dies der Weg, es zu tun.

+0

Wenn Sie ein Objekt verwenden, sind die Schlüssel oft IDs und nicht Indizes. Wenn jedoch die Schlüssel alle Indizes sind, stimme ich Ihnen zu. – tobiasandersen

+0

Ich freue mich über Ihren Kommentar, aber ich spreche nicht über ein Objekt. Arbeiten mit Array scheint das Beste für mich und es ist auch gut von den Dokumenten zur Verfügung gestellt. Schlüssel sind nicht notwendig, sie sollen die Reihenfolge Ihrer Elemente beibehalten. Ich habe die Indexmethode für Schlüssel nicht erfunden, diese ist in der Dokumentation geschrieben: P – alex1997

+0

Arrays sind nicht immer die beste Wahl, auch wenn sie oft sind.Wenn ich Sachen zwischenspeichern möchte, wende ich mich normalerweise zu Map: s oder Objekten. Und während React Schlüssel basierend auf Indizes hinzufügt, wenn Sie sie nicht explizit bereitstellen, gibt es definitiv Anwendungsfälle dafür. – tobiasandersen

Verwandte Themen