Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】カスタムフックはstate自体ではなく、stateを使うロジックを共有する

2025年09月19日に「Qiita」が公開したITニュース「カスタムフックはstate自体ではなく、stateを使うロジックを共有する」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

カスタムフックは、コンポーネント間でデータ(state)そのものを共有するものではない。複数のコンポーネントで使う、データ操作の共通処理(ロジック)を切り出して再利用するための仕組みだ。これにより、コードの重複を防ぎ、より整理されたプログラム構造になる。

ITニュース解説

Reactにおけるカスタムフックは、コンポーネント間で共通のロジックを再利用するための強力な仕組みである。しかし、このカスタムフックの特性について誤解していると、意図しない挙動に悩まされることがある。特に、「カスタムフックがstate自体を共有する」という誤解は、多くの初心者が陥りやすい落とし穴だ。今回のニュース記事は、この誤解を解消し、カスタムフックの正しい使い方を理解するための重要な視点を提供している。

記事の主題は「カスタムフックはstate自体ではなく、stateを使うロジックを共有する」というReact公式ドキュメントからの引用に基づいている。これは、カスタムフックが状態(state)そのものを複数のコンポーネント間で共有するための機能ではない、ということを明確に示している。もしカスタムフックを、複数のコンポーネント間で共通のデータを保持・更新するためのものだと考えてしまうと、それぞれのコンポーネントでカスタムフックを利用した際に、期待通りにstateが共有されず、困惑することになるだろう。

具体的には、Component1で更新されたstateを、別のuseCustomHook2のロジックで利用しようとした際、stateが空の配列として認識されてしまうという問題が記事中で提示されている。これは、Component1とuseCustomHook2が、それぞれ独立したカスタムフックのインスタンスとして動作しており、それぞれのフックが独立したstateを保持しているために発生する現象である。

なぜこのようなことが起こるのか。カスタムフックは、実態としてはただのJavaScriptの関数である。Reactのコンポーネントがレンダリングされるたびに、そのコンポーネント内で呼び出されているカスタムフックもまた実行される。このとき、カスタムフックの内部でuseStateのようなReactフックが使われている場合、それぞれのコンポーネントがカスタムフックを呼び出すたびに、そのuseStateによって新しいstateが初期化される。つまり、Component1がuseCustomHookを呼び出したときと、Component2がuseCustomHookを呼び出したときでは、それぞれが全く異なる、独立したstateのインスタンスを持っていることになる。それらのstateは互いに干渉することなく、独立して管理・更新される。これが、カスタムフックを使ってもstateが共有されない根本的な理由である。

では、複数のコンポーネント間で共通のstateを扱いたい場合はどうすればよいのだろうか。Reactにおいて、複数のコンポーネント間でstateを共有する最も基本的な方法は、「State Hoisting(状態のリフトアップ)」である。これは、共有したいstateを、それらのコンポーネントの共通の親コンポーネントで管理し、そのstateを子コンポーネントにはプロップス(props)として渡すというアプローチである。

例えば、親コンポーネントでuseStateを使ってデータを管理し、そのデータとデータを更新する関数を、子コンポーネント1と子コンポーネント2にpropsとして渡す。子コンポーネント1が受け取ったpropsのデータを使ったり、更新関数を呼び出したりすると、親コンポーネントのstateが更新され、それが再びpropsとして全ての子コンポーネントに伝達される。これにより、複数の子コンポーネント間で常に最新の共通stateを参照できるようになる。

この「State Hoisting」の原則とカスタムフックを組み合わせることで、より効率的な開発が可能となる。カスタムフックの真価は、共有されたstateを操作する「ロジック」を再利用できる点にある。親コンポーネントで定義されたstateを更新する際の一連の処理や、そのstateから派生する計算など、特定のデータ操作ロジックをカスタムフック内にカプセル化し、親コンポーネントからそのカスタムフックを呼び出す形にできる。これにより、ロジックはカスタムフックに集約され、コンポーネントは見た目の構成と、渡されたstateやロジックの呼び出しに集中できるようになる。

さらに、アプリケーションの規模が大きくなり、多くのコンポーネント間でstateを共有する必要が出てきた場合には、Context APIやReduxのような状態管理ライブラリの利用も検討される。Context APIは、プロップスのバケツリレーを避けて、コンポーネントツリーの深い場所にあるコンポーネントに直接stateを渡すことを可能にする。Reduxのようなライブラリは、アプリケーション全体のstateを一元的に管理し、予測可能な方法でstateを更新するためのより強力な仕組みを提供する。

このように、カスタムフックは決してstateの共有を目的としたものではなく、stateを操作する共通のロジックを抽象化し、再利用性を高めるためのツールである。複数のコンポーネントで同じstateを参照したい場合は、State Hoistingを基本とし、カスタムフックはあくまでそのstateを扱うロジックの整理に用いるのが正しいアプローチである。この理解は、Reactアプリケーションを効率的かつ適切に設計するために不可欠な視点であり、システムエンジニアを目指す上での重要な基礎知識となるだろう。カスタムフックの正しい役割を理解し、適切な場面で活用することが、より堅牢で保守しやすいコードを書くための第一歩となる。

関連コンテンツ