アルアカ - Arcadia Academia

Arcadia Academiaは「エンジニアリングを楽しむ」を合言葉に日本のデジタル競争力を高めることをミッションとするテックコミュニティです。

Reactの応用技術:React Router編

Featured image of the post

Reactで複雑なアプリケーションを作成する際に、ユーザーが異なるページに移動できるようにするためのツールがReact Routerです。React Routerは、シングルページアプリケーション(SPA)のルーティングを簡単に管理するためのライブラリで、特に複雑なページ遷移やダイナミックなURL管理に役立ちます。また、React RouterとHooksを組み合わせることで、状態管理や副作用の処理がさらに柔軟になります。本記事では、React Routerの基本とHooksを使った応用的なルーティング技術について解説します。

1. React Routerの基本

React Routerは、SPAでページ遷移を可能にするためのライブラリです。通常、Webアプリケーションでは複数のHTMLファイルを使ってページを切り替えますが、SPAではページ全体を再読み込みすることなく、必要なコンポーネントだけをレンダリングします。

基本的なセットアップ

まずは、React Routerをインストールし、基本的なルーティングを設定してみましょう。

npm install react-router-dom

インストール後、BrowserRouterRouteLinkを使ってルーティングを設定します。

import React from "react";
import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom";

function Home() {
  return <h2>ホームページ</h2>;
}

function About() {
  return <h2>Aboutページ</h2>;
}

function App() {
  return (
    <Router>
      <nav>
        <Link to="/">ホーム</Link>
        <Link to="/about">About</Link>
      </nav>

      <Switch>
        <Route exact path="/" component={Home} />
        <Route path="/about" component={About} />
      </Switch>
    </Router>
  );
}

export default App;
コードのポイント
  • BrowserRouter: Reactアプリ全体をラップし、ルーティング機能を提供します。
  • Route: 特定のURLパスに対応するコンポーネントを表示します。
  • Link: クリックでURLを変更し、指定されたパスに遷移します。
  • Switch: 複数のRouteを管理し、最初に一致するルートをレンダリングします。
2. Hooksを使ったReact Routerの活用

React Routerは、通常のルーティング機能に加えて、Hooksを使ってルートに関する情報を取得したり、プログラム的にルートを操作したりすることができます。

useHistoryフックでルーティング操作

useHistoryフックは、プログラムでルートを遷移させたい場合に使用します。例えば、フォーム送信後に特定のページにリダイレクトする場合などに便利です。

import React from "react";
import { useHistory } from "react-router-dom";

function Login() {
  const history = useHistory();

  function handleLogin() {
    // ログイン処理が成功した場合、ホームページへリダイレクト
    history.push("/");
  }

  return (
    <div>
      <h2>ログインページ</h2>
      <button onClick={handleLogin}>ログイン</button>
    </div>
  );
}

export default Login;
useParamsフックで動的なパラメータを取得
  • *useParams*フックは、URLの動的な部分を取得するために使用されます。例えば、ユーザーIDに基づいてプロフィールページを表示する場合に活用します。
import React from "react";
import { useParams } from "react-router-dom";

function UserProfile() {
  const { userId } = useParams();

  return <h2>ユーザーID: {userId}</h2>;
}

export default UserProfile;
  • useParamsを使うことで、URLパラメータ(/users/:userIdなど)から動的なデータを取得し、それに基づいた処理が行えます。
useLocationフックで現在のURL情報を取得
  • *useLocation*フックは、現在のURLに関する詳細な情報(パス、検索クエリなど)を取得するために使用します。
import React from "react";
import { useLocation } from "react-router-dom";

function QueryParams() {
  const location = useLocation();

  return (
    <div>
      <h2>現在のURLパス: {location.pathname}</h2>
      <p>クエリ: {location.search}</p>
    </div>
  );
}

export default QueryParams;
  • useLocationを使えば、ページの検索クエリ(例:?search=term)を取得して処理に利用できます。
3. Protected Route(認証付きルート)

