[React Hooks]useReducerについて

◎useReducerとは何ですか細かくわかりやすく教えて?


useReducerは、ReactのHooksの1つで、コンポーネント内で状態を管理するための強力なツールです。useReducerを使うことで、コンポーネント内で複雑な状態管理とアクションの処理を行うことができます。

以下に、useReducerの基本的な概念を細かく説明します:

  1. Reducer(リデューサ):

    • useReducerの中心的な要素は「Reducer」と呼ばれる関数です。Reducerは2つの引数を受け取り、新しい状態を返す関数です。

    • Reducerの役割は、アクションに応じて現在の状態を計算して新しい状態を生成することです。アクションは、状態変更のトリガーとなるオブジェクトで、通常は「type」プロパティを持っています。

  2. 状態とディスパッチ関数:

    • useReducerを使うと、状態(state)とディスパッチ(dispatch)関数がセットで提供されます。

    • 状態は現在のアプリケーションの状態を表し、ディスパッチ関数を介して状態を変更します。

  3. アクション:

    • アクションは、状態を変更する要求を表すオブジェクトです。通常、アクションは以下のプロパティを持つことが一般的です:

      • type: アクションのタイプを示す文字列。

      • その他のプロパティ: アクションに必要なデータを含めることができます。

  4. 状態の変更:

    • useReducerでは、ディスパッチ関数を呼び出し、アクションを渡すことで状態を変更します。

    • ディスパッチ関数はアクションをReducerに渡し、Reducerはアクションに基づいて新しい状態を計算します。

    • 新しい状態は古い状態を完全に置き換えるのではなく、差分のみが適用されます。

  5. 使用例:

    • 典型的な使用例として、カウンターアプリケーションを考えてみましょう。アクションが「増加」または「減少」で、Reducerは現在のカウント値を変更します。

import React, { useReducer } from 'react';

// Reducer関数を定義
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 Counter = () => {
  // useReducerを使用して初期状態とReducer関数を関連付ける
  const [state, dispatch] = useReducer(reducer, { count: 0 });

  return (
    <div>
      <p>Count: {state.count}</p>
      <button onClick={() => dispatch({ type: 'INCREMENT' })}>Increment</button>
      <button onClick={() => dispatch({ type: 'DECREMENT' })}>Decrement</button>
    </div>
  );
};

export default Counter;

この例では、useReducerを使用してカウンターアプリケーションを実装しています。アクションとReducerを通じて状態が変更され、ユーザーの操作に応じてカウントが増減します。

useReducerは、状態の複雑な変更と制御フローを処理するために非常に便利で、Reactアプリケーション内での高度な状態管理に適しています。



useState と useReducer の違いは?

  1. 状態の管理方法:

    • useState: 単一の状態変数を管理します。一般的に、状態が独立している場合やコンポーネント内で少数の状態を管理する場合に使用します。

    • useReducer: 複数の状態を1つのオブジェクト内で管理できます。複雑な状態管理が必要な場合や状態間の依存関係がある場合に有用です。

  2. アクションの処理:

    • useState: 状態の変更には直接セッター関数を使用します。状態を変更するためには新しい状態を提供します。

    • useReducer: アクションを使用して状態の変更をトリガーします。アクションは状態変更の意図を表し、Reducerがそのアクションに応じて状態を更新します。

  3. コードの複雑性:

    • useState: 簡単な状態管理に向いており、シンプルなコンポーネントで使いやすいです。

    • useReducer: 複雑な状態管理や状態間の細かな相互作用を処理する際に役立ちます。コンポーネントがより複雑な状態ロジックを持つ場合に適しています。

  4. アクションの制御:

    • useState: アクションが不要で、状態の変更は単純な値のセットに過ぎません。

    • useReducer: アクションを介して状態の変更が行われるため、アクションの制御が可能で、状態変更のロジックをより明確にするのに役立ちます。

  5. 利用シナリオ:

    • useState: 単純なカウンターやフォーム入力など、状態が単純で独立している場合に使用します。

    • useReducer: 多くの異なる状態が関連し、それらの状態を制御する複雑なロジックが必要な場合に使用します。また、アプリケーション全体の状態管理にも使用されることがあります。

どちらのHookを選択するかは、プロジェクトの要件とコンポーネントの複雑性に依存します。状態管理がシンプルであればuseStateが適していますが、より高度な状態管理が必要な場合はuseReducerを検討することがあります。


まとめ


  • useState:

// useState:状態の更新の仕方は利用側に託す。
// useState: コンポーネントで更新用の処理を保持

  • useReducer

// useReducer:状態の更新の仕方も状態側で担当する。
// useReducer: stateと一緒に更新用の処理を保持


この記事が気に入ったらサポートをしてみませんか?