layouts
Nuxt는 공통 UI 패턴을 재사용 가능한 레이아웃으로 추출할 수 있는 레이아웃 프레임워크를 제공합니다.
최상의 성능을 위해, 이 디렉토리에 위치한 컴포넌트는 사용 시 비동기 임포트를 통해 자동으로 로드됩니다.
레이아웃 활성화
레이아웃은 app.vue에 <NuxtLayout>를 추가하여 활성화됩니다:
app.vue
<template>
<NuxtLayout>
<NuxtPage />
</NuxtLayout>
</template>
레이아웃을 사용하려면:
- 페이지에서 definePageMeta를 사용하여
layout속성을 설정합니다. <NuxtLayout>의nameprop을 설정합니다.
레이아웃 이름은 케밥 케이스(kebab-case)로 정규화되므로,
someLayout은 some-layout이 됩니다.레이아웃이 지정되지 않은 경우,
layouts/default.vue가 사용됩니다.애플리케이션에 레이아웃이 하나만 있다면,
app.vue를 사용하는 것을 권장합니다.다른 컴포넌트와 달리, 레이아웃은 반드시 하나의 루트 엘리먼트를 가져야 하며, Nuxt가 레이아웃 변경 시 트랜지션을 적용할 수 있도록 해야 합니다. 이 루트 엘리먼트는
<slot />이 될 수 없습니다.기본 레이아웃
~/layouts/default.vue를 추가하세요:
layouts/default.vue
<template>
<div>
<p>모든 페이지에서 공유되는 기본 레이아웃 콘텐츠</p>
<slot />
</div>
</template>
레이아웃 파일에서는 페이지의 내용이 <slot /> 컴포넌트에 표시됩니다.
이름이 지정된 레이아웃
Directory Structure
-| layouts/
---| default.vue
---| custom.vue
이제 페이지에서 custom 레이아웃을 사용할 수 있습니다:
pages/about.vue
<script setup lang="ts">
definePageMeta({
layout: 'custom'
})
</script>
<NuxtLayout>의 name 속성을 사용하여 모든 페이지의 기본 레이아웃을 직접 오버라이드할 수 있습니다:
app.vue
<script setup lang="ts">
// API 호출이나 로그인 상태에 따라 선택할 수 있습니다
const layout = "custom";
</script>
<template>
<NuxtLayout :name="layout">
<NuxtPage />
</NuxtLayout>
</template>
중첩 디렉토리에 레이아웃이 있는 경우, 레이아웃의 이름은 해당 경로 디렉토리와 파일명을 기반으로 하며, 중복된 세그먼트는 제거됩니다.
| 파일 | 레이아웃 이름 |
|---|---|
~/layouts/desktop/default.vue | desktop-default |
~/layouts/desktop-base/base.vue | desktop-base |
~/layouts/desktop/index.vue | desktop |
명확성을 위해, 레이아웃의 파일명이 이름과 일치하도록 하는 것을 권장합니다:
| 파일 | 레이아웃 이름 |
|---|---|
~/layouts/desktop/DesktopDefault.vue | desktop-default |
~/layouts/desktop-base/DesktopBase.vue | desktop-base |
~/layouts/desktop/Desktop.vue | desktop |
Read and edit a live example in Docs > Examples > Features > Layouts.
레이아웃 동적 변경
setPageLayout 헬퍼를 사용하여 레이아웃을 동적으로 변경할 수도 있습니다:
<script setup lang="ts">
function enableCustomLayout () {
setPageLayout('custom')
}
definePageMeta({
layout: false,
});
</script>
<template>
<div>
<button @click="enableCustomLayout">레이아웃 업데이트</button>
</div>
</template>
Read and edit a live example in Docs > Examples > Features > Layouts.
페이지별로 레이아웃 오버라이드
페이지를 사용하는 경우, layout: false를 설정한 후 페이지 내에서 <NuxtLayout> 컴포넌트를 사용하여 완전히 제어할 수 있습니다.
<script setup lang="ts">
definePageMeta({
layout: false,
})
</script>
<template>
<div>
<NuxtLayout name="custom">
<template #header> 헤더 템플릿 콘텐츠입니다. </template>
나머지 페이지 내용
</NuxtLayout>
</div>
</template>
<template>
<div>
<header>
<slot name="header">
기본 헤더 콘텐츠
</slot>
</header>
<main>
<slot />
</main>
</div>
</template>
페이지 내에서
<NuxtLayout>을 사용할 경우, 반드시 루트 엘리먼트가 아니어야 합니다 (또는 레이아웃/페이지 트랜지션 비활성화 필요).