【React】react-router-dom v6 ページ遷移 useRouter
概要
react-router-domのv6からrouterの書き方が変わったようなので備忘録
404ページ(自動でトップページに戻る)処理も実装しました。
インストール
npm install react-router-dom
コード説明
作成するページ
今回は以下のページを作成します。
・Home
・Page1
・Page2
・Page404
Routesの設定
まずはApp.jsの説明をします。
import { BrowserRouter, Routes, Route } from "react-router-dom";
import Home from "./Home";
import Page1 from "./Page1";
import Page2 from "./Page2";
import Page404 from "./Page404";
export default function App() {
return (
<BrowserRouter>
<Routes>
<Route path={`/`} element={<Home />} />
<Route path={`/Page1`} element={<Page1 />} />
<Route path={`/Page2`} element={<Page2 />} />
<Route path={`/*`} element={<Page404 />} />
</Routes>
</BrowserRouter>
);
}
ここで各ページのURLを設定をします。
Routesの中に各ページのRouteを記述します。
pathは'/'がトップページになります。その他のページは好きなURLを記述しましょう。
後で説明しますが'/*'はURLがどこのページにも該当しない場合にそのページへ行きます。
elementには表示したいページのコンポーネントを設定しましょう。
ページ遷移
ページ遷移の方法を説明します。
import { useNavigate } from "react-router-dom";
const Home = () => {
const navigate = useNavigate();
const onClickPage1 = () => {
navigate("/Page1");
};
const onClickPage2 = () => {
navigate("/Page2");
};
const onClickPage404 = () => {
// 適当なURLに飛んでみる
const str = Math.random().toString(32).substring(2);
navigate(`/${str}`);
};
return (
<div className="Home">
<h1>Home Page</h1>
<button onClick={onClickPage1}>Page1</button>
<p></p>
<button onClick={onClickPage2}>Page2</button>
<p></p>
<button onClick={onClickPage404}>Page404</button>
</div>
);
};
export default Home;
Home.jsxの全体のコードは↑ですが、処理は同じことを各ページにやってるだけなので最初の方だけ見ればOKです。
ページの遷移にはuseNavigateを使います。
const navigate = useNavigate();でuseNavigateを使えるようにして、navigate(遷移先のURL)でページ遷移できます。
以上です。簡単でありがたい…
404ページ
最後に404ページの説明をします。
404ページに飛ぶ条件はサイトによって色々あると思いますが、今回は/Page1と/Page2以外のURLを入力された場合に飛ばしてみます。
export default function App() {
return (
<BrowserRouter>
<Routes>
<Route path={`/`} element={<Home />} />
<Route path={`/Page1`} element={<Page1 />} />
<Route path={`/Page2`} element={<Page2 />} />
<Route path={`/*`} element={<Page404 />} />
</Routes>
</BrowserRouter>
);
}
最初の方で説明しましたが、Routeのpathに'/*'を設定するとどこのページにも該当しない場合にそのページへ行きます。今回はelementにPage404を設定しているので404ページに飛ぶということですね。
const Home = () => {
const navigate = useNavigate();
const onClickPage404 = () => {
// 適当なURLに飛んでみる
const str = Math.random().toString(32).substring(2);
navigate(`/${str}`);
};
return (
<div className="Home">
<h1>Home Page</h1>
<button onClick={onClickPage404}>Page404</button>
</div>
);
};
↑はHome.jsxの404に飛ぶ処理だけ抜粋してます。
navigateに渡してるURLが適当な文字列なので偶然Page1やPage2の文字列が生成されない限りは404ページに飛びます。
もしくはcodesandboxで適当なURLを入力すると実際に404ページへ飛ぶのが確認できます。
最後に自動でトップページへ戻る処理を紹介します。
import React, { useState, useEffect } from "react";
import { useNavigate } from "react-router-dom";
const Page404 = () => {
const [time, setTime] = useState(3);
const navigate = useNavigate();
useEffect(() => {
setTimeout(() => {
const sec = time - 1;
setTime(sec);
if (sec === 0) {
navigate("/");
}
}, 1000);
});
return (
<div className="Page404">
<h1>Page404</h1>
{time}秒後自動でHomeへ移る
</div>
);
};
export default Page404;
色々試した結果こうなりましたが、〇秒後に戻る表示をカウントダウンしないならuseStateで時間持つ必要ないので↓のように簡単な処理になります。
const Page404 = () => {
const navigate = useNavigate();
useEffect(() => {
setTimeout(() => {
navigate("/");
}, 3000);
});
return (
<div className="Page404">
<h1>Page404</h1>
3秒後自動でHomeへ移る
</div>
);
};
以上です。
Discussion