Nested layouts in Nuxt/Vue.js
If you're like me, and like to keep things tidy and prefer not to repeat yourself, you will most likely find yourself needing to nest layouts when developing a Nuxt application.
This is luckily a fairly easy thing to do, expect you need to do a bit of tweaking.
Assuming you haven't modified your layouts/default.vue file, it will most likely look like this:
// layouts/default.vue
<template>
<div>
<nuxt />
</div>
</template>
If we'd like to apply nested layouts, we could take advantage of slots and do something like this:
// layouts/default.vue
<template>
<div>
<nuxt v-if="!$slots.default" />
<slot />
</div>
</template>
Then we could add a new layout, like so:
// layouts/newLayout.vue
<template>
<default-layout>
<h1>Surrounding layout</h1>
<nuxt />
</default-layout>
</template>
<script>
import DefaultLayout from '~/layouts/default.vue';
export default {
components: {
DefaultLayout,
},
};
</script>
Congratulations. You now have a nested layout. In any file you'd like to use the nested layout, you simply set your layout like so:
<script>
export default {
layout: 'newLayout', // name of your new layout
};
</script>