Reactでログインしたら元々いたページに戻すやつ

useLocationで今いるページのパスを取得、useNavigateでページのパスを渡しながらログイン画面に飛ばして、ログインに成功したら先ほど渡されたパスに移動する。

具体的には、

npx create-react-app 云々 --template typescript

をした直後の状態として、App.jsxを以下のように書き換えるとなんとなく理解できる。

import React, { useState } from "react";
import {
  BrowserRouter,
  Routes,
  Route,
  Link,
  useLocation,
  useNavigate,
  Navigate,
} from "react-router-dom";

// トップページ
const TopPage = () => {
  return (
    <>
      <h2>トップページ</h2>
      {["a", "b", "c"].map((x: string, i: number) => {
        return (
          <p key={i}><Link to={"/" + x}>{x}</Link>
          </p>
        );
      })}
    </>
  );
};

// コンテンツ
const Comp = () => {
  const location = useLocation();
  const navigate = useNavigate();
  return (
    <>
      <h2>コンテンツ</h2>
      私は今{location.pathname}にいます。
      <br />
      <button
        onClick={(e) => {
          navigate("/login", { state: location.pathname });
        }}
      >
        ログイン画面にリダイレクトするイメージ
      </button>
      <hr />
      <Link to="/">トップページ</Link>
    </>
  );
};

// ログイン画面
const Login = () => {
  const location = useLocation();
  const navigate = useNavigate();

  return (
    <>
      {location.state}から来たようだ
      <p>
        <button
          onClick={(e) => {
            let url: string = location.state as string;
            navigate(url);
          }}
        >
          ログイン
        </button>
      </p>
      <hr />
      <Link to="/">トップページ</Link>
    </>
  );
};

//
function App() {
  return (
    <>
      <BrowserRouter>
        <Routes>
          <Route path="/login" element={<Login />} />
          <Route path="/a" element={<Comp />} />
          <Route path="/b" element={<Comp />} />
          <Route path="/c" element={<Comp />} />
          <Route path="/" element={<TopPage />} />
        </Routes>
      </BrowserRouter>
    </>
  );
}

export default App;