ReduxのmapDispatchToProps解説
ReactJS, Redux, React-ReduxにおけるmapDispatchToProps
の解説
日本語で解説します
mapDispatchToProps
とは何か?
mapDispatchToProps
は、Reduxのストアからアクションディスパッチャーをコンポーネントに接続する際に使用する関数です。これにより、コンポーネントはReduxストア内の状態を変更するためのアクションを直接ディスパッチすることが可能になります。
具体的な役割
- アクションディスパッチャーの取得
Reduxストアからアクションディスパッチャーを取得します。 - アクションの紐付け
mapDispatchToProps
関数は、コンポーネント内で呼び出される関数(プロップとして渡されます)と、Reduxストアで定義されているアクションを紐付けます。 - プロップへの渡し
紐付けされた関数をプロップとしてコンポーネントに渡します。これにより、コンポーネント内で関数を呼び出すことで、対応するアクションをディスパッチできます。
使用例
import { connect } from 'react-redux';
// アクションクリエイター関数
function increment() {
return { type: 'INCREMENT' };
}
// コンポーネント
function Counter({ increment }) {
return (
<button onClick={increment}>Increment</button>
);
}
// `mapDispatchToProps`関数
const mapDispatchToProps = {
increment
};
// `connect`関数を使ってコンポーネントをReduxストアに接続
export default connect(null, mapDispatchToProps)(Counter);
この例では、increment
というアクションクリエイター関数をmapDispatchToProps
関数に登録しています。これにより、Counter
コンポーネントのincrement
プロップは、increment
アクションをディスパッチする関数になります。
アクションクリエイターの定義
function increment() {
return { type: 'INCREMENT' };
}
- この関数は、
INCREMENT
というタイプのオブジェクトを返します。これは、Reduxストアに状態の変更を通知するためのアクションです。 increment
という関数を作成します。
コンポーネントの作成
function Counter({ increment }) {
return (
<button onClick={increment}>Increment</button>
);
}
increment
プロップがクリックされたときに、ボタンのクリックイベントハンドラーが呼び出されます。- このコンポーネントは、
increment
というプロップを受け取ります。 Counter
というコンポーネントを作成します。
mapDispatchToProps関数の定義
const mapDispatchToProps = {
increment
};
increment
キーを定義し、その値としてincrement
アクションクリエイター関数を指定します。- このオブジェクトは、コンポーネントのプロップとReduxストアのアクションを結びつけるために使用されます。
mapDispatchToProps
というオブジェクトを作成します。
connect関数によるコンポーネントの接続
export default connect(null, mapDispatchToProps)(Counter);
- 第2引数には、
mapDispatchToProps
関数を指定します。 - 第1引数には、状態をコンポーネントにマップする関数(この例では
null
)を指定します。 connect
関数を使用して、Counter
コンポーネントをReduxストアに接続します。
動作の解説
- コンポーネントが再レンダリングされ、更新された状態を反映します。
- Reduxストアは、
INCREMENT
アクションを受け取り、状態を更新します。 increment
プロップは、increment
アクションクリエイター関数を呼び出し、INCREMENT
アクションをReduxストアにディスパッチします。- ボタンがクリックされると、
increment
プロップが呼び出されます。 increment
プロップは、mapDispatchToProps
関数によって定義されたincrement
アクションクリエイター関数に紐付けられています。Counter
コンポーネントがレンダリングされると、increment
プロップが設定されます。
ファクトリー関数を使う
const mapStateToProps = (state) => ({
count: state.count
});
const mapDispatchToProps = (dispatch) => ({
increment: () => dispatch({ type: 'INCREMENT' })
});
export default connect(mapStateToProps, mapDispatchToProps)( Counter);
- この手法では、
dispatch
関数を引数として受け取り、その関数を使ってアクションをディスパッチする関数を返します。 mapDispatch ToProps
をファクトリー関数として定義します。
reactjs redux react-redux