Skip to content

react-router-dom v6でRedirectコンポーネントを使用する方法

問題

React Router v6にアップグレードした後に、以下のエラーが発生することがあります:

Attempted import error: 'Redirect' is not exported from 'react-router-dom'.

このエラーは、React Routerのバージョン6でRedirectコンポーネントが削除されたために発生します。

原因

React Router v6では、いくつかの大きな変更が行われました:

  • Redirectコンポーネントの削除
  • SwitchコンポーネントのRoutesコンポーネントへの置き換え
  • 新しいフックuseNavigateの導入

解決策

方法1: Navigateコンポーネントを使用する(推奨)

React Router v6では、Redirectの代わりにNavigateコンポーネントを使用します。

jsx
import { Navigate } from 'react-router-dom';

// ルート設定内での使用例
<Route path="/" element={<Navigate to="/dashboard" replace />} />

// コンポーネント内での使用例
function RedirectComponent() {
  return <Navigate to="/dashboard" replace />;
}

方法2: useNavigateフックを使用する

プログラムによるナビゲーションが必要な場合は、useNavigateフックを使用します。

jsx
import { useNavigate } from 'react-router-dom';

function MyComponent() {
  const navigate = useNavigate();
  
  const handleClick = () => {
    // ダッシュボードにリダイレクト
    navigate('/dashboard', { replace: true });
  };
  
  return (
    <button onClick={handleClick}>
      ダッシュボードへ移動
    </button>
  );
}

完全なコード例

jsx
import React from 'react';
import { Routes, Route, Navigate } from 'react-router-dom';
import { RouteWithLayout } from './components';
import { Minimal as MinimalLayout } from './layouts';
import {
  Login as LoginView,
  Dashboard as DashboardView,
  NotFound as NotFoundView
} from './views';

const RoutesComponent = () => {
  return (
    <Routes>
      <Route 
        path="/" 
        element={<Navigate to="/dashboard" replace />} 
      />
      <Route
        path="/login"
        element={
          <RouteWithLayout
            layout={MinimalLayout}
            element={<LoginView />}
          />
        }
      />
      <Route
        path="/dashboard"
        element={
          <RouteWithLayout
            layout={MinimalLayout}
            element={<DashboardView />}
          />
        }
      />
      <Route 
        path="*" 
        element={<NotFoundView />} 
      />
    </Routes>
  );
};

export default RoutesComponent;

注意点

  • replaceプロパティはブラウザの履歴に現在のURLを残さないようにします
  • Navigateコンポーネントはレンダリング時に即座にナビゲーションを実行します
  • 条件付きリダイレクトにはuseEffect内でuseNavigateを使用することを検討してください

バージョン5から6への移行に関する追加情報

React Router v6では他にも以下のような変更があります:

  • SwitchRoutes に変更
  • componentプロパティ → elementプロパティに変更
  • ネストされたルートの設定方法が変更

まとめ

React Router v6でRedirectコンポーネントが削除されたことによるエラーは、以下のいずれかの方法で解決できます:

  1. Navigateコンポーネントを使用する(レンダリングベースのリダイレクト)
  2. useNavigateフックを使用する(プログラムベースのナビゲーション)

最新のReact Router v6の使用方法については、公式ドキュメントを参照することをお勧めします。