【React.js/Next.js】React Hooks useState 完全入門

React.js / Next.js

React HooksuseState ってどんな機能があるの?

今回は、React Hooks で最も代表的な useState についてご紹介します。

useState とは?

useState とは、React.js で「状態(state)」を保持や更新したり管理するためのHook です。
状態(state)とは、「時間や入力フォームの値などのユーザー操作によって変化する値」のことを指します。

useState の基本

書き方

  • state:現在の状態
  • setState:状態を更新する関数
  • initialValue:初期値

コード例

処理フロー

  1. useState() count の初期値を 0 に設定
  2. 「+」ボタンをクリックする たびに、increment が呼ばれ、count に + 1(prev + 1) したものを setCountにset
  3. React.js が再レンダリング
  4. 新しい countの値 が画面に反映される

検証画像count+1 ずつカウントアップ

なぜ setState を使用する必要があるのか?

React.js は、setState 経由でしか変更を検知せず再レンダリングされないため、setState を使用する必要がある

関数型アップデート ※重要

関数型アップデート じゃない場合、stateの更新をまとめて処理しよう とするため、

常に最新のstate を元に非同期でも安全に更新するように、関数型アップデート で書くようにする

※非同期更新や連続更新では必須

検証画像count+3 ずつカウントアップ

オブジェクトの場合のコード例

処理フロー

  1. useState() user の初期値を {name: ‘Taro’, age: 20} に設定
  2. 「年齢を1つ増やす」ボタンをクリックする たびに、onClickAgeIncrement が呼ばれ、user.age + 1 したものを setUserにset
  3. React.js が再レンダリング
  4. 新しい user.ageの値 が画面に反映される
なぜスプレッド構文が必要?

下記コードの ❌ NG例 のように更新したいプロパティだけを set すると、既存のプロパティは保持されず、name が消えて age だけのオブジェクトになってしまいます。
そのため、✅ OK例のようにスプレッド構文を使って既存のプロパティをコピーし、必要なプロパティだけを更新しましょう。

検証画像年齢+1歳 ずつカウントアップ

配列の場合のコード例

処理フロー

  1. useState() todos の初期値を [‘todo1’] に設定
  2. inputtodo を入力し、ボタンをクリックするaddTodo が呼ばれ、 todo が追加され、inputの値 は消去される ※inputの値 に何も入力がない場合、ボタンをクリックしても、todo は追加されない
  3. React.js が再レンダリング
  4. 新しい todosの値, inputの値 が画面に 追加・反映される
  5. index 削除 or value 削除ボタンをクリックするremoveTodoIndex or removeTodoValue が呼ばれ、 todo が削除される
  6. React.js が再レンダリング
  7. 対象の todosの値 が画面から 削除・反映される

検証画像todo入力し追加 or todoindex削除 or value削除削除

使わない引数は “_” にすることが出来る

下記コードのように、index の引数だけ使用して、value の引数を使用しない場合は、”_” にすることが出来ます

まとめ

React HooksuseState について、いかがでしたでしょうか?

useStateReact.js で最も基本となる Hook であり、stateの更新方法 関数型アップデート を正しく理解することで、バグを防ぎ、より安全なコードが書けるようになります。

まずは基本的な使い方をしっかり押さえ、小さな コンポーネント から試しながら、少しずつ useState に慣れていきましょう。

コメント

タイトルとURLをコピーしました