2017-04-26 3 views
3

を削除した後、私は名前と状態でそのスコアを持つ学生のオブジェクトの単純なリストを持っている間違ったデータをレンダリングリストを反応します。はアイテム

彼らの名前は<b>{student.name}</b>にバインドされていると私は

セット状態を呼び出すことで、このリストと 再レンダリングコンポーネントからの最初の学生を削除するこれまでの時に自分のスコアは

<input type="text" defaultValue={student.score}/> 

にバインドされています2番目の生徒の入力タグは、1番目の生徒のスコアを示しています。なぜ私はそれが間違っているのか起こっているのですか?ここ

は私のコードは、あなたの代わりに、学生に固有の値のkey={index}を使用しているためですhere is mycode in jsbin

class App extends React.Component{ 
    constructor(){ 
    super(); 
    this.state ={ 
     students:[{name:"A",score:10},{name:"B",score:20},{name:"C",score:30}] 
    } 
    } 

    onDelete(index){ 
    this.state.students.splice(index,1); 
    this.setState(this.state); 
    } 

    render(){ 
    return(
     <div> 
     {this.state.students.map((student,index)=>{ 
       return(
       <div key={index}> 
        <b>{student.name}</b> - <input type="text" defaultValue={student.score}/> 
        <button onClick={this.onDelete.bind(this,index)}>delete</button> 
       </div>     
      ) 
     })} 
     </div> 
    ) 
    } 
} 


ReactDOM.render(<App/>,document.getElementById("main")); 

答えて

2

です。配列は、間違ったキーを持っているし、更新されたデータを再度レンダリングするキーの変更を登録しません反応する削除インデックスの後の学生を変更された

代わりに...

<div key={student.name}> 

student.nameが一意であると仮定して、このようなものを使用する必要があります。

+0

どうもありがとう下記のようなv4の機能を呼び出すことによってuique IDを生成するためにそれを使用し、その後

import { v4 } from 'uuid'; //there are 5 versions. You can use any. 

以下のように使用することができます。しかし、なぜinput type = "text"以外のタグでも動作しますか? – manas

+0

'input'(つまり' span')や他の入力タイプ以外のタグはありますか? –

+1

'defaultValue'は変更されても更新されません。要素をゴミ箱に移動して再生成する必要があります(つまり、' key'を変更する必要があります)。 'value'を使用した場合はうまくいくかもしれませんが、' onChange'ハンドラを指定しない限り、読み込み専用の入力しか持たないでしょう。 –

1

代わりに、インデックスのキーとして一意のIDを使用するのが無難です。あなたのJSONが一意のIDを提供しない場合、それを生成するuuid npmモジュールのようなものを使うことができます。これはリンクhttps://www.npmjs.com/package/uuidです。

あなたはそれをインポートして、

id={v4()} 
+0

APIで提供されていないときに一意のIDを生成することは良い考えですが、レンダリングする前に行う必要があります。あなたがあなたの答えに示唆しているようにレンダリング中にそれを行うなら、あなたは本質的に何度も何度も何度も作り直されているので、いつも更新があり、あなたは新しいIDを取得します。これにより不必要なレンダリングが発生し、入力フィールドがある場合は、すべての文字入力にフォーカスが失われます。 – earthling

+0

私はIDを生成するつもりだった、キャッチするためにありがとう。私の答えを編集しました。 – uiguy89