2016-08-24 10 views
1

Reactアプリケーションでreact-addons-update npmパッケージを使用しています。具体的には、オブジェクトの配列内に新しいオブジェクトを挿入するためにupdate()メソッドを使用します。 私は私のコンポーネントの状態の一部として、このような構造を持っている:react-addons-update - オブジェクトの配列内にオブジェクトを挿入する方法は?

... 
constructor(props) { 
    super(props); 
    this.state = { 
     blocks: [ 
      { 
       block_title: "some title", 
       items: [ 
        { 
         item_title: "foo" 
        }, 
        { 
         item_title: "bar" 
        } 
       ] 
      }, 
      { 
       ... 
      } 
     ] 
    }; 
} 
... 

と私は最初と2番目の項目の間、items配列に新しい項目を挿入します。 (エラーがいずれかのスローされませんされている)

... 
insertItem(){ 
    let obj = { 
     item_title: "in between foo and bar" 
    }; 
    this.setState({ 
     blocks: update(this.state.blocks, { 
      [0]: { 
       items: {$splice: [[1, 0, obj]]} 
      } 
     }) 
    }); 
} 
... 

をが、これは動作していないようです:

私はこれを試してみました。何か案は?

p.s.私はMeteorアプリケーション内でReactを使用しています。このヘルパー関数が動作しないようにするためのいくつかの特長があります。

+0

更新方法は何ですか?以下のような解決策として

、私はSETSTATEコールバックオプションを使用しましたかブロックは 'Immutable.List'ですか?もしそうなら、あなたは 'updateIn'を使う必要があると思います。配列を' updateIn'メソッドに渡す前に別々に再構成する必要があります。 – RocketGuy3

+0

update()メソッドは、react-addons-update npmパッケージのヘルパー関数です。 – JoeTidee

+1

はあなたのコードがうまくいくように見えます。更新とは異なる何かに関連する可能性がありますか?更新機能をログに記録する場合、結果は何ですか? –

答えて

0

コンポーネント内の他のメソッドは表示されませんが、追加したアイテムのレンダリング要素のキーの小道具が存在し、一意であることを確認してください。

+0

私は、更新が行われた後に 'ブロック'の状態を出力するためにconsole.logを使用しているので、キーはこの場合関連しない.. – JoeTidee

+1

あなたのconsole.logはcomponentDidUpdateにありますか? setStateは状態を非同期に更新するため、setStateの直後に状態が更新されないことがあります。 – goldbullet

0

goldbulletのコメントによると、setStateはコンポーネントの状態を非同期的に更新します。コードブロック内のsetStateに続いて実行されたプロセスが、コンポーネントが更新される前にコンポーネントの状態を実際に取得していたことがわかりました。したがって、元の質問の上記の構文は、オブジェクトの配列の深いところにオブジェクトを挿入するのに適しています。これはまた、この記事で言及された

... 
insertItem(){ 
    let obj = { 
     item_title: "in between foo and bar" 
    }; 
    this.setState({ 
     blocks: update(this.state.blocks, { 
      [0]: { 
       items: {$splice: [[1, 0, obj]]} 
      } 
     }) 
    },function(){ 
     // DO SOMETHING HERE!! 
    }); 
} 
... 

Why calling react setState method doesn't mutate the state immediately?

関連する問題