常に必要とは限りません。モダンフレームワークには能力の高いビルトイン状態管理ツールがあり、Redux/Zustandを時期尚早に導入するだけで複雑性が増します。正直な答えは:ビルトインオプションが苦痛になったときだけライブラリを追加してください。
ビルトインツールから始める
jsx
[x, setX] = ();
value = ();
memo = ( (), [x]);
ローカルstate + Context + (リモートデータの場合)React Queryは、大多数のアプリケーションをカバーします。多くのプロダクションアプリには、グローバル状態管理ライブラリが全く必要ありません。
✓ Lots of GLOBAL state shared across many distant components
✓ Complex state interactions / frequent updates that Context handles poorly
(Context re-renders all consumers on any change)
✓ You need devtools, time-travel debugging, or strict update traceability
✓ Many components both read AND write the same shared state
✓ Predictable, centralized update logic matters for a large team
Cost of a library: boilerplate, learning curve, more indirection, bundle size.
For a small/medium app, that cost often outweighs the benefit.
Server/remote data → React Query / SWR (NOT a global store)
A few global values → Context, or a tiny store (Zustand/Jotai)
Large, complex shared state→ Redux Toolkit, or Zustand for less boilerplate
Form state → a form library (React Hook Form), not global state
「Reduxが必要」の大部分は、実際にはReact Queryでより良く解決されるサーバー状態の問題、または、Context/Zustandで解決される少数の値です。
状態管理ライブラリが正当化されるタイミングを知ることは、一般的なオーバーエンジニアリングの間違い――useStateとContextだけが必要なアプリにReduxを追加する――を防ぎます。
成熟したアプローチは、シンプルに始めて、特定の痛点(深い共有、複雑な更新、サーバーキャッシング)を特定し、その痛点に対して適切なツール(多くの場合、軽量ストアやサーバー状態ライブラリ)を選択することです。ただし、重いグローバルストアではありません。
ニーズに合う最小限のソリューションを選択することで、アプリはより単純で、構築が速く、保守が容易になります。