カテゴリ: React 更新日: 2025/12/25

Reactのカスタムフックで認証状態を管理する方法!初心者でもわかるReact Hooks入門

カスタムフックで認証状態を管理する方法
カスタムフックで認証状態を管理する方法

先生と生徒の会話形式で理解しよう

生徒

「Reactでログイン状態を管理したいです。でもどのコンポーネントでも同じ情報を使いたいんです。」

先生

「それならカスタムフックで認証状態を管理すると便利です。ログイン情報やユーザー情報を一箇所で管理できます。」

生徒

「コンポーネントごとに状態を持たなくても済むんですか?」

先生

「はい、カスタムフックにまとめることでどのコンポーネントからも同じ認証状態を参照できるようになります。」

1. カスタムフックで認証状態を管理するメリット

1. カスタムフックで認証状態を管理するメリット
1. カスタムフックで認証状態を管理するメリット

ReactではuseStateuseEffectを使って状態を管理します。 認証状態の場合、「ログインしているかどうか」「ユーザー情報は何か」といった情報を、 画面をまたいで共通して扱う必要があります。 しかし、これを各コンポーネントごとに書いてしまうと、 同じようなログイン判定や状態管理のコードが何度も登場してしまいます。

カスタムフックを使う最大のメリットは、こうした認証に関する処理を 一箇所にまとめられる点です。 ログイン状態の判定やユーザー情報の保持をフック側に集約することで、 コンポーネントは「画面に何を表示するか」だけを考えればよくなります。 その結果、コード全体が読みやすくなり、修正や追加もしやすくなります。


import { useState } from "react";

// ログイン状態だけを管理するシンプルなカスタムフック
function useSimpleAuth() {
  const [isLogin, setIsLogin] = useState(false);

  const login = () => setIsLogin(true);
  const logout = () => setIsLogin(false);

  return { isLogin, login, logout };
}

export default useSimpleAuth;
(画面に「こんにちは!」と表示され、ボタンを押すと「ボタンがクリックされました!」に変わります)

このように、まずは「ログインしているかどうか」だけを管理する 小さなカスタムフックから始めると理解しやすくなります。 処理をまとめておくことで、別の画面でも同じ認証状態を簡単に使い回せるようになり、 Reactアプリ全体の構造も自然と整理されていきます。

2. 認証状態を管理するカスタムフックの作り方

2. 認証状態を管理するカスタムフックの作り方
2. 認証状態を管理するカスタムフックの作り方

まず、カスタムフックを作ります。このフックでは、ログイン状態とユーザー情報を管理します。


import { useState, useEffect } from "react";

function useAuth() {
  const [isAuthenticated, setIsAuthenticated] = useState(false);
  const [user, setUser] = useState(null);

  const login = (userData) => {
    setIsAuthenticated(true);
    setUser(userData);
    localStorage.setItem("user", JSON.stringify(userData));
  };

  const logout = () => {
    setIsAuthenticated(false);
    setUser(null);
    localStorage.removeItem("user");
  };

  useEffect(() => {
    const storedUser = localStorage.getItem("user");
    if (storedUser) {
      setIsAuthenticated(true);
      setUser(JSON.parse(storedUser));
    }
  }, []);

  return { isAuthenticated, user, login, logout };
}

export default useAuth;

このフックでは、isAuthenticatedでログイン状態を管理し、userでユーザー情報を保持します。
login関数でログイン処理を行い、logout関数でログアウト処理を行います。
useEffectでは、ページをリロードしてもlocalStorageに保存されたユーザー情報を読み込み、ログイン状態を保持しています。

3. カスタムフックを使ったコンポーネント例

3. カスタムフックを使ったコンポーネント例
3. カスタムフックを使ったコンポーネント例

次に、このカスタムフックを使って簡単なログイン・ログアウト機能を作ります。


import React from "react";
import useAuth from "./useAuth";

function AuthDemo() {
  const { isAuthenticated, user, login, logout } = useAuth();

  return (
    <div>
      {isAuthenticated ? (
        <div>
          <h2>{user.name}さん、こんにちは!</h2>
          <button onClick={logout}>ログアウト</button>
        </div>
      ) : (
        <div>
          <h2>ログインしてください</h2>
          <button onClick={() => login({ name: "太郎" })}>ログイン</button>
        </div>
      )}
    </div>
  );
}

export default AuthDemo;
(画面に「ログインしてください」と表示され、ログインボタンを押すと「太郎さん、こんにちは!」に変わります。ログアウトも可能です)

このように、カスタムフックを使うことで、ログイン状態の管理がコンポーネントから独立し、どのコンポーネントでも簡単に再利用できます。

4. カスタムフック活用のポイント

4. カスタムフック活用のポイント
4. カスタムフック活用のポイント

カスタムフックを作るときは、以下のポイントに注意すると良いです。

  • 状態はuseStateで管理する
  • 初期化や副作用はuseEffectで処理する
  • ログイン・ログアウトなどの関数はフック内で定義して外部から呼べるようにする
  • localStorageなどを使うと、リロードしても状態を保持できる

これらを意識するだけで、認証管理を効率的に行うことができます。複雑なアプリでも同じカスタムフックを使い回せるので便利です。

5. 実践例:複数コンポーネントでの利用

