- Key Concepts
- Directory Structure
- Going further
Layouts Directory
Nuxt provides a customizable layouts framework you can use throughout your application, ideal for extracting common UI or code patterns into reusable layout components.
Layouts are placed in thelayouts/ directory and will be automatically loaded via asynchronous import when used. Layouts are used by adding<NuxtLayout> to yourapp.vue, and either setting alayout property as part of your page metadata (if you are using the~/pages integration), or by manually specifying it as a prop to<NuxtLayout>. (Note: The layout name is normalized to kebab-case, sosomeLayout becomessome-layout.)
If you only have a single layout in your application, we recommend usingapp.vue instead.
Unlike other components, your layouts must have a single root element to allow Nuxt to apply transitions between layout changes - and this root element cannot be a<slot />.
Enabling the Default Layout
Add a~/layouts/default.vue:
<template> <div> Some default layout shared across all pages <slot/> </div></template>In a layout file, the content of the layout will be loaded in the<slot />, rather than using a special component.
If you use aapp.vue you will also need to add<NuxtLayout>:
<template> <NuxtLayout> some page content </NuxtLayout></template>Setting Another Layout
-|layouts/---|default.vue---|custom.vueYou can directly override the default layout like this:
<scriptsetuplang="ts">// You might choose this based on an API call or logged-in statusconstlayout="custom";</script><template> <NuxtLayout:name="layout"> <NuxtPage /> </NuxtLayout></template>Alternatively, you can override the default layout per-page like this:
<script>// This will work in both `<script setup>` and `<script>`definePageMeta({layout:"custom",});</script><template> <NuxtLayout> <NuxtPage /> </NuxtLayout></template><template> <div> Some *custom* layout <slot/> </div></template><template> <div> A *default* layout <slot/> </div></template>Learn more aboutdefining page meta.
Changing the Layout Dynamically
You can also use a ref or computed property for your layout.
<scriptsetuplang="ts">functionenableCustomLayout () {setPageLayout('custom')}definePageMeta({layout:false,});</script><template> <div> <button@click="enableCustomLayout">Update layout</button> </div></template>Overriding a Layout on a Per-page Basis
If you are using the~/pages integration, you can take full control by settinglayout: false and then using the<NuxtLayout> component within the page.
<scriptsetuplang="ts">definePageMeta({layout:false,});</script><template> <div> <NuxtLayoutname="custom"> <template #header> Some header template content. </template> The rest of the page </NuxtLayout> </div></template><template> <div> <header> <slotname="header"> Default header content </slot> </header> <main> <slot/> </main> </div></template>If you use<NuxtLayout> within your pages, make sure it is not the root element (or disable layout/page transitions).