Webアプリケーションでは、特定のルートにアクセスできるユーザーを制限する場合があります。これをProtected Route(保護されたルート)として実装し、認証されていないユーザーがログインページへリダイレクトされるように設定します。

import React from "react";
import { Route, Redirect } from "react-router-dom";

// ログイン済みかどうかをチェックする関数
function isAuthenticated() {
  return localStorage.getItem("authToken") !== null;
}

function ProtectedRoute({ component: Component, ...rest }) {
  return (
    <Route
      {...rest}
      render={(props) =>
        isAuthenticated() ? <Component {...props} /> : <Redirect to="/login" />
      }
    />
  );
}

export default ProtectedRoute;
  • ProtectedRouteは、認証されているかどうかをチェックし、認証されていない場合は/loginページにリダイレクトします。
使用例
<ProtectedRoute path="/dashboard" component={Dashboard} />
  • 上記のように設定すると、/dashboardへのアクセスは認証済みのユーザーに限定され、そうでない場合はログインページにリダイレクトされます。
4. useRouteMatchでネストされたルートを処理
  • *useRouteMatch*は、ネストされたルートや複数のルートにマッチするかどうかを確認するためのフックです。たとえば、商品カテゴリごとの詳細ページを表示するような場合に役立ちます。
import React from "react";
import { useRouteMatch, Link, Route } from "react-router-dom";

function Categories() {
  const { path, url } = useRouteMatch();

  return (
    <div>
      <h2>カテゴリ</h2>
      <ul>
        <li>
          <Link to={`${url}/electronics`}>エレクトロニクス</Link>
        </li>
        <li>
          <Link to={`${url}/fashion`}>ファッション</Link>
        </li>
      </ul>

      <Route path={`${path}/:categoryName`}>
        <Category />
      </Route>
    </div>
  );
}

function Category() {
  const { categoryName } = useParams();
  return <h3>選択したカテゴリ: {categoryName}</h3>;
}

export default Categories;
  • useRouteMatchを使うと、現在のルート情報に基づいて動的にURLやパスを作成できます。
  • 商品カテゴリに応じた詳細ページが、ネストされたルートで表示されます。
5. React Router Hooksとパフォーマンス最適化

ルーティングが複雑になると、アプリケーションのパフォーマンスにも影響を与える可能性があります。そこで、React.memouseMemoを使って、再レンダリングの回数を最適化する方法も重要です。特定のルートでの状態や処理をキャッシュし、必要なときにだけ再計算することで、アプリケーションの効率を上げることができます。

import React, { useMemo } from "react";
import { useLocation } from "react-router-dom";

function ExpensiveComponent() {
  const location = useLocation();

  const expensiveCalculation = useMemo(() => {
    // コストのかかる計算
    return heavyCalculation(location.pathname);
  }, [location.pathname]);

  return <div>{expensiveCalculation}</div>;
}
  • useMemoを使って、計算処理が不要な再レンダリングを避けることで、アプリのパフォーマンスを向上させます。
まとめ

React RouterとHooksを組み合わせることで、より柔軟でパワフルなルーティングが可能になります。useHistoryuseParamsuseLocationなどのHooksを活用することで、ページ遷移や動的なURL処理がシンプルに行えるようになります。また、認証付きルートやネストされたルートの管理も簡単に実装でき、リアルなWebアプリケーションを構築するための重要なツールとなります。これらのテクニックを使いこなして、Reactアプリケーションのルーティングをさらに強化していきましょう。

フロントエンド開発を学びたいですか?

React・Next.jsなど、モダンなフロントエンド開発をサポートします。

  • Reactの基礎から実践まで学びたい
  • Next.jsでアプリを作りたい
  • TypeScriptを使いこなしたい
まずは30分の無料相談

相談は完全無料・オンラインで気軽に

あなたを爆速で成長させるメンタリングプログラムはこちら

メンタープログラムバナー

React・フロントエンドを本格的に学ぶなら

テックアカデミー
無料相談はこちら