2016-04-15 17 views
18

私はusersのインデックス付きリストを(配列ではなく)JSオブジェクトに持っています。それは、リアクト州の一部です。 IDを持つ(4)キーとして React状態のオブジェクトを更新する方法

  • は、ID 2でユーザーを削除{ "ジェーン":名前は、4 ID}

    1. 新しいユーザーを追加します。

      { 
          1: { id: 1, name: "John" } 
          2: { id: 2, name: "Jim" } 
          3: { id: 3, name: "James" } 
      } 
      

      へのベストプラクティスは何ですか

    2. 任意の不変のヘルパーなし "ピーター"

    に変更し、ユーザ#2の名前を。私はCoffeescriptとUnderscoreを使用しています(だから_.extendは大丈夫です...)。

    ありがとうございました。

  • 答えて

    9

    これは私が

    • アドオンどうなるのかです:あなたは、あなたにフラックスを使用していない場合var newUsers = _.extend({}, users)その後、newUsers['2'].name = 'Peter'
    +1

    を格納するためMapを使用することができます。 extendを使用して新しいオブジェクトを作成した後、変更します。 –

    +1

    私は同意しますが、 "変更"の場合は、変更されたユーザーのオブジェクトも次のようにコピーする必要があります:var newUser = _.extend({}、users ['2']、{name: 'Peter'}); var newUsers = _.extend({}、ユーザー、{2:newUser}); –

    +0

    @ pierrepinard_2良い点は、個々のユーザーを示すコンポーネントのshouldComponentUpdateをより良くすることです。 – kavun

    5

    var newUsers = _.extend({}, users, { 4: { id: 4, ... } })

  • 削除:var newUsers = _.extend({}, users)その後、delete newUsers['2']
  • 変更をthis.setState()を使用して状態オブジェクトを更新します。

    delUser(id) { 
        const users = this.state.users; 
        delete users[id]; 
        this.setState(users); 
    } 
    
    addChangeUser(id, name) { 
        const users = this.state.users; 
        users[id] = {id: id, name: name}; 
        this.setState(users); 
    } 
    

    次に、あなたはこれでテストケースを実行することができます。

    addChangeUser(4, 'Jane); 
    addChangeUser(2, 'Peter'); 
    delUser(2); 
    
  • +0

    'addUser'メソッドはOPで指定されたキー '4'を持つオブジェクトを追加するのではなく、キー' id'でオブジェクトを更新します。 'changeName'にも同じ問題があります。 –

    +0

    あなたは正しいです。私が思うよりも速くタイプしたと思う。私は答えを更新しました。それを指摘してくれてありがとう。 –

    +2

    ES2015(ES6)を使用している場合は、これを行うことができます。setState({[id]:{...}); '。 –

    0

    setStateはまた、あなたがこれらの機能は、お使いのstateオブジェクトと仮定し、より直感的

    function add(user) { 
        this.setState(users => { 
        users[ user.id ] = user 
        return users 
        } 
    } 
    
    function remove(id) { 
        this.setState(users => { 
        delete users[ id ] 
        return users 
    } 
    

    を見つけるかもしれない機能を、受け入れusersオブジェクトです(実際には)。の場合、usersを選択する必要があります。setStateに関数を渡すと、実際のstateオブジェクトを渡すと常に呼び出されます。

    この例では、addを使用して、実際の使用状況に応じて別のヘルパーを作成することもできます。

    2

    別に_.extendから、あなたはこれが正しい答えであるuser

    let user = new Map(); 
    user.set(4, { id: 4, name: "Jane" }); //adds with id (4) as key 
    user.myMap.set(2, { id: 2, name: "Peter" }); // set user #2 to "Peter" 
    user.delete(3); //deletes user with id 3 
    
    関連する問題