Terms.js、Privacy.jsの作成
Terms.js
import React from "react";
const Terms = () => {
return (
<div className="max-w-3xl mx-auto px-4 py-10">
<h1 className="text-2xl font-bold mb-6">利用規約</h1>
<p className="mb-4">この利用規約(以下,「本規約」といいます。)は,本サービスの利用条件を定めるものです。</p>
<h2 className="text-xl font-semibold mt-6 mb-2">第1条(適用)</h2>
<p className="mb-4">本規約は,ユーザーと当社との間の本サービスの利用に関わる一切の関係に適用されるものとします。</p>
{/* 以下、項目を必要に応じて追加 */}
</div>
);
};
export default Terms;
Privacy.js
import React from "react";
const Privacy = () => {
return (
<div className="max-w-3xl mx-auto px-4 py-10">
<h1 className="text-2xl font-bold mb-6">プライバシーポリシー</h1>
<p className="mb-4">当社は、ユーザーのプライバシーを尊重し、個人情報の保護に努めています。</p>
<h2 className="text-xl font-semibold mt-6 mb-2">1. 個人情報の取得</h2>
<p className="mb-4">当社は、適正な手段によって、必要な範囲で個人情報を取得します。</p>
{/* 以下、項目を必要に応じて追加 */}
</div>
);
};
export default Privacy;
Footerの作成
Footer.js
import React from "react";
import { Link } from "react-router-dom";
const Footer = () => {
return (
<footer className="text-center text-sm text-gray-500 mt-10 py-4">
<div className="space-x-4">
<Link to="/terms" className="hover:underline">
利用規約
</Link>
<Link to="/privacy" className="hover:underline">
プライバシーポリシー
</Link>
</div>
<div className="mt-2">© {new Date().getFullYear()} YourAppName</div>
</footer>
);
};
export default Footer;
Layout.jsの作成
Layout.js
// src/Layout.jsx
//React:Reactコンポーネントを作るために必要です。
import React from "react";
//Outlet:react-router-dom の機能で、「ここにルーティングで切り替わるページコンポーネントを差し込む」という意味です。
import { Outlet } from "react-router-dom";
import Header from "./Header";
import Footer from "./Footer";
const Layout = () => {
return (
<div className="flex flex-col min-h-screen">
<Header />
<main className="flex-grow pt-20 px-4">
<Outlet /> {/* 各ページがここに表示される */}
</main>
<Footer />
</div>
);
};
export default Layout;
AppRouter.jsにLayout.jsの仕様を追加
AppRouter.js
<Route path="/" element={<Layout user={user} setUser={setUser} />}>
{/* ここにネストされるルートは全て Layout の中で表示される */}
</Route>
• path="/":/(つまり全体のルート)に対して、
• element={}:Layout コンポーネントを表示するようにしています。
• そしてこの の 内側にネストされている Route たち は、すべて の中の の位置に差し込まれます。
Login だけ Layout に含めない理由
React アプリでは、以下のように「どのページでも共通して表示したい要素」があります:
要素 | 例 | Layout の中で表示する理由 |
---|---|---|
ヘッダー | ロゴ・ナビゲーションバー | どのページでも共通表示したい |
フッター | コピーライト・利用リンク | 同上 |
レイアウト構造 | min-h-screen など | 全ページ共通の画面設計 |
これを毎ページ個別に書くと重複が多く、保守性が悪いですが、Layout で一括管理すれば 一度の定義で全ページに適用できます。