<NuxtLayout>
You can use <NuxtLayout /> component to activate the default layout on app.vue or error.vue.
<template>
<NuxtLayout>
some page content
</NuxtLayout>
</template>
Props
name: Specify a layout name to be rendered, can be a string, reactive reference or a computed property. It must match the name of the corresponding layout file in theapp/layouts/directory, orfalseto disable the layout.- type:
string | false - default:
default
- type:
<script setup lang="ts">
// layouts/custom.vue
const layout = 'custom'
</script>
<template>
<NuxtLayout :name="layout">
<NuxtPage />
</NuxtLayout>
</template>
errorLayout.vue, it will become error-layout when passed as a name property to <NuxtLayout />.<template>
<NuxtLayout name="error-layout">
<NuxtPage />
</NuxtLayout>
</template>
fallback: If an invalid layout is passed to thenameprop, no layout will be rendered. Specify afallbacklayout to be rendered in this scenario. It must match the name of the corresponding layout file in theapp/layouts/directory.- type:
string - default:
null
- type:
Additional Props
NuxtLayout also accepts any additional props that you may need to pass to the layout. These custom props are then made accessible as attributes.
<template>
<div>
<NuxtLayout
name="custom"
title="I am a custom layout"
>
<!-- ... -->
</NuxtLayout>
</div>
</template>
In the above example, the value of title will be available using $attrs.title in the template or useAttrs().title in <script setup> at custom.vue.
<script setup lang="ts">
const layoutCustomProps = useAttrs()
console.log(layoutCustomProps.title) // I am a custom layout
</script>
Layout Props from Page Meta
When using definePageMeta with the object syntax for layout, props are automatically passed to the layout component. The layout can receive them with defineProps:
<script setup lang="ts">
definePageMeta({
layout: {
name: 'admin',
props: {
sidebar: true,
},
},
})
</script>
<script setup lang="ts">
const props = defineProps<{
sidebar?: boolean
}>()
</script>
Transitions
<NuxtLayout /> renders incoming content via <slot />, which is then wrapped around Vue’s <Transition /> component to activate layout transition. For this to work as expected, it is recommended that <NuxtLayout /> is not the root element of the page component.
<template>
<div>
<NuxtLayout name="custom">
<template #header>
Some header template content.
</template>
</NuxtLayout>
</div>
</template>
<template>
<div>
<!-- named slot -->
<slot name="header" />
<slot />
</div>
</template>
Layout's Ref
To get the ref of a layout component, access it through ref.value.layoutRef.
<script setup lang="ts">
const layout = ref()
function logFoo () {
layout.value.layoutRef.foo()
}
</script>
<template>
<NuxtLayout ref="layout">
default layout
</NuxtLayout>
</template>
<script setup lang="ts">
const foo = () => console.log('foo')
defineExpose({
foo,
})
</script>
<template>
<div>
default layout
<slot />
</div>
</template>