August 20, 2023 vue

Vue Dynamic Layout By Route

Dalam sebuah aplikasi web bisa terdapat beberapa halaman dengan layout yang berbeda.

Misalnya pada halaman login, register dan forgot password memakai layout yang didalamnya tidak ada navbar, sidebar, dll.

Sedangkan di halaman dashboard dan app memakai layout dengan navbar, sidebar, dll.

Salah satu cara yang biasa saya lakukan adalah menggunakan dynamic-layout.

Pada dynamic layout, setiap route akan mendefinisikan layout apa yang akan digunakannya di meta.

Kemudian pada router view, pada saat menampilkan route yang aktif, component pada route dirender di dalam layout sesuai meta pada route.

Untuk menampilkan layout yang dinamis berdasarkan meta route, pada vue bisa menggunakan Dynamic Route.

Component layout yang akan digunakan pada route harus dijadikan global component terlebih dahulu, agar lebih mudah dalam merender layout.

Langsung saja berikut langkah-langkahnya.

Buat Component Layout

Buat direktori src/components/layouts jika belum ada.

mkdir src/components/layouts

Di dalamnya buat beberapa component layout, misal disini saya buat layout auth dan layout app.

touch src/components/layouts/layout-{app,auth}.vue

Edit file layout-app.vue dan layout-auth.vue, disetiap layout berikan <slot /> sebagai tempat merender konten dari component route.

<script>
// layout-app.vue

export default {
  name: 'LayoutApp'
};
</script>

<template>
    <div>
        <h1>Layout App</h1>
        <slot />
    </div>
</template>
<script>
// layout-auth.vue

export default {
  name: 'LayoutAuth'
};
</script>

<template>
    <div>
        <h1>Layout Auth</h1>
        <slot />
    </div>
</template>

Buat file index.js di src/components/layouts, file ini digunakan sebagai entrypoint untuk mengambil semua layout.

export { default as LayoutApp } from './layout-app.vue';
export { default as LayoutAuth } from './layout-auth.vue';

Menggunakan Layout di App

Buat direktori src/plugins jika belum ada.

mkdir src/plugins

Buat file layout.js di direktori tersebut.

touch src/plugins/layout.js

Isi file layout.js seprti berikut.

import * as layouts from 'src/components/layouts';

export function useLayout(app) {
  for (const layout in layouts) {
    app.component(layouts[layout].name, layouts[layout]);
  }
}

Disini saya menggunakan import alias, penjelasannya bisa dilihat di Import Alias Di Vite

File layout.js akan mengambil semua layout yang ada, kemudian menginstalnya di app.

Buka file main.js, import dan panggil fungsi useLayout yang sudah dibuat sebelumnya.

import { createApp } from 'vue';
import './style.css';
import App from './App.vue';
import { useLayout } from './plugins/layout';

const app = createApp(App);

useLayout(app);

app.mount('#app');

Menggunakan Layout di Route

Buka file tempat disimpannya daftar route dari vue-router, misal disini di src/route/routes.js.

Di setiap route-nya tampahkan objek meta yang terdapat property layout dengan nama layout yang akan digunakan.

Pastikan nama route sesuai dengan yang sudah ada di direktori src/components/layouts.

export const routes = [
  {
    path: '/login',
    name: 'Login',
    component: () => import('src/pages/auth/auth-login-page.vue'),
    meta: {
      layout: 'LayoutAuth',
    },
  },
  {
    path: '/',
    name: 'Dashboard',
    component: () => import('src/pages/app/app-dashboard-page.vue'),
    meta: {
      layout: 'LayoutApp'
    },
  },
];

Menampilkan Layout Dinamis Berdasarkan Route

Tahap terakhir buka file App.vue atau tempat file yang merender komponent router-view.

Masukkan router-view di dalam element component yang dinamis berdasarkan layout dari meta route.

<script setup>
import { useRoute } from 'vue-router';

const route = useRoute();
</script>

<template>
  <component :is="route.meta.layout">
    <router-view />
  </component>
</template>

Selanjutnya

Selanjutnya anda bisa menambahkan yang lainya misal title yang dinamis pada layout, dsb.