HOME  >  Web開発 >  【React.js】React Routerで画面遷移をしてみよう

Web開発

【React.js】React Routerで画面遷移をしてみよう

【React.js】React Routerで画面遷移をしてみよう

今回は、React.jsにてReact Routerを使った画面遷移をする方法をご紹介しようと思います。

当ブログでは、筆者が勉強中のReact.jsについて、アウトプットの場として、学んだことを記事にしています。

今まで投稿したReact.jsに関する記事は下記になりますので、是非こちらも合わせてご覧ください。

【React.js】React.jsとは?環境構築やHello World表示までをご紹介
https://www.dailyupblog.com/web_development/1830/

【React.js】React.jsにおけるコンポーネントとpropsの使い方をご紹介!
https://www.dailyupblog.com/web_development/1860/

【React.js】useStateとuseEffectの使い方をご紹介(React hooksを学ぶ)
https://www.dailyupblog.com/web_development/1888/

React Routerの基本

Reactでは、SPA(Single Page Application)の開発が可能ですが、画面遷移に関しては、React Routerライブラリを使用することで、アプリ内に複数ページ(path)を持つWebアプリケーションを作ることができます。

React RouterはReactでのアプリ開発には必須のライブラリですので、早速使い方を学んでいきましょう。

React Routerのインストール

まずは、React Routerをインストールします。

下記コマンドでインストールを行ってください。

//npmの場合
npm install react-router-dom

//yarnの場合
yarn add react-router-dom

これでインストールは完了です。

画面遷移のやり方

早速、画面遷移を実装してみましょう。

まず、ページを4ページほど用意しておきましょう。

今回は、ポートフォリオサイトなどにありそうなページを再現してみます。

Reactのプロジェクトを立ち上げたら、「src」ディレクトリ直下に「components」ディレクトリを作成してください。

その中に下記4つのファイルを作成してください。

◼︎Home.tsx

const Home = () => {
  return (
    <div>
      <h1>Home</h1>
    </div>
  );
};

export default Home;

◼︎About.tsx

const About = () => {
  return (
    <div>
      <h1>About</h1>
    </div>
  );
};

export default About;

◼︎Works.tsx

const Works = () => {
  return (
    <div>
      <h1>Works</h1>
    </div>
  );
};

export default Access;

◼︎Contact.tsx

const Contact = () => {
  return (
    <div>
      <h1>Contact</h1>
    </div>
  );
};

export default Contact;

ここまでできたら、次はApp.tsxを修正していきます。

このApp.tsxでReact Routerを使用していきます。

App.tsxを下記のように修正してください。

import { BrowserRouter, Link, Route, Routes } from "react-router-dom";
import "./App.css";

import About from "./components/About";
import Contact from "./components/Contact";
import Home from "./components/Home";
import Works from "./components/Works";

function App() {
  return (
    <BrowserRouter>
      <div className="App">
        <Link to="/">Home</Link>
        <br />
        <Link to="/about">About</Link>
        <br />
        <Link to="/works">Works</Link>
        <br />
        <Link to="/contact">Contact</Link>
        <br />
        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/about" element={<About />} />
          <Route path="/works/" element={<Works />} />
          <Route path="/contact" element={<Contact />} />
        </Routes>
        {/* <Footer /> */}
      </div>
    </BrowserRouter>
  );
}

export default App;

まず、コード最上部でReact Routerをインポートします。

その際に「BrowserRouter」「Link」「Route」「Routes」をインポートしましょう。

これらはぺーじの表示やリンクに必要なものです。

この中でも「BrowserRouter」は、HTMLのhistory APIを使用して、画面に表示されたページとURLを一致させるものです。

また、作成した4つのページを前もってインポートしておきましょう。

DOM上では、まず全体を<BrowserRouter>タグで囲みます。

各ページへのリンクは<Link>タグで記述します。

aタグでも画面遷移は可能ですが、SPAではLinkタグを使用しましょう。

<Link to="/about">About</Link>

Linkタグはto属性で遷移先ページのパスを記述してください。

そして、<Routes>タグで囲った中に、遷移させる全ページを記述します。

<Route path="/about" element={<About />} />

上記のように記述します。

pathにはページのパスを記述し、elementにはインポートしてきたコンポーネントのタグを記述します。

これでReact Routerが実装できました。

TOPページにHomeが表示されたらOKです。

Aboutリンクをクリックして、Aboutページに遷移されたら成功です。

404 Not Foundページを用意する

React Routerで設定したページ以外にアクセスした場合は、自身で用意した404 Not Foundページを表示させたいと思います。

