innerのように、全ページで共有しつつ、でも中身はページごとに異なる、なんていうコンポーネントの書き方
▼基本の書き方
/**
* {children}をpropsとして渡すことで、中に書かれたコンポーネント類をそのままラップして出力する
* ことができる。
*/
export default function Layout(**{ children }**) {
return <div>**{children}**</div>;
}
▼インポート先での書き方
import Link from "next/link";
import Head from "next/head";
import Script from "next/script";
**import Layout from "../../components/layout";**
export default function FirstPost() {
return (
<>
**<Layout>**
<Head>
<title>First Post</title>
</Head>
<Script
src="<https://connect.facebook.net/en_US/sdk.js>"
strategy="lazyOnload"
onLoad={() =>
console.log(`script loaded correctly, window.FB has been populated`)
}
/>
<h1>First Post</h1>
<h2>
<Link href="/">
<a>Back to home</a>
</Link>
</h2>
**</Layout>**
</>
);
}
「Home」ページと他ページで画像のサイズを変更したい! & 下層ページでのみ「ホームへ戻る」リンクを載せたい!
上記Layoutコンポーネント内に最初から画像を入れておきたいとする。(全ページで画像を表示したい)
ただし、Home(トップ)ページと下層ページで画像サイズを変えたい、なんて場合に。
また下層ページでのみ「ホームへ戻る」リンクを載せたい!そんな場合に。
※必要なもの&それに関連するもののみ記述
/**
* childrenには子コンポーネントが引き渡される
*/
import Image from 'next/image';
import styles from './layout.module.css';
import utilStyles from '../styles/utils.module.css';
import Link from 'next/link';
export default function Layout(**{ children, home }**) {
return (
<div className={styles.container}>
<header className={styles.header}>
**{home ? (**
<>
<Image
priority
src="/images/profile.jpg"
className={utilStyles.borderCircle}
height={144}
width={144}
alt={name}
/>
<h1 className={utilStyles.heading2Xl}>{name}</h1>
</>
**) : (**
<>
<Link href="/">
<a>
<Image
priority
src="/images/profile.jpg"
className={utilStyles.borderCircle}
height={108}
width={108}
alt={name}
/>
</a>
</Link>
<h2 className={utilStyles.headingLg}>
<Link href="/">
<a className={utilStyles.colorInherit}>{name}</a>
</Link>
</h2>
</>
**)}**
</header>
<main>**{children}**</main>
**{!home && (**
<div className={styles.backToHome}>
<Link href="/">
<a>← Back to home</a>
</Link>
</div>
**)}**
</div>
);
}
▼インポート側での書き方 例 ※必要なもの&関連するもののみ記述
/**
* <Layout home>で、”home”があった場合の方のJSXがレンダリングされることになる
* <Layout></Layout>の子要素が、{children} に入る
*/
import Layout from '../components/layout';
import utilStyles from '../styles/utils.module.css';
export default function Home() {
return (
<Layout **home**>
<section className={utilStyles.headingMd}>
<p>[Your Self Introduction]</p>
<p>
(This is a sample website - you’ll be building a site like this on{' '}
<a href="<https://nextjs.org/learn>">our Next.js tutorial</a>.)
</p>
</section>
</Layout>
);
}