【Next.js】【Typescript】ページレイアウトを作成して表示する

自分用のメモ

環境の準備

実行環境

  • VS code:v1.62.3
  • Node.js:v14.17.3
  • React:v17.0.2
  • Typescript:v4.1.6

プロジェクトの作成(Typescriptで作成)

Next Create Appで作成します。

こちらの記事(Javascript)をTypescriptで再構成したものです。

pagesフォルダ配下のソース

初期ページの作成

  • 9~16行目の内容が、Layoutコンポーネントの中で「props.children」で参照できます。
import type { NextPage } from 'next'
import Link from 'next/link'
import Layout from './components/layout'

const Home: NextPage = () => {
  return (
    <div>
      <Layout title='Top page.'>
        <div className='alert alert-primary text-center'>
          <h5 className='mb-4'>Welcome to next.js!</h5>
          <Link href='./other'>
            <button className='btn btn-primary'>
              go to Other >>
            </button>
          </Link>
        </div>
      </Layout>
    </div>
  )
}

export default Home

遷移先のページ作成

import type { NextPage } from 'next'
import Link from 'next/link'
import Layout from './components/layout'

const Other: NextPage = () => {
  return (
    <div>
      <Layout title='Other page.'>
        <div className='alert alert-primary text-center'>
          <h5 className='mb-4'>This is Other page...</h5>
          <Link href='.'>
            <button className='btn btn-primary'>
              << Back to Top
            </button>
          </Link>
        </div>
      </Layout>
    </div>
  )
}

export default Other

pages/components配下のソース

ページを構成するレイアウト

  • 19行目の「props.children」で呼び出し元のinnerHTMLが参照できます。
import { DetailedHTMLProps, HTMLAttributes } from 'react'
import styles from '../../styles/Home.module.css'
import Header from "./header"
import Footer from "./footer"

type LayoutPropsType = {
  title: string
  children: DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>
}
const Layout = (props: LayoutPropsType) => {
  return (
    <div>
      <Header title={props.title} />
      <div>
        <h1 className='bg-primary px-3 text-white display-4 text-right'>Next.js × Typescript</h1>
      </div>
      <div className='container'>
        <h3 className='my-3 text-primary text-center'>{props.title}</h3>
        {props.children}
      </div>
      <Footer footer='copyright ???' />
    </div>
  )
}

export default Layout
import Head from "next/head"

type HeaderPropsType = {
  title: string
}
const Header = (props: HeaderPropsType) => {
  return (
    <Head>
      <title>{props.title}</title>
      <link rel='stylesheet' href='https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css' crossOrigin='anonymous'></link>
    </Head>
  )
}

export default Header
type FooterPropsType = {
  footer: string
}
const Footer = (props: FooterPropsType) => {
  return (
    <div className='text-center h6 my-4'>
        <div>{props.footer}</div>
    </div>
  )
}

export default Footer

あとがき

特になし

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です