5. 実践例:複数コンポーネントでの利用
5. 実践例:複数コンポーネントでの利用

認証状態を複数のコンポーネントで参照したい場合も、カスタムフックをインポートして呼び出すだけです。
例えば、ナビゲーションバーでログイン状態を表示したり、特定ページのアクセス制限に活用できます。

まとめ

まとめ
まとめ

カスタムフックで認証状態を管理する考え方の整理

この記事では、Reactのカスタムフックを使って認証状態を管理する方法について学んできました。 ログインしているかどうか、ユーザー情報は何かといった情報は、アプリ全体で共通して使われることが多く、 コンポーネントごとに管理してしまうと、同じような処理が何度も出てきてしまいます。 そこでカスタムフックを使うことで、認証に関するロジックを一箇所にまとめ、 再利用しやすく、読みやすい構造にできる点が大きな特徴でした。

特に初心者の方にとっては、「どこに状態を書けばいいのか分からなくなる」という悩みがよくあります。 カスタムフックを使えば、状態管理や副作用の処理をフック側に集約し、 コンポーネントは画面表示に集中できるようになります。 これにより、Reactの基本的な考え方である「役割分担」が自然と身についていきます。

シンプルな認証カスタムフックの振り返り

今回扱った認証用カスタムフックでは、ログイン状態を真偽値で管理し、 ユーザー情報をオブジェクトとして保持していました。 また、ログインやログアウトといった操作もフックの中にまとめることで、 どのコンポーネントからでも同じ動きを簡単に呼び出せる構成になっていました。


import { useState } from "react";

function useSimpleAuth() {
  const [isLogin, setIsLogin] = useState(false);

  const login = () => {
    setIsLogin(true);
  };

  const logout = () => {
    setIsLogin(false);
  };

  return { isLogin, login, logout };
}

export default useSimpleAuth;
(画面に「ログインしてください」と表示され、ログイン操作で表示が切り替わり、ログアウトも可能です)

このような最小限の構成でも、「認証状態を一箇所で管理する」という目的は十分に達成できます。 最初は難しい仕組みを作ろうとせず、ログインしているかどうかを管理するだけの シンプルなカスタムフックから試してみるのがおすすめです。 そこから少しずつ、ユーザー情報や保存処理を追加していくことで理解が深まります。

カスタムフックを使うことで得られる理解

カスタムフックを使った認証管理を学ぶことで、 Reactにおける状態管理の考え方や、ロジックの分離の重要性が見えてきます。 コンポーネントが増えても、認証の仕組みは一つのフックを見るだけで把握できるため、 アプリ全体の理解もしやすくなります。 これは個人開発だけでなく、チーム開発においても大きなメリットになります。

また、カスタムフックは通常のJavaScript関数と同じように扱えるため、 React初心者でも比較的取り組みやすい仕組みです。 「同じ処理を書いているな」と感じたときこそ、 カスタムフックを作る良いタイミングだと言えるでしょう。

先生と生徒の振り返り会話

生徒

「最初はログイン状態の管理って難しそうだと思っていましたが、 カスタムフックにまとめると意外とシンプルですね。」

先生

「そうですね。大事なのは、状態と動きを一箇所に集めることです。 コンポーネントが増えても、認証の仕組みは変わりません。」

生徒

「これなら、別の画面でも同じログイン状態を使えそうです。 Reactの考え方が少し分かってきた気がします。」

先生

「その感覚が大切です。まずは小さなカスタムフックから作って、 少しずつReactらしい設計に慣れていきましょう。」

カテゴリの一覧へ
新着記事
New1
React
Reactコンポーネントの再利用と分割を完全マスター!初心者でもわかるコンポーネント設計
New2
React
ReactでAxiosインターセプターの使い方を完全ガイド!初心者でもわかるリクエストとレスポンスの処理方法
New3
React
JSXの書き方!初心者でもわかるReactタグと属性の基本ルール解説
New4
React
ReactとDockerを使った開発環境構築の基本を徹底解説!初心者でもわかるReactとDockerの連携方法
人気記事
No.1
Java&Spring記事人気No1
React
ReactでonChangeイベントを使ってフォーム入力値を管理する方法を初心者向けに解説
No.2
Java&Spring記事人気No2
React
Reactのイベントハンドリングのアンチパターンまとめ!初心者でもわかる注意点
No.3
Java&Spring記事人気No3
React
ReactとTypeScriptの環境構築をやさしく解説!Viteとtsconfigの設定も丁寧に紹介
No.4
Java&Spring記事人気No4
React
ReactでFetch APIのローディング状態を管理する方法|初心者にもわかる解説
No.5
Java&Spring記事人気No5
React
Reactのカスタムフックの作り方を完全ガイド!再利用可能なロジックを切り出す仕組み
No.6
Java&Spring記事人気No6
React
create-react-appでReactプロジェクトを作成する手順を初心者向けに完全解説!
No.7
Java&Spring記事人気No7
React
ReactのuseStateとuseEffectでよくあるエラーと解決方法ガイド!初心者でもわかるReactフック
No.8
Java&Spring記事人気No8
React
Reactでファイルアップロードを実装する方法を解説!Fetch APIで画像やPDFを送る仕組みを初心者向けに紹介