React Routerでは、Not Foundページも簡単に実装できます。

まず、「components」ディレクトリ内にNotFound.tsxファイルを作成してください。

そして、下記のように記述します。

const NotFound = () => {
  return (
    <div>
      <h1>404 NotFound</h1>
      <p>ページが見つかりませんでした。</p>
    </div>
  );
};

export default NotFound;

そして、App.tsxには下記のように、追記してください。

import { BrowserRouter, Link, Route, Routes } from "react-router-dom";
import "./App.css";

import About from "./components/About";
import Contact from "./components/Contact";
import Home from "./components/Home";
import NotFound from "./components/NotFound"; //追記
import Works from "./components/Works";

function App() {
  return (
    <BrowserRouter>
      <div className="App">
        <Link to="/">Home</Link>
        <br />
        <Link to="/about">About</Link>
        <br />
        <Link to="/works">Works</Link>
        <br />
        <Link to="/contact">Contact</Link>
        <br />
        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/about" element={<About />} />
          <Route path="/works/" element={<Works />} />
          <Route path="/contact" element={<Contact />} />
          <Route path="/*" element={<NotFound />} /> //追記
        </Routes>
      </div>
    </BrowserRouter>
  );
}

export default App;

Routeタグのpathに「/*」というように設定すると、React Routerで設定したページ以外に飛んだ場合にelement属性で指定したコンポーネントを表示します。

elementには先ほど作成したNot Foundページを設定してください。

これで準備完了です。

試しに「http://localhost:3000/aaa」などと、存在しないページにアクセスしてみてください。

Not Foundページが表示されればOKです。

React Routerの応用

続いて、React Routerの応用的な使い方をご紹介します。

パラメーターを付けて画面遷移

React Routerでは、もちろんパラメーター付きで画面遷移させることも可能です。

パラメーターはパスパラメーターとクエリパラメーターの両方で遷移可能です。

パスパラメーター

それでは、まずパスパラメーターからです。

App.tsxを下記のように書き換えてください。

//省略・・・
    <BrowserRouter>
      <div className="App">
        {/* <Header /> */}
        <Link to="/">Home</Link>
        <br />
        <Link to="/about">About</Link>
        <br />
        <Link to="/works/65">Works</Link> //書き換え
        <br />
        <Link to="/contact">Contact</Link>
        <br />
        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/about" element={<About />} />
          <Route path="/works/:id" element={<Works />} /> //書き換え
          <Route path="/contact" element={<Contact />} />
          <Route path="/*" element={<NotFound />} />
        </Routes>
        {/* <Footer /> */}
      </div>
    </BrowserRouter>
//省略・・・

パスパラメーターの設定はRouteに行います。

Routeタグのpath属性の中のリンクの末尾にコロン(:)付きで記述します。

今回は、「id」というパラメーターを持たせてみます。

そして、WorksページにリンクさせるLinkタグに適当に「/works/65」といったような値を付けてみました。

これで試してみます。

ブラウザでページを開き、worksリンクをクリックしてみましょう。

遷移後のURLにパラメーターが付けばOKです。

また、取得したパラメーターを表示することもできます。

遷移先のWorks.tsxを開いて、下記のように記述してください。

import { useParams } from "react-router-dom";

const Works = () => {
  const params = useParams();
  return (
    <div>
      <h1>Works</h1>
      <p>{params.id}</p>
    </div>
  );
};

export default Works;

パラメーターを取得するには、useParamsを使います。

useParamsをインポートしましょう。

useParamsで取得した内容を変数「params」に入れておきます。

今回は、シンプルにパラメーターの値を表示させるので、「params.id」と記述して、値を出力します。

ページ上に、パラメーターが表示されれば、OKです。

クエリパラメーター

続いて、クエリパラメーターを設定する方法です。

クエリパラメーターはLinkタグでリンクにパラメーターを持たせることができます。

例えば下記の例です。

App.tsxを下記のように書き換えてください。

//省略・・・
    <BrowserRouter>
      <div className="App">
        {/* <Header /> */}
        <Link to="/">Home</Link>
        <br />
        <Link to={{ pathname: "/about", search: "?id=25" }}>About</Link> //書き換え
        <br />
        <Link to="/works/65">Works</Link>
        <br />
        <Link to="/contact">Contact</Link>
        <br />
        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/about" element={<About />} />
          <Route path="/works/:id" element={<Works />} />
          <Route path="/contact" element={<Contact />} />
          <Route path="/*" element={<NotFound />} />
        </Routes>
        {/* <Footer /> */}
      </div>
    </BrowserRouter>
