やさしいReact入門⑧

React

useStateをもう少し詳しく理解しよう

こちらの記事で、useStateを使ってStateを管理する基本的な方法について学びました。

今回は、useStateについてもう少し詳しく見ていきましょう。

useStateはシンプルに見えますが、Stateを更新するときには少し注意が必要です。

ReactではStateの更新について少し独特な仕組みがあります。

この記事では、

  • Stateを更新した直後の値はどうなるのか
  • 現在のStateを使って更新する方法
  • Stateを複数回更新するときの注意点
  • Stateを変更すると、なぜ画面が更新されるのか

といった内容を、実際のコードを見ながら理解していきましょう。


Stateを更新するときの注意点

ここからは、useStateについてもう少し詳しく見ていきましょう。

初心者がつまずきやすいポイントの一つが、

Stateを更新した瞬間に、その場のStateの値が書き換わるわけではない

ということです。

例えば、次のコードを考えてみます。

setCount(count + 1);

console.log(count);

setCount()を呼び出しているので、

その直後のconsole.log()では、増えた値が表示されるはず

と普通の感覚では思うと思います。

しかし、そうとは限りません。


setCount()は、その場でcountという変数を書き換えるものではありません。

Reactに、

次のレンダー(描画)では、このStateをこの値にしてください

と伝えるイメージです。

大まかな流れとしては、

  1. setCount()を呼び出す
  2. ReactにStateの更新を伝える
  3. コンポーネントが再レンダーされる
  4. 新しいStateが反映される

となります。

そのため、再描画前であれば

setCount(count + 1);

console.log(count);

では、console.log()が更新前の値を表示します。

現在のStateを使って更新するには?

では、

現在のStateに1を足したい

という処理を確実に行いたい場合はどうすればよいのでしょうか?

この場合は、関数形式でStateを更新する方法があります。

setCount(prevCount => prevCount + 1);

ここで、prevCountには、更新前のStateの値が渡されます。

つまり、

setCount(prevCount => prevCount + 1);

は、

現在の値に1を足した値を、次のStateにしてください

というイメージです。


複数回Stateを更新するとき

この方法が特に役立つのが、Stateを複数回更新するときです。

例えば、

setCount(count + 1);
setCount(count + 1);

と書いた場合です。

2回呼び出しているので、

2増えるのでは?

と思うかもしれません。

しかし、この書き方では、同じcountをもとに更新しようとするため、期待した結果にならないことがあります。

このような場合は、

setCount(prev => prev + 1);
setCount(prev => prev + 1);

とします。

この場合、それぞれの更新が前の更新結果をもとに行われます。

そのため、

  • 1回目 → +1
  • 2回目 → さらに+1

と更新できます。

ここでは細かい仕組みまで覚える必要はありません。

まずは、

現在のStateをもとに次の値を計算したいときは、関数形式で更新する

と覚えておきましょう。


Reactでは「Stateを変更して画面を更新する」

最後に、今回学んだ内容をReactの基本的な考え方につなげてみましょう。

通常のJavaScriptでは、DOMを直接操作して画面を書き換えることがあります。

例えば、

document.getElementById("count").textContent = count;

のような処理です。

開発者がHTMLの要素を取得して、

この部分をこの値に変更してください

と直接指示しています。

一方、Reactでは、Stateを変更することが基本になります。

例えば、

setCount(count + 1);

とします。

するとReactがStateの変更をもとにコンポーネントを再レンダーし、画面を更新します。

イメージとしては、

  1. Stateを変更する
  2. Reactが再レンダーする
  3. 画面が更新される

です。

これがReactを理解するうえで、とても重要な考え方です。


まとめ

今回は、useStateについてもう少し詳しく見ていきました。

Stateを更新するときは、setCount()を呼び出したその場でStateの値が書き換わるわけではありません。

ReactにStateの更新を伝えると、その後のレンダーで新しいStateが反映されます。

また、現在のStateをもとに次の値を計算したい場合は、

setCount(prevCount => prevCount + 1);

のような関数形式でStateを更新できます。

特に、Stateを複数回更新するときには、この書き方が役立ちます。

そして、Reactでは、

Stateを変更する → Reactが再レンダーする → 画面が更新される

という流れが基本的な考え方になります。

まずは、「ReactではStateを変更することで、画面の更新につながる」ということを覚えておきましょう。

次回は、useEffectの依存配列について詳しく見ていきます。

[]や[id]にはどんな意味があるのか、useEffectがいつ実行されるのかを理解していきましょう。


管理人そーそー。が在籍中の会社は👉こちら👈

みんな仲が良くて、大好きな会社です☺️

無料で参加できるエンジニア交流Barもやってるので、気軽に遊びにきてください!

コメント

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