2017-01-17 6 views
11

誰かがこのエラーを修正する方法を説明してもらえキーが反応警告:flattenChildren(...):と2人の子供があったのと同じ

警告:flattenChildren(...):同じと2人の子供が発生しました キー

私は以下の私のコードを複製しているが、何らかの理由でCodePenは、エラーが表示されません。第二の問題として

var FilterOptions = React.createClass({ 
changeOption: function(type, e) { 
var val = e.target.value; 
this.props.changeOption(val, type); 
}, 

render: function() { 

return (
    <div className="filter-options"> 
    <div className="filter-option"> 
     <select id="product" name="Product" value={this.props.product} onChange={this.changeOption.bind(this, 'product')}> 
     <option value=''>Product</option> 
     {this.props.productOptions.map(function(option) { 
     return (<option key={option} value={option}>{option}</option>) 
     })} 
     </select> 
    </div> 
    </div> 
); 
} 
}); 

Codepen

、私は私のリセットが選択ボックスの値をリセットすることになっているが、これも動作していないし、ちょうどレンダリング結果をリセットしてかなり確信している - この場合はわかりません最初の問題に関連していますか?

任意のヘルプははるかにこれを固定値としてインデックスを追加

+0

'this.props.productOptions'には一意の値がありますか?もしそうなら、あなたはこのコードがエラーを出しているのではなく、他のどこかではないと確信していますか? –

+0

@MartinMazzaDawsonいいえ、すべての選択メニューに重複した値があります - 正確なエラーはすべてこのようです - bundle.js:9899警告:flattenChildren(...):同じキーを持つ2人の子供、 '1:$ prod3 '。子キーは一意でなければなりません。 2人の子供がキーを共有する場合、最初の子供だけが使用されます。 –

+2

'key'を' option'の代わりにインデックス値に変更すると、エラーはなくなりますか? – azium

答えて

5

を理解します。あなたのsugegstionのおかげで@アジウム。

<select id="product" name="Product" value={this.props.product} onChange={this.changeOption.bind(this, 'product')}> 
     <option value=''>Product</option> 
     {this.props.productOptions.map(function(option, value) { 
     return (<option key={value} value={option}>{option}</option>) 
     })} 
     </select> 
+0

それは動作し、あなたは私の日を救った! –

+0

ありがとう、私の一日を保存した –

14

インデックスをキーとして使用することはお勧めできません。 ReactがDOM要素を識別するために使用するのは、キーだけです。アイテムをリストにプッシュするか、途中で何かを削除するとどうなりますか?キーが以前と同じである場合Reactは、DOM要素が以前と同じコンポーネントを表すことを前提としています。しかしそれはもはや真実ではありません。送信元:https://medium.com/@robinpokorny/index-as-a-key-is-an-anti-pattern-e0349aece318

キーとしてマッピングする各アイテムの一意の文字列を使用する方がはるかに優れています。 <option key={value.id}>のようなもの、またはキーが存在しない場合は、<option key={value.name + value.description}>のようなものを実行して一意の識別子を作成します。

+0

Arrgしかし、何も小道具のオブジェクトにユニークなものがない場合はどうしますか?私の場合、5つのチェックボックスがある行があります。チェックボックスは配列の各エントリに対して生成されます。しかし、それらに固有のものはありません.... – Kokodoko

+0

@Kokodokoベストこの場合は不変のデータを使用する(または少なくともチェックボックスを体系的に変更しないようにしてください)、オブジェクトのハッシュをキーとして使用します。これは、ポイントやチェックボックスなどのオブジェクトを区別して一意のキーを作成する唯一の方法です。 –

関連する問題