//省略・・・

クエリパラメーターは上記のようにLinkタグのto属性の内容を書き換えます。

「pathname」には、リンクパスを記述し、「search」にはURLに付けるクエリパラメーターを記述します。

Aboutページに遷移後にURLの末尾にパラメーターが付いていたら成功です。

また、クエリパラメーターの値を取得するには、useSearchParamsというフックを使います。

下記の例のように取得したパラメーターを表示することも可能です。

「components」ディレクトリ内のAbout.tsxに下記のように追記、書き換えしてください。

import { useNavigate, useSearchParams } from "react-router-dom"; //書き換え

const About = () => {
  const navigate = useNavigate();
  const [searchParams] = useSearchParams(); //追記
  const redirect = () => {
    alert("この後、Contactページにリダイレクトします。");
    navigate("/contact");
  };
  return (
    <div>
      <h1>About</h1>
      <p>{searchParams.get("id")}</p> //追記
      <button onClick={redirect}>Click</button>
    </div>
  );
};

export default About;

useSearchParamsを使い、「get()」で引数にパラメーターを指定することで値を取得できます。

「getAll()」を使うと、すべてのクエリパラメーターの値を取得できます。

ブラウザを確認して、ページ上に、クエリパラメーターの値が表示されればOKです。

リダイレクトをかける

続いては、リダイレクトをかける方法について、ご紹介します。

リダイレクトをかけるには、useNavigateを使用します。

次の例は、何らかの処理の後にリダイレクトをかけるものになります。

今回は、ボタンクリック後にリダイレクトをかけてみましょう。

About.tsxを開いて下記のように記述してください。

import { useNavigate } from "react-router-dom";

const About = () => {
  const navigate = useNavigate();
  const redirect = () => {
    alert("この後、Contactページにリダイレクトします。");
    navigate("/contact");
  };
  return (
    <div>
      <h1>About</h1>
      <button onClick={redirect}>Click</button>
    </div>
  );
};

export default About;

まず、useNavigateを使用するので、これをインポートしておきましょう。

useNavigateの内容を変数「navigate」に入れます。

これで「navigate(“リダイレクト先パス”)」のように記述することで、リダイレクトをかけることができます。

今回は、Aboutページにボタンを設置し、ボタンクリックでアラートを出した後で、Contactページへリダイレクトさせています。

ブラウザで挙動を確認してみましょう。

ブラウザで、Aboutページにアクセスすると「Click」というボタンが設置されています。

これをクリックしてみてください。

アラートが表示され、その後に、Contactページへリダイレクトされれば、成功です。

useLocation

続いては、useLocationについてです。

React Routerでは、このuseLocationを使うことで、現ページのパスを取得することが可能です。

下記は、ヘッダーコンポーネントを作り、ヘッダーに表示ページのパスを表示される例です。

「components」ディレクトリにHeader.tsxファイルを作成してください。

このファイルに下記のように記述してください。

import { useLocation } from "react-router-dom";

const Header = () => {
  const location = useLocation();
  return (
    <header>
      <p>現在のページのパスは {location.pathname} です。</p>
    </header>
  );
};

export default Header;

useLocationをインポートして、useLocationの内容を変数「location」に入れます。

そして、現在のページのパスは「location.pathname」で取得することが可能です。

また、App.tsxにて、このHeaderコンポーネントを呼び出します。

//省略・・・
import Header from "./components/Header"; //追記

function App() {
  return (
    <BrowserRouter>
      <div className="App">
        <Header /> //追記
        <Link to="/">Home</Link>
        <br />
//省略・・・

ブラウザで見てみると、表示ページのパスが表示されます。

このuseLocationを使った、パスの取得は、例えばページ毎の出しわけで、異なるクラスやスタイルを付けたい時だったり、ページごとに表示する要素を出し分けるなどの時に使えると思います。

最後に

いかがだったでしょうか。

今回は、React Routerを使ったReactにおける画面遷移の方法についてご紹介いたしました。

React RouterはReactアプリケーションにおける必須のライブラリですので、是非使いこなしたいところです。

【React.js】React.jsとは?環境構築やHello World表示までをご紹介
https://www.dailyupblog.com/web_development/1830/

【React.js】React.jsにおけるコンポーネントとpropsの使い方をご紹介!
https://www.dailyupblog.com/web_development/1860/

【React.js】useStateとuseEffectの使い方をご紹介(React hooksを学ぶ)
https://www.dailyupblog.com/web_development/1888/

関連記事

関連記事