🔍

【React】v5とv6のルーティングの書き方を比較してみた

に公開

v5とv6共通のファイル構成

src/
├── App.tsx
└── ProductDetail.tsx

v5版のサンプルコード

プロジェクト作成方法
# プロジェクト作成
npx create-react-app my-v5-app --template typescript

# react-router v5 インポート
npm install react-router-dom@5

# TypeScriptのインポート
npm install --save-dev @types/react-router-dom
App.tsx
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import Home from './Home';
import ProductDetail from './ProductDetail';

function App() {
  return (
    <Router>
      <Switch>
        <Route exact path="/" component={Home} />
        <Route path="/products/:id" component={ProductDetail} />
      </Switch>
    </Router>
  );
}

export default App;
ProductDetail.tsx
import React from 'react';
import { useParams } from 'react-router-dom';

function ProductDetail() {
  const { id } = useParams<{ id: string }>();

  return (
    <div>
      <h2>商品詳細ページ</h2>
      <p>商品ID: {id}</p>
    </div>
  );
}

export default ProductDetail;

v6版のサンプルコード

プロジェクト作成方法
# プロジェクト作成
npx create-react-app my-v6-app --template typescript
App.tsx
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Home from './Home';
import ProductDetail from './ProductDetail';

function App() {
  return (
    <Router>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/products/:id" element={<ProductDetail />} />
      </Routes>
    </Router>
  );
}

export default App;
ProductDetail.tsx
import React from 'react';
import { useParams } from 'react-router-dom';

function ProductDetail() {
  const { id } = useParams<{ id: string }>();

  return (
    <div>
      <h2>商品詳細ページ</h2>
      <p>商品ID: {id}</p>
    </div>
  );
}

export default ProductDetail;

v5とv6の違いまとめ

比較ポイント v5 v6
ルーティングの親コンポーネント <Switch> <Routes>
コンポーネント指定方法 component={Home} element={<Home />}
完全一致 exact が必要 完全一致がデフォルトなので exact は不要
propsの渡し方 component では propsが渡せない → render を使う必要がある element={<Comp customProp="value" />} のように簡単に渡せる
入れ子ルート 少し複雑 シンプル
useHistory あり 廃止 → useNavigate に置き換え
TypeScript型サポート @types/react-router-dom が必要 v6では型が最初から入っているので追加不要
よくある間違い exact を忘れる、<Route><Router> の外にある element にコンポーネントをそのまま渡してしまう(例: element={Home}

コードで見るシンプルな比較

v5 v6
<Route exact path="/" component={Home} /> <Route path="/" element={<Home />} />
<Switch>...</Switch> <Routes>...</Routes>
<Route path="/about" render={(props) => <About {...props} />} /> <Route path="/about" element={<About customProp="ok" />} />

Discussion