2015-09-18 29 views
9

私はReactの簡単な練習アプリケーションを開発中です。私は、配列内のオブジェクトとしてユーザーを格納するメインコンポーネント、各ユーザーの情報をレンダリングするuserViewコンポーネント、すべてのuserViewをレンダリングするuserListコンポーネント、サブミット時にメインコンポーネントに新しいユーザーを追加するaddUserコンポーネントの4つのコンポーネントがあります。リスト内の項目の追加と編集は正しく機能します。しかし、私は削除の問題に遭遇しています。各リスト項目には、その要素を削除するはずの独自の削除ボタンがありますが、どの削除ボタンを使用しても、リストの最後の要素は削除されます。スプライスを使用しているメインのユーザーを含む配列から削除しています。削除ボタンを押したときにスプライスに正しいインデックスが渡されていることを確認しました。React - リストの途中から削除すると、代わりに最後の要素が削除されます

これは、仮想DOMが再表示されるときにコンポーネントのキーと関係があると思いますが、いくつかの異なるメソッド(component.id、グローバルカウンタ変数、インデックス内のインデックス)運がなかった。ここでは、コードの関連部分(私は簡潔にするために、可能なアウト限りを残してきた)です:

var Main = React.createClass({ 
    getInitialState: function(){ 
    return { 
     allUsers: [] 
    } 
    }, 
    removeUser: function(index){ 
    console.log('index to remove at: ', index); //Gives correct index 
    var newUsersArray = this.state.allUsers.slice(); 
    newUsersArray.splice(index, 1); 
    this.setState({ 
     allUsers: newUsersArray 
    }); 
    }, 
    render: function(){ 
    return (
     <div> 
     <AddUser addNew={this.addUser} index={this.state.allUsers.length} /> 
     <UserList users={this.state.allUsers} edit={this.editUser} remove={this.removeUser} /> 
     </div> 
) 
    } 
}) 

    var UserList = React.createClass({ 
    render: function(){ 
     var users = this.props.users; 
     var edit = this.props.edit; 
     var remove = this.props.remove; 
     return (
     <div> 
     {users.map(function(user){ 
      return <UserView userName={user.name} userRoles={user.roles} editUser={edit} remove={remove} key={user.id} index={user.index}/> 
    })} 
     </div> 
    ); 
    } 
}); 

var UserView = React.createClass({ 
    handleDelete: function(){ 
    this.props.remove(this.props.index); 
}); 

私はかなり出て左には、ここにすべての私はバイオリンで、コードを反応させるのだ:http://jsfiddle.net/dpdbv731/。基本的に、userViewコンポーネントをクリックすると、そのコンポーネントのインデックスをパラメータとしてMainのremoveUser関数を呼び出します。誰かが私が間違っているのを見ることができますか?

答えて

13

UserView上のキーは定義されていません - ユーザーにはIDフィールドがありません。これにより、Reactは、配列インデックスをキーとして使用するようになります。ここで、2つの要素のリストで項目0を削除すると、左に1つの要素があり、キーには「0」があります。和解の間、Reactは、以前にキー "0"を持っていたのコンポーネントである小道具として渡された残りの要素を関連付けます。つまり、正しい配列要素が渡されますが、間違ったコンポーネントに関連付けられています。このコンポーネントには何らかの状態が含まれているため、間違った項目が削除されたように見えます。あなたの例では、インデックスはユーザーごとに一意であるため、key = {user.index}をUserViewに追加することで、この問題を解決できます。

関連する問題