作成日:2024-01-18
Nextjs13で新しくなったapp routeの共有のレイアウト設定で_app,_documentの代わりにtemplate,layoutを使う
Next.jsのappルートにした場合_appが使えなくなり、代わりにtemplateとlayoutになった。 そのため、共有のレイアウト、ページ全体に反映させたい場合はtemplateまたは、layoutを使うことで解決する。
ページ全体に適用させるtemplateとlayoutの違いは再レンダリングするか、しないかの違いがある。ページ移行時、layoutは再レンダリングせず。templateは再レンダリングされる。
そのため、パフォーマンスを考慮するならlayoutを使う方がよい。
両方とも使い方がほとんど一緒です。
とりあえずファイル名を間違えない、childrenを記入する2点を気を付ければ大丈夫です。
import './globals.css'
export default function Layoutdesu({
children
}: {
children: React.ReactNode
}) {
return (
<html lang="jp">
<body>
<p>Layout.tsxがインポートされている</p>
{children}
</body>
</html>
)
}
"use client";
import { SessionProvider } from "next-auth/react"
export default function Template({ children, session }: { children: React.ReactNode, session: any }) {
return (
<div>
<SessionProvider session={session}>
<p>TEMPLATEがインポートされている</p>
{children}
</SessionProvider>
</div>
)
}
とりあえずlayout,templateは以下のようにchildrenを記入すればなんとかなります。
export default function Tenpure({children}) {
return (
<>
{children}
</>
)}
layoutは静的な場面、useeffectとかstate(状態)を使用しない時にこのlayoutを使う。
各プロジェクトで状況が異なるので何とも言えないが、参考までに例として
上記のようなcss,htmlだけで完結する静的画面で使われる。
反対にtemplateは再レンダリングが必要な場合使う。
例として
ページを移行した際、変化が必要な場合はこのtemplateを使う。
react開発の際、○○Providerというものを使う場合もこのtemplateに記入する必要がある。
CookiesProvider,SessionProvider,QueryClientProvider等
layout,templateは基本的にディレクトリー内のすべてのページに適応されます。
が、サブフォルダー、ディレクトリーであるが共有のテンプレートから除きたい場合はかっこで囲むことで解決します。
以下のようにすることでルート(/)はmainのテンプレートを
sub(/sub)ページ以下はtest内のテンプレートで表示されます。
├app
├(main)
├layout.tsx
├page.tsx
└template.tsx
├(test)
├sub
└page.tsx
├layout.tsx
└template.tsx
├next.config.js
├package.json
├public
├node_modules
開発時は、とりあえずtemplateを使ってみる。
layoutを使ってみると、動かない、なんかエラーが出てしまってもtemplateを使えばすんなり解決することがあります。
そのため、最初はとりあえずtemplateを使って開発し、ブラシュアップ時に、なるべくlayoutに移行する方が良いと思います。
ページ共有のものはtemplateとlayoutがあり、開発時はtemplateを使い、最終ブラシュアップ時に極力layoutを使うようにする。
質問や、間違いがありましたら、お気軽にどうぞ
※お名前とコメントの内容を入力してください。
※全てこのブログ上に公表されます。
※許可なく管理者によって修正・削除する場合がございます。 詳しくはプライバシーポリシーを参照ください