🐕

Next.jsでページごとにレイアウトを使い分ける

2021/10/27に公開

概要

ログインとログイン後のページではレイアウトが異なるケースがよくあります。そういったページごとにレイアウトを使い分ける場合のメモになります。

レイアウトを作る

このようにLaoutコンポーネントを作成する。

LayoutMain.tsx
function LayoutMain({ children }) {
  return <div>{children}</div>
}
export default LayoutMain

以下のようにpages/_app.tsxにLayoutコンポーネントを配置すると、全てのページがレイアウトでラッピングされます。

_app.tsx
import React from 'react'
import LayoutMain from '../layouts/LayoutMain'

function App({ Component, pageProps }) {
  return (
    <LayoutMain>
      <Component {...pageProps} />
    </LayoutMain>
  )
}
export default App

レイアウトを使い分ける

本記事のタイトル回収に行きます。

pagePropsでページが持つプロパティを取得することができます。なのでswitch文でレイアウトの分岐をしその判定にpagePropsのlayout情報を使用するようにします。

_app.tsx
import React from 'react'
import LayoutMain from '../layouts/LayoutMain'

function App({ Component, pageProps }) {
switch (pageProps.layout) {
    case 'main': {
      return (
        <LayoutMain>
          <Component {...pageProps} />
        </LayoutMain>
      )    
    } default: {
      return (
        <Component {...pageProps} />
      )   
      )
    }
  }
}
export default App

上記ではまだlayout情報を持っていないため、各ページ側でgetStaticPropsを記述しlayout情報を持たせる必要があります。

export const getStaticProps = async () => {
  return {
    props: {
      layout: 'main'
    },
  };
};

これで共通レイアウトを作り、ページごとに切り替えることができるようになりました。

Discussion