reactでstateを変更したいのですが
うまくできないので教えてください。
this.state = { index: 0, count: [ { test: 1, hoge: 2 } ], }
このstateのhogeを100に変えたいのですが
this.state({ this.count[0].hoge: 100 });
とやったのですがうまく行きません。
どうすれば変更できますか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ネストされたstateの更新は結構面倒臭いです。
以下、質問内容通り、配列の最初のアイテムを更新するという決め打ちコードではありますが、
実際は、指定された配列のindexに対するアイテムを更新するみたいに汎用性を高めたコードにする必要があるかと思います。また、配列内のオブジェクトの中にさらに配列やオブジェクトがあった場合、ちゃんと更新対象のアイテムをディープコピーしてあげる必要が出てくるので、さらに面倒臭くなります。その場合は、ディープコピーを簡単にしてくれるライブラリを使ってあげると良いと思います。
サンプルコード
import React from 'react'; import { render } from 'react-dom'; class App extends React.Component { constructor(props) { super(props); this.state = { counts: [ { test:1, hoge: 2}, { test: 15, hoge: 25 } ] } } handleButtonClick() { this.setState((prevState) => { // const updatedCount = Object.assign({}, prevState.counts[0], test: 100}); const updatedCount = { ...prevState.counts[0], test: 100 }; const updatedCounts = [updatedCount, ...prevState.counts.slice(1)] return { counts: updatedCounts } }); } render() { return ( <div> {this.state.counts[0].test} <button onClick={this.handleButtonClick.bind(this)}>click</button> </div> ) } } render(<App />, document.getElementById('root'));
https://codesandbox.io/s/4826klkk4
簡単にポイント
- this.setStateメソッドは非同期実行される為、this.setStateメソッドの中でthis.stateを参照したいような場合は、上記掲載コードのようにthis.setStateメソッドが取る第一引数に渡ってくるpreviousStateを参照して、そちらを利用する
- 今回のようにネストが深く、更新対象が配列の中にあるアイテムやオブジェクトである場合は、そのコピーを作ってから、更新をする。reactでstateを直接書き換えてしまうのはNGであるため。
投稿2018/03/09 04:20
編集2018/03/09 04:33総合スコア2415
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。