REACT Router

# React Router
React Router は、React アプリケーションにおいてクライアントサイドルーティングを管理するための強力なライブラリです。以下に、React Router の基本的な概念と使用方法の例を示します。

#### React Router のインストール
まず、Web アプリケーション用の React Router バージョンである react-router-dom をインストールします：
```
npm install react-router-dom
```

#### 基本的な使い方
以下は、React アプリケーションで React Router を設定して使用する簡単な例です。
```
import React from 'react';
import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom';

const Home = () => <h2>ホーム</h2>;
const About = () => <h2>アバウト</h2>;
const Dashboard = () => <h2>ダッシュボード</h2>;

function App() {
  return (
    <Router>
      <div>
        <nav>
          <ul>
            <li>
              <Link to="/">ホーム</Link>
            </li>
            <li>
              <Link to="/about">アバウト</Link>
            </li>
            <li>
              <Link to="/dashboard">ダッシュボード</Link>
            </li>
          </ul>
        </nav>

        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/about" element={<About />} />
          <Route path="/dashboard" element={<Dashboard />} />
        </Routes>
      </div>
    </Router>
  );
}

export default App;

```
#### 動的ルーティング
React Router は、URL パラメータを使用して動的ルーティングをサポートしています。
```
import React from 'react';
import { BrowserRouter as Router, Routes, Route, Link, useParams } from 'react-router-dom';

const Home = () => <h2>ホーム</h2>;
const About = () => <h2>アバウト</h2>;

const User = () => {
  const { id } = useParams();
  return <h2>ユーザーID: {id}</h2>;
};

function App() {
  return (
    <Router>
      <div>
        <nav>
          <ul>
            <li>
              <Link to="/">ホーム</Link>
            </li>
            <li>
              <Link to="/about">アバウト</Link>
            </li>
            <li>
              <Link to="/user/123">ユーザー123</Link>
            </li>
            <li>
              <Link to="/user/456">ユーザー456</Link>
            </li>
          </ul>
        </nav>

        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/about" element={<About />} />
          <Route path="/user/:id" element={<User />} />
        </Routes>
      </div>
    </Router>
  );
}

export default App;

```
#### ルートリダイレクト
リダイレクトを行うために Navigate コンポーネントを使用できます。
```
import React from 'react';
import { BrowserRouter as Router, Routes, Route, Link, Navigate } from 'react-router-dom';

const Home = () => <h2>ホーム</h2>;
const About = () => <h2>アバウト</h2>;
const Dashboard = () => <h2>ダッシュボード</h2>;

function App() {
  return (
    <Router>
      <div>
        <nav>
          <ul>
            <li>
              <Link to="/">ホーム</Link>
            </li>
            <li>
              <Link to="/about">アバウト</Link>
            </li>
            <li>
              <Link to="/dashboard">ダッシュボード</Link>
            </li>
            <li>
              <Link to="/old-dashboard">旧ダッシュボード (リダイレクト)</Link>
            </li>
          </ul>
        </nav>

        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/about" element={<About />} />
          <Route path="/dashboard" element={<Dashboard />} />
          <Route path="/old-dashboard" element={<Navigate to="/dashboard" />} />
        </Routes>
      </div>
    </Router>
  );
}

export default App;

```
#### ルートガードと保護されたルート
useNavigate フックを使用してルートガードや保護されたルートを実装できます。
```
import React from 'react';
import { BrowserRouter as Router, Routes, Route, Link, useNavigate } from 'react-router-dom';

const Home = () => <h2>ホーム</h2>;
const About = () => <h2>アバウト</h2>;

const Dashboard = () => {
  const navigate = useNavigate();
  const isAuthenticated = false; // 認証されていないと仮定

  if (!isAuthenticated) {
    navigate('/');
  }

  return <h2>ダッシュボード</h2>;
};

function App() {
  return (
    <Router>
      <div>
        <nav>
          <ul>
            <li>
              <Link to="/">ホーム</Link>
            </li>
            <li>
              <Link to="/about">アバウト</Link>
            </li>
            <li>
              <Link to="/dashboard">ダッシュボード</Link>
            </li>
          </ul>
        </nav>

        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/about" element={<About />} />
          <Route path="/dashboard" element={<Dashboard />} />
        </Routes>
      </div>
    </Router>
  );
}

export default App;

```
#### ルート変更の監視
useNavigate と useEffect フックを使用してルート変更を監視できます。
```
import React, { useEffect } from 'react';
import { BrowserRouter as Router, Routes, Route, Link, useNavigate } from 'react-router-dom';

const Home = () => <h2>ホーム</h2>;
const About = () => <h2>アバウト</h2>;

const Dashboard = () => <h2>ダッシュボード</h2>;

function App() {
  const navigate = useNavigate();

  useEffect(() => {
    const handleRouteChange = (url) => {
      console.log('ルートが変更されました:', url);
    };

    // ルート変更の監視
    navigate.listen(handleRouteChange);

    return () => {
      // 監視の解除
      navigate.remove(handleRouteChange);
    };
  }, [navigate]);

  return (
    <Router>
      <div>
        <nav>
          <ul>
            <li>
              <Link to="/">ホーム</Link>
            </li>
            <li>
              <Link to="/about">アバウト</Link>
            </li>
            <li>
              <Link to="/dashboard">ダッシュボード</Link>
            </li>
          </ul>
        </nav>

        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/about" element={<About />} />
          <Route path="/dashboard" element={<Dashboard />} />
        </Routes>
      </div>
    </Router>
  );
}

export default App;

```