カテゴリ: React 更新日: 2026/03/05

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. 認証状態を管理するカスタムフックの作り方

ここでは、Reactのカスタムフックで「ログインしているかどうか」と「ユーザー情報」をまとめて管理する方法を紹介します。 認証状態はアプリのいろいろな場所で参照されるため、コンポーネントごとに書くよりも、ひとつにまとめておくと迷いにくくなります。 また、ログインやログアウトの処理もフック側に置くことで、画面側は表示に集中できるようになります。

基本の流れはシンプルです。まずuseStateで「ログイン状態」と「ユーザー情報」を用意し、 ログイン時に情報を保存、ログアウト時に情報を削除します。 さらにuseEffectで最初に一度だけ保存済みデータを読み込み、ページを開き直しても状態が戻るようにします。


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

このフックのポイントは、画面側が「ログイン状態の保存方法」まで覚えなくていいところです。 たとえば、ユーザー情報をどこに保存するか、いつ読み込むか、といった細かい判断はフックに任せられます。 初心者のうちは、まず「状態をまとめる」「ボタンから呼べる関数もまとめる」という感覚をつかめれば十分です。 その上で、必要になったらユーザー情報の項目を増やすなど、少しずつ育てていくのがコツです。

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で再利用可能なリスト表示コンポーネントを実装しよう!初心者でもわかるReactのコンポーネント分割
New2
React
ReactのPropsとStateのベストプラクティスを整理しよう!初心者でもわかる使い方ガイド
New3
Next.js
Next.jsのRoute Groupの使い方を完全ガイド!App Routerでフォルダ構成を整理する方法
New4
Next.js
Next.js App Routerのtemplate.tsxの役割を完全解説!初心者でも理解できるレイアウト管理の基本
人気記事
No.1
Java&Spring記事人気No1
React
Reactでキーボードイベントを活用する方法!onKeyDown, onKeyUp, onKeyPressを初心者向けに解説
No.2
Java&Spring記事人気No2
React
ReactのPresentational Componentを完全ガイド!初心者でもわかるStateを持たないコンポーネントの特徴
No.3
Java&Spring記事人気No3
React
Reactでフォーカスイベントを制御する方法!onFocusとonBlurを初心者向けに解説
No.4
Java&Spring記事人気No4
React
Reactとは?初心者でもわかるReact.jsの基本概念と特徴をやさしく解説
No.5
Java&Spring記事人気No5
Next.js
Next.js Server Componentsのメリット・デメリットを完全解説!初心者でもわかるNext.jsの基本
No.6
Java&Spring記事人気No6
React
ReactでAxiosローディング状態を管理する方法を完全ガイド!初心者でもわかる非同期通信の基本
No.7
Java&Spring記事人気No7
React
create-react-appでReactプロジェクトを作成する手順を初心者向けに完全解説!
No.8
Java&Spring記事人気No8
React
ReactでuseStateを使ったオブジェクト・配列の扱い方完全ガイド!初心者でもわかるReactフック