Qraft(クラフト) 資格・学習クイズアプリ

React入門 練習問題 39:フック:状態の更新手法

Reactで`useState`を使用して、現在の状態に基づいて新しい状態に更新する際、最も安全で推奨される方法として正しいものはどれか。

  1. 更新関数にコールバック関数を渡し、その引数から最新の状態を受け取って計算する。
  2. グローバルな変数を利用して現在の値を保持し、それを基に状態の値を直接書き換える。
  3. 更新関数の引数に現在の状態変数をそのまま指定し、算術演算子などを用いて変更する。
  4. setTimeout関数を利用して意図的に遅延させ、状態が完全に同期されるのを待って更新する。
  5. 画面上のDOM要素からテキストを直接取得し、それを数値に変換して新しい状態を設定する。

Qraftユーザーの成績:難易度 Aランク(レーティング1352)・正答率 27%(3/11回正解)
レーティングは解いた人の実力と正誤から算出する難しさ(初期値1200)。ランクはその全問題中の順位(S+が最難関、F-が最易)

正解と解説を見る
正解:更新関数にコールバック関数を渡し、その引数から最新の状態を受け取って計算する。

useStateで前の状態に基づいて新しい状態に更新する際、更新関数にコールバック関数を渡す方法が正解です。

【正解の理由】
状態の更新は非同期に行われることがあるため、`setCount(count + 1)`のように現在の変数を直接指定すると、古い値を参照してしまうリスクがあります。`setCount(prev => prev + 1)`のようにコールバック関数を渡すことで、常に最新の状態(prev)を元に安全に更新できます。

【不正解の理由】
• 「グローバルな変数を利用して現在の値を保持し、それを基に状態の値を直接書き換える」は誤り。Reactの宣言的なデータフローに反しており、バグの原因となる。
• 「更新関数の引数に現在の状態変数をそのまま指定し、算術演算子などを用いて変更する」は誤り。連続して更新関数を呼び出した場合などに、古い状態が参照される問題が起きやすい。
• 「setTimeout関数を利用して意図的に遅延させ、状態が完全に同期されるのを待って更新する」は誤り。状態の同期にsetTimeoutを使うのは不確実であり、Reactの正しい更新方法ではない。
• 「画面上のDOM要素からテキストを直接取得し、それを数値に変換して新しい状態を設定する」は誤り。ReactではDOMを直接操作するのではなく、状態(State)を真実の情報源(Single Source of Truth)として扱うべきである。

← 前の問題問題一覧次の問題 →
アプリで解いてレーティングを上げる(無料・登録不要)