layout.tsx
複数のpageで共有されるUI
Next.js v13で入った
docs
例
code:tsx
export default function DashboardLayout({
children,
}: {
children: React.ReactNode,
}) {
return (
<dic>
<header/>
<nav></nav>
{children}
</div>
);
}
引数でchildrenを受け取る
このchildrenの中身がapp/page.tsxの内容だったりする
children以外の場所が共通のUIを定義する場所になる
#wip
layout.tsxは、(app/template.tsxと異なり)page遷移時に再レンダリングされない
例えばCCなら、pageを移動してもstateは維持される
Server Componentのlayout.tsx内で、全てのclient用のものを読み込む
layout.tsxをccにすると、すべての子要素がクライアントコンポーネントになるのか?
https://www.reddit.com/r/nextjs/comments/18rm5o7/use_client_in_layouttsx/
https://stackoverflow.com/questions/74992326/does-use-client-in-next-js-13-root-layout-make-whole-routes-client-component
関係ないけど、今そのcomponentがclient/serverどちらでrenderingされているかってどうやって確認するんだ
ツリーを辿っていかないとわからない?
use clientとかが境界というのの弊害
By fetching data in a layout, rendering for all route segments beneath it can only start once the data has finished loading. ref
そうなんだmrsekut.icon
https://zenn.dev/meijin/articles/nextjs14-layout-as-middleware
Next.jsのMiddleware的に使える化調査したやつ
大きく分けると2種類
Root Layout
必須
app/layout.tsxに書く
project内の全ページに対する共通のlayout
<html>とか<body>を書くことになる
従来のpages/_app.jsやpages/_document.jsの代替
各Folders内のlayout.tsx
やっていることは同じmrsekut.icon
「Layout」という言葉が何を指しているのかわかりづらい
何がしたいのか
headerは、ほぼ全てのページで使う
従来は、<Header />を各ページ内に設置していた
しかし、<Header />内で状態を管理しているとき
例えば、検索フォームの中身だったり、ログイン状態だったり?
ページを遷移すると、その状態がリセットされてしまう
(もちろんglobal state管理とかすればいけるが、そういう話ではない)
子になるpage.tsxが複数無いとあまりうれしみはない?mrsekut.icon
nestしたpageと何が違うのかわからなくなってきた #??
良い感じのユースケースがあれば知りたい #??
そんなにこれ使うか?
ああ、こういう感じのサイドバーとかだとあるか
https://gyazo.com/4d74506455f696195966fb6ac0745b67 https://www.publickey1.jp/blog/22/_nextjs_13webnextjs_conf_2022.html
Islands Architectureじゃないけど、
「header + footer + 変えられるcontent」のようなLayoutを定義して使い回す感じ?
ページ遷移すると、変えられるcontentの部分のみが切り替わる
だから、headerの部分は状態を保持し続けられる
ナビゲーションをまたいで状態を維持し、高価な再レンダリングを回避し、高度なルーティングパターンを可能にする複雑なインターフェースを簡単に作成する
複数ページにまたがる共通のコンポーネントを再レンダリング等に配慮して設置
いまいちどういう意味なのかわからんmrsekut.icon
ページ間で共通のheaderを使っている時の話ということはわかる
もともとどういう問題が会ったのかを知りたいmrsekut.icon
https://zenn.dev/hisho/articles/fe9f4ec4a8e691
わかりやすい
Layoutsをいくつか用意しつつ、
個々のpagesで、そのLayoutsを指定して表示できる
headerありのLayout、サイドバーありのLayouts、のようなものを用意しておけばいい
https://beta.nextjs.org/docs/routing/fundamentals
https://nextjs.org/blog/layouts-rfc
2022/5/24にRFCが出た
Nested Layouts
: Build complex applications with nested routes.
Designed for Server Components
: Optimized for subtree navigation.
Improved Data Fetching
: Fetch in layouts while avoiding waterfalls.
Using React 18 Features
: Streaming, Transitions, and Suspense.
Client and Server Routing
: Server-centric routing with SPA-like behavior.
100% incrementally adoptable
: No breaking changes so you can adopt gradually.
Advanced Routing Conventions
: Offscreen stashing, instant transitions, and more.
https://nextjs.org/blog/next-12-3