【ITニュース解説】Redux desde cero

2025年09月10日に「Dev.to」が公開したITニュース「Redux desde cero」について初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

ITニュース概要

Reduxは、アプリ全体のデータ(状態)を「Store」という一つの場所で管理するライブラリ。コンポーネントは「Action」を発行し、「Reducer」が状態を更新する。これにより、どこからでもデータにアクセスでき、複雑な状態管理が簡単になる。(118文字)

出典: Redux desde cero | Dev.to公開日:

ITニュース解説

Webアプリケーション開発、特にReactのようにUIを部品(コンポーネント)の組み合わせで構築するフレームワークでは、アプリケーション全体で共有したいデータ、すなわち「状態」の管理が重要な課題となる。小規模なアプリケーションであれば、親コンポーネントから子コンポーネントへデータを渡す方法で十分だが、規模が大きくなるにつれて、多くのコンポーネント間でデータを何度も受け渡す必要が生じ、コードが複雑化し、データの流れを追跡することが困難になる。Reduxは、このような状態管理の課題を解決するために設計されたJavaScriptライブラリである。アプリケーションのすべての状態を「ストア」と呼ばれる一つの場所に集約し、一元的に管理することで、予測可能で保守性の高い状態管理を実現する。

Reduxの仕組みは、主に「ストア」「アクション」「リデューサー」そして「ディスパッチ」という四つの基本概念で構成される。ストアは、アプリケーション全体の状態を保持する唯一のオブジェクトである。このストアにすべての共有データが集約されるため、どのコンポーネントからでも必要なデータにアクセスできる。次にアクションは、状態をどのように変更したいかを示す「指示書」の役割を担うプレーンなJavaScriptオブジェクトである。アクションは必ず「type」というプロパティを持ち、例えばカウンターの数値を増やす指示であれば { type: "INCREMENT" } のように表現される。リデューサーは、現在の状態と受け取ったアクションを基に、新しい状態を生成する純粋な関数である。リデューサーはアクションの「type」を判別し、それに応じた状態更新ロジックを実行して、変更後の新しい状態オブジェクトを返す。元の状態を直接変更するのではなく、常に新しい状態を返すことが重要な原則となる。最後にディスパッチは、アクションをストアに送るための関数である。コンポーネント内で何らかのイベント(例えばボタンのクリック)が発生した際に、ディスパッチ関数を使ってアクションをストアに通知する。この通知を受け取ったストアが、対応するリデューサーを呼び出し、状態の更新プロセスが開始される。この一連の流れにより、データの変更は常に一方向(UI → アクション → リデューサー → ストア → UI)となり、アプリケーションの動作が予測しやすくなる。

現代のReact開発においてReduxを導入する際は、公式に推奨されている「Redux Toolkit」を利用するのが一般的である。Redux Toolkitは、Reduxの定型的なコードを大幅に削減し、より効率的に記述できるように設計されたツールセットである。Redux Toolkitの中心的な機能の一つが「スライス」を作成するcreateSlice関数である。スライスは、特定機能に関連する状態の初期値、リデューサー関数、そしてアクションクリエーター(アクションオブジェクトを生成する関数)を一つのオブジェクトにまとめて定義するものである。これにより、従来は別々のファイルに記述していた関連コードを一箇所に集約でき、管理が容易になる。

スライスを定義したら、次にconfigureStore関数を用いてストアを作成する。この関数に、作成したスライスのリデューサーを登録することで、ストアがその状態を管理できるようになる。そして、Reactアプリケーションの最上位コンポーネントを、react-reduxライブラリが提供するProviderコンポーネントで囲み、作成したストアをpropsとして渡す。これにより、アプリケーション内のどのコンポーネントからでもReduxのストアにアクセスする準備が整う。

コンポーネント内からストアの状態を利用するには、二つのフックが主に使われる。一つはuseSelectorフックで、ストアの全体の状態から必要なデータを選択して取り出すために用いる。例えば、useSelector(state => state.counter.value)のように記述することで、カウンタースライスのvalueという状態を取得できる。useSelectorによって購読された状態が更新されると、そのコンポーネントは自動的に再レンダリングされ、常に最新のデータが画面に表示される。もう一つはuseDispatchフックで、これはアクションをストアにディスパッチするための関数を取得する。ボタンがクリックされた際に、スライスからエクスポートされたアクションクリエーター(例えばincrement())を引数にしてディスパッチ関数を呼び出すことで、状態の更新を要求できる。このように、useSelectoruseDispatchを組み合わせることで、コンポーネントはストアと効率的に連携し、状態の読み取りと更新を簡潔に実装できる。

なお、過去のコードではbindActionCreatorsという関数が使われることもある。これは、アクションクリエーターとディスパッチをあらかじめ結合し、呼び出すだけで自動的にディスパッチされる関数を作成するものである。しかし、useDispatchフックが主流となった現在では、この関数が直接使われる場面は減少している。Reduxは、アプリケーションの状態管理を一元化し、データの流れを明確にすることで、複雑なアプリケーションの開発と保守を容易にする強力なツールである。

【ITニュース解説】Redux desde cero | いっしー@Webエンジニア