React Hooks早わかり(useReducer編)
投稿日 : 2022-04-04
更新日 : 2022-04-04
useReducer 概要
useReducer 用例
- useState の代替品。
- (state, action) => newState という型のリデューサ (reducer) を受け取り、現在の state を dispatch メソッドとペアにして返す。
- 複数の値にまたがる複雑な state ロジックがある場合や、前の state に基づいて次の state を決める必要がある場合に有用。
- 複数階層にまたがって更新を発生させるようなコンポーネントではパフォーマンスの最適化にもなる。
ボタンクリックでcountステートをインクリメント、デクリメントするサンプルコード。
https://github.com/w8f/react-training/blob/153eab2661d30bbeec13f0fb1d065d5aa4c26c0c/front/src/component/useReducer/UseReducerSample.tsx
import { VFC, useReducer } from "react";
type State = {
count: number;
};
type ActionType = {
type: "increment" | "decrement";
};
const UseReducerSample: VFC = () => {
const initialState = { count: 0 };
// reducer関数を定義する。
// actionごとにstateに対する処理を記載
const reducer = (state: State, action: ActionType) => {
switch (action.type) {
case "increment":
return { count: state.count + 1 };
case "decrement":
return { count: state.count - 1 };
default:
throw new Error();
}
};
// useReducerを呼び出す。
// 第一引数にreducer関数、第二引数に初期値のステートを指定する。
const [state, dispatch] = useReducer(reducer, initialState);
return (
<div style={{ textAlign: "center" }}>
<p>count: {state.count}</p>
<button
style={{ margin: 3 }}
onClick={() => {
dispatch({ type: "increment" });
}}
>
+
</button>
<button
style={{ margin: 3 }}
onClick={() => {
dispatch({ type: "decrement" });
}}
>
-
</button>
</div>
);
};
export default UseReducerSample;