React Routerでクライアントルーティングを実装する方法です。
クライアントルーティングとは
従来のルーティングはクライアントからファイルを要求して、サーバー側からレスポンスとして返却されたファイルを表示させることが基本だった。
クライアントルーティングはサーバーにファイルの要求を行わずにクライアント側だけでファイルのルーティングを行うことでファイルを表示させることができる方式です。
イメージがつきやすいように図を用意しました。
従来のルーティングとクライアントルーティングのイメージ
動作環境
エディション | Windows 11 Home |
バージョン | 21H2 |
Node | 18.15.0 |
開発環境
こちらの構成で動かしています。
レイアウト
サイドバーにページ内遷移するリンクを設置。リンクを押すとコンテンツに画面が表示されるシングルページアプリケーション。
構成
src
│ index.jsx
│ Router.jsx
│
├─css
│ demo.css
│
└─pages
Demo.jsx
React Router
React Routerのパッケージをインストール
npm install react-router-dom
createBrowserRouterにルーティング内容を設定する。
path:パス
element:表示させたい内容
errorElement:ルーティングが存在しない場合に表示させたい内容
children:コンポーネント内にコンポーネントを表示させたい場合に指定
index.jsx
import React from 'react'
import * as ReactDOM from 'react-dom/client'
import { Demo } from './pages/Demo'
import { createBrowserRouter, RouterProvider } from 'react-router-dom'
const router = createBrowserRouter([
{
path: '/',
element: <Demo />,
errorElement: <div>error</div>,
children: [
{
path: 'demo',
element: <div>demo</div>,
},
{
path: 'demo/:id',
element: <div>demo1</div>,
},
],
},
])
const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(<RouterProvider router={router} />)
ルートの画面となっています。サイドバーにリンクが二つ、コンテンツにリンクに指定された内容が表示されます。
ソースコードで言うとchildrenに指定したルーティング内容がOutletに表示される。
src/pages/Demo.jsx
import React from 'react'
import { Link, Outlet } from 'react-router-dom'
import {} from '../css/demo.css'
export const Demo = () => {
return (
<div className='main'>
<div className='side'>
<div className='link'>
<Link to={`demo`}>demo</Link>
</div>
<div className='link'>
<Link to={`demo/1`}>demo1</Link>
</div>
</div>
<div className='content'>
<Outlet />
</div>
</div>
)
}
サイドバーとコンテンツ用のcssです。
src/css/demo.css
html {
height: 100%;
margin: 0;
}
body {
margin: 0;
}
ul {
list-style: none;
text-align: left;
}
.side {
background-color: #eeeeee;
width: 150px;
height: 100vh;
text-align: center;
}
.content {
width: 100%;
height: 300px;
text-align: center;
}
.main {
display: flex;
}
.link a {
text-decoration: none;
}
.link:hover a {
text-decoration: underline;
}
ルーティングの結果
/
/demo
/demo/1
/error
リファクタリング
ルーティング処理をコンポーネント化しました。
index.jsx
import React from 'react'
import * as ReactDOM from 'react-dom/client'
import { RouterProvider } from 'react-router-dom'
import { router } from './Router'
const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(<RouterProvider router={router} />)
Router.jsx
import { createBrowserRouter } from 'react-router-dom'
import { Demo } from '../src/pages/Demo'
export const router = createBrowserRouter([
{
path: '/',
element: <Demo />,
errorElement: <div>error</div>,
children: [
{
path: 'demo',
element: <div>demo</div>,
},
{
path: 'demo/:id',
element: <div>demo1</div>,
},
],
},
])
src/Router.jsxをさらにリファクタリングしてみました。
createRoutesFromElementsを使うとJSX構文で書けるようになります。
Routeでネストしたことによって親子関係もわかりやすくなりました。
import React from 'react'
import { Route, createBrowserRouter, createRoutesFromElements } from 'react-router-dom'
import { Demo } from '../src/pages/Demo'
export const router = createBrowserRouter(
createRoutesFromElements(
<Route path={'/'} element={<Demo />} errorElement={<div>error</div>}>
<Route path={'demo'} element={<div>demo</div>} />
<Route path={'demo/:id'} element={<div>demo1</div>} />
</Route>
)
)
今回学んだこと
クライアントルーティング
React Routerの設定方法
シングルページアプリケーションの基本
サイドバーがある画面の作成方法
おすすめの書籍
JavaScriptのおすすめの書籍です。
おすすめのUdemy講座
ReactでおすすめのUdemy講座です。
モダンJavaScriptの基礎から始める挫折しないためのReact入門
ReactはJavaScriptの基本的な構文を使用するため、Reactだけの理解では足りないでしょう。
こちらのReact講座は、JavaScriptでのTODOアプリを作成してからReactでのTODOアプリを作成するため、ReactだけではなくJavaScriptを基礎から学ぶことができます。
Reactからいきなり入らずにJavaScriptの基礎から学べる点が、初心者にとてもおすすめできる内容となっています。
【Reactアプリ開発】3種類のReactアプリケーションを構築して、Reactの理解をさらに深めるステップアップ講座
APIを使用してデータを取得したり、react-router-domでのページ遷移を学べるためより実践的な内容となっています。
3種類のReactアプリケーションを作成することができるため、Reactの基礎的な内容を学んだ人におすすめです。
基本的に構文が載っているため、教科書代わりに使える内容となっています。
Reactの前にとてもお世話になりました。JavaScriptをこれから始める方におすすめです。