VIDEO LESSON

Reactの基本Hooks入門:useState・useEffect・useRef・useContextの使い方の解説動画

再生時間 7:52動画を別のタブで開く ↗
動画の字幕・文字起こしを読む

再生中の字幕を濃い黒で表示し、一番上に追従します。字幕の行を選ぶと、その位置から再生できます。

  1. 0:00こんにちは。
  2. 0:00リアクト入門の第二回です。
  3. 0:03今回は、ユースステート、ユースエフェクト、ユースレフ、ユースコンテキストという、
  4. 0:07四つの基本フックスを学びます。
  5. 0:12フックスは、関数コンポーネントに、状態の保持や外部との同期などの機能を加える仕組みです。
  6. 0:19大切なのは、名前を暗記することではなく、何を実現したいかで選べるようになることです。
  7. 0:26画面に反映したい値なのか、ブラウザーとの同期なのか、入力欄への参照なのか、
  8. 0:30離れた部品への共有なのか。
  9. 0:34この見分け方を、小さなタイプスクリプトの例で一つずつ確認していきましょう。
  10. 0:41最初に、四つの役割を整理します。
  11. 0:43ユースステートは、入力値や選択状態など、変わったら画面に反映したい値を保持します。
  12. 0:50ユースエフェクトは、ブラウザーのイベントなど、リアクトの外側の仕組みと同期します。
  13. 0:57ユースレフは、入力欄などのディーオーエムへの参照や、表示の更新を伴わない値を保持します。
  14. 1:04ユースコンテキストは、親が提供する値を、その配下のコンポーネントから読み取ります。
  15. 1:11多くの場合、最初に必要になるのはユースステートです。
  16. 1:15ほかのフックスは、目的が決まってから選びます。
  17. 1:19また、フックスは関数コンポーネントかカスタムフックのトップレベルで呼び、
  18. 1:23条件分岐や繰り返しの中には置きません。
  19. 1:28呼び出しの順序を毎回同じに保つことがルールです。
  20. 1:32まずユースステートです。
  21. 1:34ステートエグザンプルでは、名前の文字列とカウントの数値を、別々のステートで保持します。
  22. 1:40入力欄の値に名前を表示し、変更されたらセットネームで更新します。
  23. 1:45挨拶は、名前の前後の空白を取り除き、空ならゲストと表示します。
  24. 1:50カウントは、ボタンを押すたびに増え、リセットでゼロに戻ります。
  25. 1:55ステートは、コンポーネントが次の描画でも覚えておく値です。
  26. 1:59通常の変数を書き換えるだけでは画面の更新を伝えられないため、更新用の関数を使います。
  27. 2:06挨拶文のように、名前から計算できる値は、別のステートにせず、描画の中で求めるのがポイントです。
  28. 2:13更新の書き方には注意点があります。
  29. 2:15セットカウントを呼んでも、その処理の中で今見えているカウントが、その場で書き換わるわけではありません。
  30. 2:23そのため、セットカウントにカウントたす一を三回渡しても、いずれも同じ描画の値を基にするので、
  31. 2:28通常は一しか増えません。
  32. 2:32一方、この例のように更新関数を三つ渡すと、各関数が順に更新途中の値を受け取るので、
  33. 2:36結果は三増えます。
  34. 2:40実機でも、関数を渡す方法ではゼロから三になり、直接の値では一になることを確認しました。
  35. 2:46更新関数の中では通信や保存はせず、受け取った値から次の値を計算だけにしましょう。
  36. 2:52オブジェクトや配列のステートも、直接書き換えず、新しい値を作って渡します。
  37. 2:58次はユースエフェクトです。
  38. 3:00コネクションエグザンプルでは、ブラウザーのオンライン状態を最初に読み取り、
  39. 3:04その後はオンラインとオフラインのイベントに応じて更新します。
  40. 3:08初期値をヌルにしておくと、確認中と表示でき、描画の中でナビゲーターを直接参照せずに済みます。
  41. 3:14表示は、ヌルなら確認中、真ならオンライン、偽ならオフラインです。
  42. 3:19ただし、これはブラウザーが判断する接続状態にすぎません。
  43. 3:22オンラインと表示されても、認証切れやサーバー停止でエーピーアイ通信が失敗することはあります。
  44. 3:28この値だけで操作を禁止せず、実際の通信の失敗は個別に扱ってください。
  45. 3:33エフェクトは、このように外部の仕組みと同期するときに使います。
  46. 3:37エフェクトで登録したものは、後始末までがセットです。
  47. 3:41エフェクトが返す関数はクリーンアップと呼ばれ、コンポーネントが取り外されるときなどに実行されます。
  48. 3:48イベントの登録を解除するときは、登録したときと同じ関数を使い、登録だけが残らないようにします。
  49. 3:55この例で依存配列が空なのは、エフェクトが変化するプロップスやステートを読んでいないためです。
  50. 4:02依存する値を使う場合は、必要な値を配列に含めます。
  51. 4:06実行回数を減らしたいという理由で、依存値を省略してはいけません。
  52. 4:11また、ストリクトモードを使う開発環境では、セットアップとクリーンアップが追加で実行されることがあります。
  53. 4:18何度実行されても登録が重複しない、対称な形にしておきましょう。
  54. 4:23三つ目はユースレフです。
  55. 4:25フォーカスエグザンプルでは、ボタンを押すとメモの入力欄へフォーカスを移します。
  56. 4:30ユースレフで、インプット要素への参照を用意し、入力欄のレフ属性に渡します。
  57. 4:35すると、リアクトが配置したディーオーエムが、カレントに入ります。
  58. 4:39ボタンが押されたら、カレントのフォーカスメソッドを呼びます。
  59. 4:43まだ配置されていない場合はヌルになるので、オプショナルチェーンで確認してから呼び出すのが安全です。
  60. 4:50実機の型チェックでも、この書き方でエラーはありませんでした。
  61. 4:54フォーカス用ボタンを押した直後に文字を打つと、メモ欄へ入力されるのが確認の目安です。
  62. 4:59ユースレフとユースステートの違いを押さえましょう。
  63. 5:03レフに保持した値を変更しても、それだけでは再描画されません。
  64. 5:07そのため、クリック回数のように画面に表示したい値にはユースステートを使い、
  65. 5:13ディーオーエムへの参照のように、表示を直接決めない情報にはユースレフを使います。
  66. 5:18一覧ページの入門例で、連番のアイティーをユースレフで保持していたのも、再描画に使わない値だったからです。
  67. 5:26なお、通常はレフの読み書きをイベントやエフェクトの中で行い、描画中の処理には持ち込まないようにします。
  68. 5:33この基準があると、どちらのフックスを選ぶか迷いにくくなります。
  69. 5:38四つ目はユースコンテキストです。
  70. 5:40テーマエグザンプルでは、親がライトかダークかのテーマをステートで保持し、
  71. 5:44コンテキストを通して子へ提供します。
  72. 5:47子はユースコンテキストで、自分より上にある最も近い対応プロバイダーの値を読み取ります。
  73. 5:53ボタンを押してテーマを切り替えると、背景色と一緒に、子コンポーネントのテーマ名も変わります。
  74. 5:59ここで大切なのは、値を保持しているのはあくまでユースステートであり、コンテキストは値をツリーへ渡す経路だということです。
  75. 6:08対応するプロバイダーが上にない場合は、クリエイトコンテキストで指定した初期値が使われます。
  76. 6:14少数の親子ならプロップスで十分ですが、何段もの中間コンポーネントが受け渡すだけになったら、
  77. 6:18コンテキストを検討しましょう。
  78. 6:22最後に、四つの例をアプリにまとめて確認します。
  79. 6:25アプリ・ティーエスエックスで四つのコンポーネントを並べ、メイン・ティーエスエックスからの呼び出しはテンプレートのまま使います。
  80. 6:34確認する操作は五つです。
  81. 6:36名前を入力すると挨拶が変わり、空白だけならゲストになること。
  82. 6:40カウントがゼロのとき三増やすを押すと三になり、リセットでゼロに戻ること。
  83. 6:45接続状態はブラウザーの通知に応じて変わること。
  84. 6:49フォーカス用ボタンの直後に文字を打つとメモ欄へ入ること。
  85. 6:53テーマを切り替えると背景色と子のテーマ名が変わること。
  86. 6:57あわせてビルドを実行し、型エラーやインポート漏れがないことも確かめます。
  87. 7:02今回の例は、タイプスクリプトの型チェックでエラーがないことを確認済みです。
  88. 7:07まとめです。
  89. 7:08画面に反映する値はユースステート、外部との同期はユースエフェクト、ディーオーエムへの参照はユースレフ、
  90. 7:13配下への共有はユースコンテキスト。
  91. 7:19目的でフックスを選ぶことが、今回のゴールです。
  92. 7:22ユースメモやユースコールバックも最初から必要ですか、という疑問には、この小さな例では必要ない、
  93. 7:27と答えられます。
  94. 7:31まず正しく動く実装を作り、処理時間などが問題になったときに計測して判断します。
  95. 7:37練習として、カウンターの増減幅を変える、テーマを三種類にする、といった小さな変更から試してください。
  96. 7:45次回はユースリデューサーで、状態の更新を整理する方法を学びます。
  97. 7:50お疲れさまでした。
日本語字幕をダウンロード(WebVTT)

この動画で学べること

ReactのuseState・useEffect・useRef・useContextをTypeScriptの動く例で解説。状態更新、イベントの後始末、入力欄へのフォーカス、テーマ共有と使い分けを学びます。

解説記事・サンプルコードを読む:Reactの基本Hooks入門:useState・useEffect・useRef・useContextの使い方 →