[解決済み] React useState()フックによるステートオブジェクトの更新とマージ
2023-03-05 21:56:28
質問
React Hooksのドキュメントで、この2つの部分が少し混乱しています。stateフックを使用してstateオブジェクトを更新するためのベストプラクティスはどちらでしょうか?
次のような状態の更新を行いたいとします。
INITIAL_STATE = {
propA: true,
propB: true
}
stateAfter = {
propA: true,
propB: false // Changing this property
}
オプション1
から React Hookを使用する の記事から、これが可能であることがわかります。
const [count, setCount] = useState(0);
setCount(count + 1);
だからできたんです。
const [myState, setMyState] = useState(INITIAL_STATE);
そして
setMyState({
...myState,
propB: false
});
オプション2
また フックリファレンス を取得します。
クラスコンポーネントにある setState メソッドとは異なり、useState は は自動的に更新オブジェクトをマージしません。この動作を再現するには 関数アップデータのフォームとオブジェクトの拡散を組み合わせることで、この動作を再現できます。 構文と組み合わせることで、この動作を再現できます。
setState(prevState => {
// Object.assign would also work
return {...prevState, ...updatedValues};
});
私の知る限りでは、どちらも動作します。では、何が違うのでしょうか?どちらがベストプラクティスなのでしょうか?前の状態にアクセスするためにpass the function (OPTION 2)を使うべきか、それとも単にspread syntax (OPTION 1)で現在の状態にアクセスすべきでしょうか?
どのように解決するのですか?
どちらのオプションも有効ですが
setState
の場合と同様に、すでに状態になっているものから派生した状態を更新するときには注意が必要です。
例えばカウントを2回連続で更新する場合、状態を更新する関数版を使用しないと期待通りに動作しません。
const { useState } = React;
function App() {
const [count, setCount] = useState(0);
function brokenIncrement() {
setCount(count + 1);
setCount(count + 1);
}
function increment() {
setCount(count => count + 1);
setCount(count => count + 1);
}
return (
<div>
<div>{count}</div>
<button onClick={brokenIncrement}>Broken increment</button>
<button onClick={increment}>Increment</button>
</div>
);
}
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="root"></div>
関連
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] Reactルータを使ったプログラムによるナビゲーション
-
[解決済み] React NativeとReactの違いは何ですか?
-
[解決済み] Reactのstateとpropsの違いとは?
-
[解決済み] useEffect React Hook使用時の依存性欠如の警告を修正する方法
-
[解決済み] URL/アドレスバーからJavascriptの関数を呼び出す
-
[解決済み] Javascript 空の配列の削減
-
[解決済み] イテレータでmap()を使用する
-
[解決済み] javascriptでオプションのパラメータを扱う
-
[解決済み] querySelectorAllがない場合、ライブラリを使用せずに属性で要素を取得する?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】React Hooks useState()でオブジェクトを使用する。
-
[解決済み] Google maps API V3 - 同一地点に複数のマーカーを設置する。
-
[解決済み] モバイルWeb HTML5フレームワークの選び方【終了しました
-
[解決済み] JSXとLoadshを使用して、ある要素をn回繰り返す方法
-
[解決済み] Reactメモを使うべきではない場合とは?
-
[解決済み] Promise : then vs then + catch [重複].
-
[解決済み] 文字列とラベルのローカライズとグローバリゼーションのベストプラクティス【終了しました
-
[解決済み] JavaScriptで長い配列を小さい配列に分割する方法
-
[解決済み] javascriptでオプションのパラメータを扱う
-
[解決済み] Prototypeを使ってtextareaを自動サイズ調整するには?