React アプリケーションの状態管理における Flux アーキテクチャと Redux ライブラリの使用について、完全かつ包括的に解説します。本記事では、Flux と Redux の概念から、それらの使用方法、実際のコード例に至るまで、詳細に説明します。
1. Flux アーキテクチャとは?
Flux は、Facebook によって提案された状態管理のアーキテクチャで、アプリケーションのデータの流れを単方向にすることにより、複雑なアプリケーションの管理を容易にします。Flux は以下の 4 つの主要な部分から構成されています:

- Actions(アクション): ユーザーの操作や外部のイベントに応じて発生するイベント。アクションは、アプリケーションの状態を変更するために Dispatchers に送信されます。
- Dispatcher(ディスパッチャ): アクションを受け取り、それを適切なストアに送信します。Flux の中で唯一の変更点はこのディスパッチャです。
- Stores(ストア): アクションを受け取って状態を変更し、その変更をビューに通知します。ビューはこのストアの状態を監視しており、ストアが変更されると自動的に再描画されます。
- View(ビュー): アプリケーションの UI 部分で、ストアからデータを受け取り、それを表示します。React コンポーネントとして実装されることが多いです。
Flux のデータフローは一方向で、以下のように循環します:
- ユーザーがビュー(UI)でアクションをトリガー。
- アクションはディスパッチャを通じてストアに送信。
- ストアはアクションを受けて状態を更新。
- 更新された状態をビューに反映させる。
2. Redux とは?
Redux は、Flux アーキテクチャをより簡潔で予測可能にした状態管理のライブラリです。Redux は、以下の 3 つの主要な概念に基づいています:
- State(状態): アプリケーションの全ての状態を一つのストアに集約します。これにより、状態の管理が容易になります。
- Actions(アクション): アプリケーションの状態を変更するためにディスパッチされるオブジェクト。アクションは通常、アクションタイプとそのペイロード(追加情報)を持ちます。
- Reducers(リデューサー): アクションに基づいて状態を変更する純粋関数です。リデューサーは、現在の状態とアクションを受け取り、新しい状態を返します。
Redux のデータフローも Flux と似ていますが、いくつかの重要な違いがあります:
- 状態の一元管理: Redux では、アプリケーションの状態が単一のストアで管理され、すべての状態はこのストアに格納されます。
- 純粋関数のリデューサー: リデューサーは純粋関数であり、外部の状態に依存せず、与えられた入力からのみ結果を返します。
- アクションとディスパッチ: アクションはディスパッチャを通じてストアに送信され、リデューサーがそのアクションを処理して新しい状態を返します。
3. Redux の実装
Redux を React アプリケーションで使用するためには、いくつかの手順があります。以下では、簡単な Redux の使用例を示します。
1. Redux のセットアップ
まず、Redux と React-Redux をインストールします。
bashnpm install redux react-redux
2. アクションの定義
アクションは、状態を変更するための「命令」です。例えば、カウンターを増加させるアクションを定義します。
javascript// actions.js
export const increment = () => ({
type: 'INCREMENT'
});
export const decrement = () => ({
type: 'DECREMENT'
});
3. リデューサーの定義
リデューサーは、アクションを処理して新しい状態を返す純粋関数です。
javascript// reducer.js
const initialState = { count: 0 };
const counterReducer = (state = initialState, action) => {
switch (action.type) {
case 'INCREMENT':
return { count: state.count + 1 };
case 'DECREMENT':
return { count: state.count - 1 };
default:
return state;
}
};
export default counterReducer;
4. ストアの作成
ストアはアプリケーションの状態を保持します。
javascript// store.js
import { createStore } from 'redux';
import counterReducer from './reducer';
const store = createStore(counterReducer);
export default store;
5. コンポーネントの作成
React コンポーネントで Redux の状態を使用するためには、react-redux
の useSelector
と useDispatch
を使用します。
javascript// Counter.js
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { increment, decrement } from './actions';
const Counter = () => {
const count = useSelector(state => state.count);
const dispatch = useDispatch();
return (
<div>
<h1>Count: {count}h1>
<button onClick={() => dispatch(increment())}>Incrementbutton>
<button onClick={() => dispatch(decrement())}>Decrementbutton>
div>
);
};
export default Counter;
6. React アプリケーションのラップ
最後に、Provider
コンポーネントでストアをラップします。これにより、アプリケーション全体で Redux ストアにアクセスできるようになります。
javascript// App.js
import React from 'react';
import { Provider } from 'react-redux';
import store from './store';
import Counter from './Counter';
const App = () => (
<Provider store={store}>
<Counter />
Provider>
);
export default App;
4. Flux と Redux の違い
Flux と Redux は似たアーキテクチャですが、いくつかの点で異なります。
-
ストアの数:
- Flux では複数のストアを使用できますが、Redux では単一のストアを使用します。これにより、Redux は状態の管理を簡素化し、アプリケーション全体の一貫性を保ちます。
-
ディスパッチャ:
- Flux では、ディスパッチャがアクションをストアに送信しますが、Redux ではディスパッチャは不要です。アクションは
dispatch
関数を通じて直接ストアに送信されます。
- Flux では、ディスパッチャがアクションをストアに送信しますが、Redux ではディスパッチャは不要です。アクションは
-
リデューサー:
- Redux では、リデューサーが純粋関数であり、アクションに基づいて状態を更新しますが、Flux ではストアがその責任を負います。
-
コードの簡潔さ:
- Redux は Flux の複雑さを解消するために設計されており、よりシンプルで一貫性のある方法で状態を管理できます。
5. 結論
Flux と Redux は、どちらも React アプリケーションでの状態管理に非常に有効ですが、Redux はそのシンプルさと予測可能なデータフローにより、より広く採用されています。状態管理の選択はアプリケーションの規模や必要な機能に依存しますが、Redux を使用することで、より簡単に一貫した状態管理を実現できます。