setPageLayout
setPageLayoutはページのレイアウトを動的に変更することを可能にします。
setPageLayoutはページのレイアウトを動的に変更することを可能にします。これはNuxtコンテキストへのアクセスに依存しているため、Nuxtコンテキスト内でのみ呼び出すことができます。
export default defineNuxtRouteMiddleware((to) => {
// 移動先のルートでレイアウトを設定します
setPageLayout('other')
})
サーバーサイドでレイアウトを動的に設定することを選択した場合、Vueによってレイアウトがレンダリングされる前に(つまり、プラグインやルートミドルウェア内で)設定しなければ、ハイドレーションの不一致を避けることができません。
tips
このセクションは公式ドキュメントの翻訳ではなく、本サイト独自の補足記事です。
NuxtのsetPageLayoutとは?動的レイアウト切り替えのメリット
NuxtでWebアプリケーションを開発する際、ページごとに異なるレイアウトを使い分けたいケースは多くあります。例えば、管理画面はサイドバー付きのレイアウト、公開ページはシンプルなヘッダーのみのレイアウトにしたい、といった要望です。
通常、ページ単位でレイアウトを指定するにはページコンポーネントのlayoutオプションを使いますが、これだけでは動的に切り替えたい場合に柔軟性が不足します。そこで役立つのがsetPageLayoutです。
setPageLayoutを使うと、ルートミドルウェアやプラグインなどから現在のページのレイアウトを動的に変更できます。これにより、ユーザーの状態やルートパラメータに応じてレイアウトを切り替えられ、よりリッチで柔軟なUI設計が可能になります。
まず結論:setPageLayoutのポイント
setPageLayoutは現在表示中のページのレイアウトを動的に変更できる関数- Nuxtコンテキスト内(ミドルウェア、プラグイン、setup関数など)でのみ呼び出せる
- レイアウト名は文字列で指定し、
layouts/ディレクトリ内のファイル名と対応 - サーバーサイドレンダリング時はレンダリング前に設定しないとHydrationエラーの原因になる
- 動的なレイアウト切り替えにより、ユーザー体験や管理の柔軟性が向上する
いつ使うべき?使わない方がよいケースは?
使うべきケース
- ユーザーの認証状態や権限に応じてレイアウトを切り替えたいとき
- URLパラメータやクエリによって表示レイアウトを変えたいとき
- ページ遷移時に共通のミドルウェアでレイアウトを制御したいとき
- SPA的な動的UIで、ページコンポーネントの
layoutオプションだけでは対応しづらい場合
使わない方がよいケース
- 静的に決まっているページごとのレイアウトは、ページコンポーネントの
layoutオプションで十分 - レイアウト切り替えが頻繁すぎるとUXが混乱する可能性があるため、過度な動的切り替えは避ける
- クライアントサイドのみで切り替えたい場合はHydration不一致に注意が必要
実務でよくあるユースケースとサンプルコード
1. 認証状態に応じたレイアウト切り替え
管理画面は認証済みユーザーのみアクセス可能で、専用の管理レイアウトを使いたい場合。
// middleware/auth-layout.ts
export default defineNuxtRouteMiddleware((to, from) => {
const user = useAuthUser()
if (user.value?.isAdmin) {
setPageLayout('admin')
} else {
setPageLayout('default')
}
})
2. クエリパラメータによるレイアウト変更
URLのクエリでレイアウトを切り替えたい場合。
// middleware/query-layout.ts
export default defineNuxtRouteMiddleware((to) => {
if (to.query.layout === 'simple') {
setPageLayout('simple')
} else {
setPageLayout('default')
}
})
3. 多言語サイトで言語ごとにレイアウトを変える
言語によってレイアウトの構造を変えたい場合。
// middleware/lang-layout.ts
export default defineNuxtRouteMiddleware((to) => {
if (to.params.lang === 'jp') {
setPageLayout('japanese')
} else {
setPageLayout('default')
}
})
よくある落とし穴・注意点
SSRとHydrationの不一致に注意
サーバーサイドレンダリング時にsetPageLayoutを遅延して呼び出すと、サーバーとクライアントで異なるレイアウトがレンダリングされ、Hydrationエラーが発生します。
必ずプラグインやルートミドルウェアの早い段階で設定しましょう。
クライアントサイドのみの切り替えは慎重に
クライアントサイドでのみレイアウトを切り替えると、初期表示時に違和感が出ることがあります。
可能な限りサーバーサイドでも同じレイアウトを設定することが望ましいです。
パフォーマンスへの影響
レイアウト切り替えはVueのコンポーネントツリー全体に影響するため、頻繁に切り替えるとパフォーマンス低下やUIのちらつきが起こる可能性があります。
必要な場合に限定して使いましょう。
まとめ
setPageLayoutはNuxtでページのレイアウトを動的に切り替える強力な機能です。
ユーザーの状態やルート情報に応じて柔軟にUIを変えられるため、管理画面や多言語サイトなどで特に有効です。
ただし、SSR時のHydration不一致やパフォーマンス面の注意も必要なので、使うタイミングや場所を見極めて活用しましょう。
適切に使えば、より洗練されたユーザー体験を提供できる便利なツールです。ぜひ実務での活用を検討してみてください。
※このページは Nuxt.js 公式ドキュメントの翻訳ページです。
公式ドキュメントの該当ページはこちら:
https://nuxt.com/docs/3.x/api/utils/set-page-layout