久しぶりに React での開発をしていると、ここ数年で過去の知識が使えなくなっていました。それくらい普通やろ!って感じかもしれませんが、自分向けのメモということで React Router に関して書いておきます。
URL の取り扱い
前回紹介をした Vite に関して標準的な動きを確認していきます。まだプロジェクトを作っただけでは、URL に /test とか /hello とかを記述しても同じページが表示されます。
URL に合わせてページの内容を変更するのに便利な機能として、React Router があります。今回はこれを利用できるようにしていきます。
モジュールのインストール
インストールは非常に簡単で、以下のようにコマンドラインでインストールを実行してください。
npm install --save react-router-dom
ファイルの作成
続いて src/routes のフォルダを作成し、以下の3つのファイルを作成します。
// Home.tsx
import { Link } from "react-router-dom";
const Home = () => {
return (
<div>
<h1>Home Page</h1>
<ul>
<li><Link to={"/profile"}>Profile</Link></li>
</ul>
</div>
);
};
export default Home;
// UserProfile.tsx
import { Link } from "react-router-dom";
const UserProfile = () => {
return (
<div>
<h1>User Profile</h1>
<Link to={"/"}>Home</Link>
</div>
);
};
export default UserProfile;
// NotFound.tsx
import { Link } from "react-router-dom";
const NotFound= () => {
return (
<div>
<h1>Page not found</h1>
<Link to={"/"}>Home</Link>
</div>
);
};
export default NotFound;
続いて App.tsx のファイルを大幅に書き換えました。なお v5 までは Switch で切り替える記述方法でしたが、v6 からは Routes を利用する形となっています。古いサンプルとかの記事も多いのでご注意ください。
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
import Home from './routes/Home';
import UserProfile from './routes/UserProfile';
import NotFound from './routes/NotFound';
import Detail from './routes/Detail';
function App() {
return (
<Router>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/profile" element={<UserProfile />} />
<Route path="*" element={<NotFound />} />
</Routes>
</Router>
);
}
export default App;
ではこれで動かすと、まず Home.tsx のデータを元にページが開きます。
Profile のリンクをクリックすると、UserProfile.tsx で記述しているコードを元にページが表示されます。
定義していない URL を直接入力すると NotFound.tsx で記述しているコードで動作します。
URL を利用してページに値を渡す
最後にパラメーターを URL を利用して渡す手順を紹介します。まず、以下のファイルを src/routes の下に作成してください。
// Detail.tsx
import { Link, useParams } from "react-router-dom";
const Detail = () => {
const { itemid } = useParams();
return (
<div>
<h1>Detail</h1>
<p>Item ID: {itemid}</p>
<Link to={"/"}>Home</Link>
</div>
);
};
export default Detail;
また Home.tsx には以下の2行のリンクを追加します。
<li><Link to={"/detail/sample"}>Sample 1</Link></li>
<li><Link to={"/detail/sample2"}>Sample 2</Link></li>
上記のページを有効にするために、
import Detail from './routes/Detail';
...
<Route path="/detail/:itemid" element={<Detail />} />
反映させたあとページにアクセスをしてください。Sample 1 をクリックしたときは以下のように変わります。
まとめ
私の持っていた知識が古かったのと、react-router-dom の v5 のブログを見てうまく動かなくて、v6 だとこういう書き方、というのがわかったのでメモとして記載しました。