How to Add a Default Persistent Layout In Laravel Inertia and Vue
In this today's lesson, we are going to see how to add a default persistent layout In Laravel Inertia js and Vue js, let's assume that we have a navigation menu component that we want to be shown throughout the whole application.
Create the MainLayout Component
to add a default layout in Inertiajs we need to have a Layouts folder inside the Pages folder once done add a new component MainLayout.vue.
<template>
<nav class="navbar navbar-expand-lg navbar-light bg-white">
<div class="container-fluid">
<Link class="navbar-brand" href="/">Laravel Vue CRUD App</Link>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<Link class="nav-link" aria-current="page"
href="/"><i class="fas fa-home"></i> Home</Link>
</li>
<li class="nav-item">
<Link class="nav-link" href="/tasks/create"><i class="fas fa-edit"></i> Create Task</Link>
</li>
</ul>
</div>
</div>
</nav>
<slot></slot>
</template>
<script setup>
import { Link } from '@inertiajs/vue3';
</script>
<style>
</style>
Set the default layout
To set the default layout all you need to do is to import the MainLayout component and update the code inside the app.js file.
import './bootstrap';
import { createApp, h } from 'vue'
import { createInertiaApp } from '@inertiajs/vue3'
import MainLayout from '@/Pages/Layouts/MainLayout.vue';
createInertiaApp({
resolve: name => {
const pages = import.meta.glob('./Pages/**/*.vue', { eager: true })
const page = pages[`./Pages/${name}.vue`]
page.default.layout = page.default.layout || MainLayout
return page
},
setup({ el, App, props, plugin }) {
createApp({ render: () => h(App, props) })
.use(plugin)
.mount(el)
},
})