2016-08-18 8 views
5

React.jsコンポーネントがあり、HTMLオプションを追加するためにインポートするオブジェクトをループしたいと思います。ここでは醜いの両方で、動作しない、私が試したものです:React.jsを使用してJSXでオブジェクトをループする方法

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; 

私は上記のコードからコンソールにこのエラーを受け取っ:

invariant.js 4599:38 - キャッチされない不変違反?:オブジェクトはReactの子としては無効です(found:キー{id、name、enabled、additionalInfo}のオブジェクト)。子コレクションをレンダリングする場合は、代わりに配列を使用するか、ReactアドオンのcreateFragment(オブジェクト)を使用してオブジェクトをラップします。レンダリング方法がAccountTypeSelectであることを確認します。

実際には、各オブジェクトを配列に変換するか、createFragmentでラップして使用する必要がありますか?この場合のベストプラクティスは何ですか?

答えて

6

代わりの$.each使用map

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

キー属性とは何ですか - なぜ私はそれを使用する必要がありますか?私がやりたいことが単純なオプションタグの中に置かれているときには、一見恣意的な属性を追加する必要があるのは間違いです。 – Tylerlee12

+0

ここでは、「調整」のキー属性について説明します。https://facebook.github.io/react/docs/multiple-components.htmlしかし、基本的には、子要素が動的に生成されたときに、反応が正しくDOMを更新するようにすることです(弱い説明、私は知っていますが、コメント内の反応文書を繰り返す必要はありません)。その点で私のループ変数の使用は貧弱な形だったので、私は答えを更新しました。ごめんなさい! – Kevin

0

あなたがループにマップを使用する必要があります。子供たちのリストをレンダリングするための

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

は、あなたはとてもレンダリングしますリアクトそれぞれの子供のためのkey属性を追加する必要がありますこれを正しく実行してください。

JQueryマップ(関数プログラミングに適しています)

01法線マップで
{ 
     $.map(AccountTypes, function(type,index) { 
      return <option key={type.id} val={type.id}>type.name</option> 
     }) 
    } 

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

複数のコレクションをレンダリングする場合は、重複するキーや対応する警告とエラーを避けるために、キー値にある種の接頭辞を使用することをお勧めします。 – Carlos

+0

'$ .each'は何も返しません(少なくとも正しいものは返しません)ので、最初の例はうまくいきません。 –

+0

コールバックが返すものは問題ではありません。 '$ .each'はここで使う方法が間違っています。 docs:https://api.jquery.com/jquery.each/を参照してください。 –

関連する問題