Tips
開発Tips(2025-11-01)
React Hooksを活用して、コンポーネントの状態管理と副作用処理をより簡潔に、再利用しやすい形で行うためのテクニックです。`useReducer`フックをカスタムフックと組み合わせることで、複雑な状態ロジックをカプセル化し、コンポーネントをより宣言的に記述できます。
React
React Hooksを活用して、コンポーネントの状態管理と副作用処理をより簡潔に、再利用しやすい形で行うためのテクニックです。useReducerフックをカスタムフックと組み合わせることで、複雑な状態ロジックをカプセル化し、コンポーネントをより宣言的に記述できます。
状態管理をReducerでカプセル化するカスタムフック
useReducerは複雑な状態ロジックを管理するのに適していますが、コンポーネントが肥大化する可能性があります。カスタムフックとして状態ロジックを抽出することで、再利用性とテスト容易性を向上させることができます。
説明:
useReducerをラップしたカスタムフックを作成し、状態管理ロジックをコンポーネントから分離します。これにより、コンポーネントは状態の変更をディスパッチすることに集中し、ロジック自体はカスタムフック内に隠蔽されます。
コード例:
import { useReducer, useCallback } from 'react';
// 初期状態とreducerを定義
const initialState = { count: 0 };
const reducer = (state, action) => {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
case 'decrement':
return { count: state.count - 1 };
default:
return state;
}
};
// カスタムフック
const useCounter = () => {
const [state, dispatch] = useReducer(reducer, initialState);
// useCallbackでメモ化
const increment = useCallback(() => dispatch({ type: 'increment' }), [dispatch]);
const decrement = useCallback(() => dispatch({ type: 'decrement' }), [dispatch]);
return { count: state.count, increment, decrement };
};
export default useCounter;
// 使用例 (Counter.js)
import React from 'react';
import useCounter from './useCounter';
const Counter = () => {
const { count, increment, decrement } = useCounter();
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>Increment</button>
<button onClick={decrement}>Decrement</button>
</div>
);
};
export default Counter;
注意点:
- Reducerが複雑になりすぎないように注意してください。必要に応じて、より小さなReducerに分割することを検討してください。
useCallbackを使用して、ディスパッチ関数をメモ化することで、不必要な再レンダリングを防ぎます。- カスタムフックは、関連する状態ロジックをまとめるのに役立ちますが、過度な抽象化はコードの可読性を損なう可能性があります。
おすすめポイント:
- コンポーネントの状態ロジックが複雑化した場合に、再利用性とテスト容易性を向上させることができます。
- 複数のコンポーネントで同じ状態ロジックを使用する場合に、コードの重複を避けることができます。
- 状態ロジックをコンポーネントから分離することで、コンポーネントをより宣言的に記述できます。