【React×TypeScript】React Router v6でリダイレクトをする方法

2022年2月12日プログラミング

アイキャッチreact-routerv6のリダイレクト

ReactRouterがv6にバージョンアップしてredirectが廃止されたようなのでどうやってリダイレクトさせるのだろうと検索するも、v5の情報しか出てこなかったので備忘録的に書いていきます。

やりたかったこと

よくあるログイン周りの画面遷移で、

ユーザがログインしていない状態で、ログイン後のURLを直打ちしたら、ログイン画面にリダイレクトされる。

逆に、ログイン済みの状態でログイン画面にアクセスしたらログイン後のホーム画面などにリダイレクトするやつ。

結論:useNavigateをつかった

Router.tsxだけですがこんな感じでした。全体はこんな感じ

import React, { ReactElement, VFC } from 'react';
import { Route, Routes, Navigate } from 'react-router-dom';
import Top from '../components/pages/Top/Top';
import Login from '../components/pages/Login/Login';
import Mypage from '../components/pages/MyPage/MyPage';
import Page404 from '../components/pages/Page404/Page404';
import useAuth from '../hooks/useAuth';

const Router: VFC = (): ReactElement => {
  // ユーザーの認証状態を取得する関数
  const { fetchAuth } = useAuth();
  return (
    <Routes>
      <Route path="/" element={<Top />} />
      <Route
        path="/login"
        element={fetchAuth() ? <Navigate to="/mypage" /> : <Login />}
      />
      <Route
        path="/mypage"
        element={
          fetchAuth() ? (
            <div className="bg-gray-900">
              <Mypage />
            </div>
          ) : (
            <Navigate to="/login" replace />
          )
        }
      />

      <Route path="*" element={<Page404 />} />
    </Routes>
  );
};

export default Router;

ルーティングの際にユーザの認証状態を取得して、

認証済みならHome画面へnavigateで飛ばしてあげるという処理にしました。

ちゃんと公式ドキュメント読んで、useNavigateの存在を知っていればすぐ解決するような感じだったかもしれませんが、

「リダイレクトしたい!」という気持ちが前に出過ぎて「react router リダイレクト v6」などと調べてv5の情報を踏みまくったので備忘録としてのこしておきます。

他にも、ESLint/Prettier導入の手順もあるので参考になれば!

プログラミング

Posted by kotaro