React.jsのページ遷移の基本
ページ遷移の際には、react-router-domを使います。Node.jsでインストールして、React.jsのプロジェクトでimportして使います。
React.jsを解説しているサイトでは、ルーティングと呼びます。
今回作るプログラムの例
こちらの例で、ページ遷移のやり方を見ていきます。
- ページは、
//page2//page/3/の3つ /には、/page/2/に遷移するボタンがある/page/2/には、/page/3/に遷移するボタンがある/page/3/には、/に遷移するボタンがある
ルーティングの準備
React.jsでページ遷移の機能を使うにはreact-router-domをインストールするのが一般的です。
react-router-domをインストールする
ターミナルから下記のコマンドを実行します。
npm install react-router-dom
メインの.jsだけで書く場合
では、ここからは実際にページ遷移のあるReact.jsのプロジェクトを作っていきます。
HTMLでWebサイトを作るときには、ページは物理的に.htmlファイルを置いて作っていきますが、React.jsの場合には.htmlを増やすのではなく、ページのURLに応じてコンポーネントを出し分けるという考え方です。
まず最初に、メインのプログラムファイルになるindex.jsに各ページのコンテンツを書く方法を見ていきます。
ファイルに書くプログラム
- /src/index.js
-
import React from "react"; import ReactDOM from "react-dom"; import { BrowserRouter, Routes, Route, useNavigate } from "react-router-dom"; const App = () => { return ( <BrowserRouter> <Routes> <Route path="/" element={<Page1/>}/> <Route path="/page2/" element={<Page2/>}/> <Route path="/page3/" element={<Page3/>}/> </Routes> </BrowserRouter> ); } // 1ページ目の内容 const Page1 = () => { const navigate = useNavigate(); return ( <div> <p>ページ1</p> <button onClick={() => navigate('/page2')}>ページ2に進む</button> </div> ); } // 2ページ目の内容 const Page2 = () => { const navigate = useNavigate(); return ( <div> <p>ページ2</p> <button onClick={() => navigate('/page3')}>ページ3に進む</button> </div> ); } // 3ページ目の内容 const Page3 = () => { const navigate = useNavigate(); return ( <div> <p>ページ3</p> <button onClick={() => navigate('/')}>ページ1に戻る</button> </div> ); } ReactDOM.render( <App />, document.getElementById('root') );
ページ毎にコンポーネントを分ける場合
React.jsでは、基本的にはコンポーネントを部品としてファイルを分けながら開発していくので、ページ毎にコンポーネントを分ける方法のほうが現実的です。
こちらの例では、/src/index.jsだけでページ遷移のプログラムを書いていたものを、ページ別にコンポーネントファイルにわけて作ってみます。
コンポーネントファイルの分け方の例
| ファイル | そのページですること |
|---|---|
| /src/index.js | /src/Routers.jsxに連結させて、ページURLに応じてコンテンツを表示させるようにする |
| /src/Routers.jsx | ページのURLを見て、どのコンポーネントを呼び出すかを書く |
| /src/Page1.jsx | ページ1の内容を表示させるコンポーネント |
| /src/Page2.jsx | ページ2の内容を表示させるコンポーネント |
| /src/Page3.jsx | ページ3の内容を表示させるコンポーネント |
それぞれのファイルに書くプログラム
- /src/index.js
-
import React from "react"; import ReactDOM from "react-dom"; import Routers from './Routers'; const App = () => { return ( <div> <Routers /> </div> ); } ReactDOM.render( <App />, document.getElementById('root') );
- /src/Routers.jsx
-
import { BrowserRouter, Routes, Route } from "react-router-dom"; import Page1 from "./Page1"; import Page2 from "./Page2"; import Page3 from "./Page3"; const Routers = () => { return ( <BrowserRouter> <Routes> <Route path="/" element={<Page1/>}/> <Route path="/page2/" element={<Page2/>}/> <Route path="/page3/" element={<Page3/>}/> </Routes> </BrowserRouter> ); } export default Routers;
- /src/Page1.jsx
-
import { useNavigate } from "react-router-dom"; const Page1 = () => { const navigate = useNavigate(); return ( <div> <p>ページ1</p> <button onClick={() => navigate('/page2')}>ページ2に進む</button> </div> ); } export default Page1;
- /src/Page2.jsx
-
import { useNavigate } from "react-router-dom"; const Page2 = () => { const navigate = useNavigate(); return ( <div> <p>ページ2</p> <button onClick={() => navigate('/page3')}>ページ3に進む</button> </div> ); } export default Page2;
- /src/Page3.jsx
-
import { useNavigate } from "react-router-dom"; const Page3 = () => { const navigate = useNavigate(); return ( <div> <p>ページ3</p> <button onClick={() => navigate('/')}>ページ1に戻る</button> </div> ); } export default Page3;