2016-08-18 2 views
5

So habe ich eine React.js-Komponente, und ich möchte ein Objekt durchlaufen, das ich importieren, um HTML-Optionen hinzuzufügen. Hier ist, was ich versucht, die beide hässlich ist und funktioniert nicht:Wie Objekt in JSX mit React.js durchlaufen

import React from 'react'; 
import AccountTypes from '../data/AccountType'; 

const AccountTypeSelect = (props) => { 
    return (
    <select id={props.id} className = {props.classString} style={props.styleObject}> 
     <option value="nothingSelected" defaultValue>--Select--</option> 
     { 
      $.each(AccountTypes, function(index) { 
       <option val={this.id}>this.name</option> 
      }) 
     } 
    </select> 
); 
}; 

export default AccountTypeSelect; 

ich diesen Fehler empfangen in der Konsole aus dem obigen Code:

invariant.js 4599: 38 - Uncaught unveränderliche Verletzung?: Objekte sind nicht als React-Kind gültig (gefunden: Objekt mit Schlüsseln {ID, Name, aktiviert, Zusatzinfo}). 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 AccountTypeSelect.

Muss ich wirklich jedes Objekt in ein Array konvertieren oder es mit createFragment umhüllen, um es zu verwenden? Was ist die beste Vorgehensweise für diesen Fall?

Antwort

6

Statt $.each Verwendung map:

{AccountTypes.map(function(a) { 
    return (
     <option key={a.id} val={a.id}>{a.name}</option> 
    ); 
})} 
+1

Was mit dem Schlüsselattribut ist - warum muß ich das verwenden? Es scheint seltsam, dass ich ein scheinbar willkürliches Attribut hinzufügen muss, wenn alles, was ich tun möchte, in ein einfaches Options-Tag gesetzt wird. – Tylerlee12

+0

Das Schlüsselattribut wird hier unter "Reconciliation" beschrieben: https://facebook.github.io/react/docs/multiple-components.html. Aber im Grunde ist es wichtig sicherzustellen, dass das DOM korrekt aktualisiert wird, wenn Ihre Kindelemente dynamisch generiert werden (eine schwache Erklärung, ich weiß, aber ich möchte die reaktiven Dokumente nicht in einem Kommentar wiederholen). Meine Verwendung einer Schleifenvariable war in dieser Hinsicht eine schlechte Form, daher habe ich die Antwort aktualisiert. Es tut uns leid! – Kevin

0

Sie sollten Karte Schleife verwenden:

{AccountTypes.map((accountType) => 
    <option value={accountType.id}>{accountType.name}</option>)} 
0

für eine Liste von Kindern zu machen, müssen Sie key Attribut für jedes Kind hinzufügen, so reagiert machen sie richtig. Versuchen Sie Folgendes:

Mit JQuery Karte (gut für die funktionale Programmierung)

{ 
     $.map(AccountTypes, function(type,index) { 
      return <option key={type.id} val={type.id}>type.name</option> 
     }) 
    } 

Mit normaler Karte:

{AccountTypes.map((type) => { 
    return <option key={type.id} 
        val={type.id}> 
      {type.name} 
      </option> 
)} 
+0

Ich würde vorschlagen, eine Art Präfix im Schlüsselwert zu verwenden, um doppelte Schlüssel und die entsprechenden Warnungen und Fehler zu vermeiden, wenn Sie mehr als eine Sammlung rendern. – Carlos

+0

Das erste Beispiel funktioniert nicht, da '$ .each' nichts zurückgibt (oder zumindest nicht das Richtige). –

+0

Was der Callback zurückgibt, spielt keine Rolle. '$ .each' ist hier einfach die falsche Methode. Siehe die Dokumentation: https://api.jquery.com/jquery.each/. –

Verwandte Themen