🌊
react-router v6でページ遷移を実装してみた
ポートフォリオを作成しているなかでページ遷移をreact-routerで実装したいと思い、いろいろ調べながら作りました。後で見返せるようにメモとして残しておきます。
やりたいこと
トップ画面に各ページへ遷移できるリンクを設置
クリックして該当ページに飛ぶようにする
react-router-domから以下をimportする
- BrowserRouter
- Route
- Routes
- Link
index.tsx
index.tsx
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { BrowserRouter as Router } from 'react-router-dom';
const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement
);
root.render(
<React.StrictMode>
<Router>
<App />
</Router>
</React.StrictMode>
);
reportWebVitals();
BrowserRouterはエイリアスで Routerという名前にして使用しています
今回はApp.tsxをルーティング対象にするので<App />を<Router>(=BrowserRouter)でラップしています
App.tsx
App.tsx
import React from "react";
import "./App.css";
import { Route, Routes } from "react-router-dom";
import { Career } from "./components/Career/Career";
import { Sns } from "./components/Sns/Sns";
import { SelfStudy } from "./components/SelfStudy/SelfStudy";
import { Application } from "./components/Application/Application";
import { Home } from "./components/Home/Home";
function App() {
return (
<div className="bg-gradient-to-r from-sky-700 from-30% via-sky-800 via-40% to-sky-950 to-70% w-full h-screen">
<Routes>
<Route path="/" element={<Home />}></Route>
<Route path="/Application" element={<Application />}></Route>
<Route path="/Career" element={<Career />}></Route>
<Route path="/Sns" element={<Sns />}></Route>
<Route path="/SelfStudy" element={<SelfStudy />}></Route>
</Routes>
</div>
);
}
export default App;
ここではRoutesとRouteを使用します
(react-router v5ではRoutesではなくSwitchを使用していました)
Routeの中にはpathとelementを指定します。
pathは次のHome.tsxで指定しているtoと同じにしています。
elementには表示するコンポーネントを指定します。
Home.tsx
Home.tsx(トップ画面)
import React from "react";
import { Link } from 'react-router-dom'
export const Home = () => {
const ITEMS = [
{
id: 0,
href: "/Application",
children: "Application",
title: "Application",
description: "Here is a list of applications I have created so far",
},
{
id: 1,
href: "/Career",
children: "Career",
title: "Career",
description: "This is my previous career history",
},
{
id: 2,
href: "/Sns",
children: "Sns",
title: "SNS",
description:
"If you don't mind, please take a look at the various SNS I have listed",
},
{
id: 3,
href: "/SelfStudy",
children: "SelfStudy",
title: "Self-study",
description:
"I am writing about the things I consciously focus on when I study",
},
];
return (
<div className="max-w-5xl h-screen py-32 mx-auto grid grid-cols-2 grid-rows-2 gap-7 justify-around">
{ITEMS.map(({ id, title, href, children, description }) => {
return (
<Link
key={id}
to={href}
className="px-20 py-8 mx-3 text-emerald-500 text-center border-8 border-double border-teal-500 rounded-xl hover:scale-110 duration-1000"
>
<h1 className="text-2xl font-bold text-green-300">
{title} →
</h1>
<p className="w-full mt-2">{description}</p>
</Link>
);
})}
</div>
);
};
ここではLinkを使用します。Linkはaタグのようなものなのでクリックするとurlの末尾がtoで指定したものに変わります。
ITEMSという変数を定義します。その中にオブジェクト形式でいくつかkeyとvalueを定義しておきJSX内でmap関数を使っています。map関数の引数部分は分割代入でITEMS内の各値を受け取りそれをreturn内で代入しています。
Application.tsx(各コンポーネント)
Application.tsx
import React from "react";
export const Application = () => {
return (
<div>Application</div>
);
};
ここは表示したい各コンポーネントになります。中身は適当です。
Discussion