ReactのsetStateによるオブジェクトの更新
setStateでオブジェクトのプロパティを更新することは可能でしょうか?
以下のようなものです。
this.state = {
jasper: { name: 'jasper', age: 28 },
}
試してみました。
this.setState({jasper.name: 'someOtherName'});
とこれ。
this.setState({jasper: {name: 'someothername'}})
最初のものは構文エラーになり、2番目のものは何もしません。何かアイデアはありませんか?
211
3
これには複数の方法があります。stateの更新はasync operationなので、stateオブジェクトを更新するには、
setState
を使ったupdater functionを使う必要があります。*1- 最もシンプルな方法:***。
まず、
jasper
のコピーを作成し、そのコピーに変更を加えます。Object.assign`を使う代わりに、次のように書くこともできます。
2- [spread operator]3を使用します。
注意:
Object.assign
とSpread Operator
は、浅いコピー しか作成しませんので、ネストしたオブジェクトやオブジェクトの配列を定義している場合は、別のアプローチが必要です。ネストした状態のオブジェクトを更新します。
stateを次のように定義しているとします。
pizza オブジェクトの extraCheese を更新する。
オブジェクトの配列を更新します。
Todoアプリがあって、このフォームでデータを管理しているとします。
任意のTodoオブジェクトのステータスを更新するには、配列に対してマップを実行し、各オブジェクトの一意の値をチェックします。
condition=true
の場合、更新された値を持つ新しいオブジェクトを返し、そうでなければ同じオブジェクトを返します。提案: オブジェクトがユニークな値を持たない場合は、配列のインデックスを使用します。
最初のケースは確かにシンタックスエラーです。
あなたのコンポーネントの残りの部分を見ることができないので、なぜここでステートにオブジェクトを入れ子にしているのかわかりません。コンポーネントの状態にオブジェクトを入れ子にするのはよくありません。初期状態をこう設定してみてください。
そうすれば、名前を更新したいときには、単に
これで狙い通りになるのでしょうか?
より大きくて複雑なデータストアには、Reduxのようなものを使います。しかし、それはもっと高度なものです。
コンポーネントの状態に関する一般的なルールは、コンポーネントのUI状態(アクティブ、タイマーなど)を管理するためにのみ使用することです。
これらのリファレンスをチェックしてみてください。
もう一つの方法は、Jasperオブジェクトから変数を定義して、変数を呼び出すことです。
*Spread operator:ES6**。