React状態を変更する好ましい方法は何ですか?


97

中にプレーンオブジェクトのリストがあり、this.state.listそのリストを使用して子のリストをレンダリングするとします。オブジェクトを挿入する正しい方法は何this.state.listですか?

以下は、this.stateドキュメントで言及されているように直接変更できないため、私がそれが機能すると思う唯一の方法です。

this._list.push(newObject):
this.setState({list: this._list});

これは醜いようです。もっと良い方法はありますか?


ReactJSでの状態配列正しい変更の重複の可能性、マージを要求
Brigand

これらの答えはすべて、配列に要素を追加することに関するものです。しかし、そこから要素を削除するのはどうですか?または、単にアレイを完全に新しいものにリセットするには?
Augustin Riedinger、2016

回答:


165

concat 新しい配列を返すので、

this.setState({list: this.state.list.concat([newObject])});

別の選択肢は、Reactの不変性ヘルパーです。

  var newState = React.addons.update(this.state, {
      list : {
        $push : [newObject]
      }
  });

  this.setState(newState);

6
concatあなたがたいと思うので、配列をとりますthis.state.list.concat([newObject])
ソフィーアルパート2014年

@BenAlpertはChromeで動作しますが、これは非標準の動作です。
ヒープ2014年

6
@ヒープまあ、非配列を渡すと、配列にconcatラップされますが[[1,2], [3,4]]、明示的に配列を追加することをお勧めし[5,6]ます。次の要素として追加したい場合は、.concat([[5,6]])他の方法で行う必要がありますで終わり[[1,2], [3,4], 5, 6]ます。
ソフィーアルパート2014年

2
不変性ヘルパーの背後にあるアイデアを高く評価している限り(そして、とにかくそれを使用する可能性があります)、Array.concat別のライブラリを追加するよりも確実に便利です。
Shawn Erquhart、2016年

1
this.stateから派生した値でthis.setStateを呼び出すと、更新のバッチ処理の問題が発生します。発生する問題を示すjsfiddleにリンクしているstackoverflow.com/a/41445812/1998186を参照してください。
NealeU 2017年

40

setState()は、関数をパラメーターとして呼び出します。

this.setState((state) => ({ list: state.list.concat(newObj) }))

またはES5の場合:

this.setState(function(state) {
  return {
   list: state.list.concat(newObj)
  }
})

2
@Arian:Reactは、新しく追加された要素のみをレンダリングするために必要なDOM変異命令を無視します。もちろん、新たに追加された要素であることを考えると、以前の要素のレンダリング方法は変更されません。
Jose Browne、2015年

1
これは素晴らしい答えで、プッシュを実行するためだけに配列を連結するよりもはるかにクリーンに感じられますが、それは私が推測していることです。
Matt Styles

2
@Nyalabは関数の本体を括弧で囲んではいけませんか?今の例ではそのままですが、太い矢印の後の中括弧は、オブジェクトではなくブロックを開始します。次のようなもの:this.setState((state) => ({ list: state.list.push(newObj) }))
kumarharsh 2015年

3
このコードはどのように機能しますか?pushメソッドはを返しNUMBERlist変数に設定されます
kumarharsh

1
また、スプラットを使用することもできますthis.setState((state) => ({ list: [...state.list, newObj] }))
。– amoebe


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.