Skip to content

React Router v6: SwitchからRoutesへの移行

問題

Reactアプリケーションでルーティングを実装しようとすると、次のエラーが発生することがあります:

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

このエラーは、React Routerのバージョン6以降で発生します。バージョン6では、Switchコンポーネントが非推奨となり、代わりにRoutesコンポーネントが導入されました。

原因

React Router v6では、以下の重要な変更が行われました:

  • SwitchコンポーネントがRoutesに置き換えられました
  • componentプロパティがelementプロパティに変更されました
  • exactプロパティが廃止されました(v6ではデフォルトで完全一致になります)

これらの変更により、古いバージョンのコードをv6で使用するとインポートエラーが発生します。

解決策

方法1: 最新の構文にアップグレード(推奨)

React Router v6の新しい構文に移行する方法:

jsx
import React from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import NavBar from './components/navbar.js';
import Footer from './components/footer.js';
import Home from './components/pages/homepage/home.js';

function App() {
  return (
    <Router>
      <div className="app-container">
        <NavBar />
        <Routes>
          <Route path="/home" element={<Home />} />
        </Routes>
        <Footer />
      </div>
    </Router>
  );
}

export default App;

主な変更点

  • SwitchRoutes に変更
  • component={Home}element={<Home />} に変更
  • exactプロパティは削除(v6ではデフォルトで完全一致)

方法2: バージョンダウン(一時的な解決策)

プロジェクトの事情で即時のアップグレードが難しい場合:

bash
npm uninstall react-router-dom
npm install react-router-dom@5.3.3

注意

バージョンダウンは一時的な解決策です。長期的にはv6への移行を推奨します。

詳細な変更点

ルート定義の比較

jsx
<Switch>
  <Route exact path="/" component={Home} />
  <Route path="/about" component={About} />
  <Route path="/users/:id" component={User} />
</Switch>
jsx
<Routes>
  <Route path="/" element={<Home />} />
  <Route path="/about" element={<About />} />
  <Route path="/users/:id" element={<User />} />
</Routes>

インポートの変更

jsx
// v5以前
import { Switch, Route } from 'react-router-dom';

// v6
import { Routes, Route } from 'react-router-dom';

追加の改善点

React Router v6では、以下のような便利な機能が追加されています:

  • 相対パスとリンクの改善
  • ネストされたルートのサポート強化
  • フックAPIの拡充(useNavigate, useParamsなど)

まとめ

React Router v6への移行は、以下の手順で行います:

  1. SwitchRoutesに置き換え
  2. componentプロパティをelementプロパティに変更
  3. JSX形式でコンポーネントを渡す(<Component />
  4. exactプロパティを削除

最新のReact Router v6の詳細については、公式ドキュメントを参照してください。

プロフェッショナルなアドバイス

新しいプロジェクトでは常に最新バージョンのReact Routerを使用し、既存のプロジェクトも計画的にアップグレードすることをお勧めします。これにより、最新の機能とセキュリティアップデートを利用できます。