第18回:useNavigateフック:ボタン操作や処理完了後にページを切り替える方法

lang

これまでは <Link> タグをクリックしてユーザー自身に移動してもらってきました。しかし、実際のアプリでは「ログインボタンを押して、成功したらマイページへ飛ばす」といった、プログラム側からの画面遷移が必須です。

2026年のReact開発において、この「自動的な移動」を司るのが useNavigate フックです。

1. useNavigateとは?

「今すぐこのURLへ移動せよ!」という命令をJavaScriptから出せるようにするフックです。

  • Linkタグ: ユーザーがクリックして移動する(静的)。
  • useNavigate: プログラムの処理(if文など)の結果として移動する(動的)。

2. 【実践】ログイン成功後にトップページへ飛ばす

疑似的なログインフォームを作り、送信後に自動で画面が切り替わる仕組みを実装しましょう。

JavaScript

import React, { useState } from 'react';
import { BrowserRouter, Routes, Route, useNavigate } from 'react-router-dom';

function LoginPage() {
  const [userId, setUserId] = useState("");
  // 1. navigate関数を呼び出せるように準備
  const navigate = useNavigate();

  const handleLogin = (e) => {
    e.preventDefault();
    if (userId === "admin") {
      // 2. 条件に合致したら、指定したパスへ移動させる
      alert("ログイン成功!ホームへ戻ります。");
      navigate("/");
    } else {
      alert("ユーザーIDが違います。");
    }
  };

  return (
    <form onSubmit={handleLogin}>
      <h2>ログイン</h2>
      <input 
        value={userId} 
        onChange={(e) => setUserId(e.target.value)} 
        placeholder="ID(adminと入力)" 
      />
      <button type="submit">ログイン実行</button>
    </form>
  );
}

const Home = () => <h2>🏠 ホーム画面(ログイン済み)</h2>;

export default function App() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/login" element={<LoginPage />} />
      </Routes>
    </BrowserRouter>
  );
}

CodeSandboxでuseNavigateの自動遷移を体験する


3. コードの解説

  • Maps("/"): 引数に移動先のパスを入れます。-1 を入れると「ブラウザの戻るボタン」と同じ動作(1つ前のページに戻る)も可能です。
  • JavaScriptの if 文との組み合わせ: 第9回:条件付きレンダリングで学んだ論理構造を使い、「成功した時だけ Maps する」という制御ができます。

今回のまとめ

  1. useNavigate は、JavaScriptの処理の中で画面を切り替えたい時に使う。
  2. Maps("/path") で好きな場所へ飛ばせる。
  3. ログイン処理や、フォーム送信完了後のリダイレクトに最適。

次回予告:複数のコンポーネントで「データ」を共有する

これまで、データは「親から子へ」Propsで渡してきました。しかし、アプリが巨大になり「10個下の孫コンポーネント」にデータを渡したくなったらどうしましょう?

次回、「第19回:Context API入門:Propsバケツリレーを卒業し、どこからでもデータにアクセスする方法」。 バケツリレーの苦しみから解放される、スマートなデータ管理術を公開します。お楽しみに!


本日の宿題: ログイン失敗時に Maps("/error") するようにコードを書き換えてみてください。エラーページ用の Route も忘れずに追加できるでしょうか?

コメント

タイトルとURLをコピーしました