フックの仕組みとは
classを書かずにstateやReactの他の機能を使えるHooksという新機能が、Reactの16.8バージョンで導入されました。その実装原理には主に2つの側面があります。
- コンポーネントの状態を保持するために連結リストを使用する:React内部では、各コンポーネントの状態を保持するために連結リストが使用されており、リストの各ノードにはコンポーネントの状態値、更新キュー、および次のノードを指すポインタが含まれています。useStateやuseReducerなどのフック関数を呼び出すとき、Reactは連結リスト内の現在コンポーネントに対応するノードを見つけ、そこからコンポーネントの状態を読み取ったり更新したりします。
- React内部では、コンポーネントの更新処理をファイバーリコンサイラーを使って管理しています。useStateやuseReducerなどのフック関数を呼び出すと、Reactはその更新内容を現在のコンポーネントに対応するファイバーノードの更新キューに入れて、そのコンポーネントに「更新が必要」というフラグを立てます。その後、Reactはファイバーリコンサイラーを使って、更新キュー内のすべての更新操作(状態の読み取りと更新など)を一括して優先順位と一定の戦略に従って実行します。これにより、コンポーネントの状態更新が実現します。
つまり、フックはコンポーネントのステートを保持するリンクリストと、ステートの更新を処理するファイバーリコンサイラーを利用して実現されています。この設計によって、フックは関数コンポーネントで利用可能になり、ステートの変化を自動的に追跡し、更新操作をバッチ処理することで、コンポーネントのパフォーマンスが向上します。