August 16, 2023 vue

Vue Dynamic Component

Dynamic component pada vue digunakan untuk merender komponen yang dinamis sesuai kondisi tertentu, tanpa perlu melakukan kondisional v-if v-else atau yang lainya.

Untuk membuat dynamic component, gunakan component bawaan vue component dengan is atribut yang berisi komponent yang akan dirender.

Contoh implementasinya di component MyTab.vue.

<!-- MyTab.vue -->
<script setup>
import { h, ref } from 'vue';

const currentTab = ref('welcome')
const tabs = {
  welcome: h('div', {}, 'Welcome Tab'),
  setting: h('div', {}, 'Setting Tab'),
  account: h('div', {}, 'Account Tab'),
}
</script>

<template>
  <nav>
    <ul>
      <li
        v-for="tab in Object.keys(tabs)"
        :key="tab"
      >
        <a
          href=""
          v-on:click.prevent="currentTab = tab"
        >
          {{ tab }}
        </a>
      </li>
    </ul>
  </nav>
  <component :is="tabs[currentTab]" />
</template>

Hasilnya.

MyTab Component

Atribut is juga dapat menerima element html biasa.

Contoh disini terdapat component MyHeading.vue yang merender element heading dengan level dinamis berdasarkan atribut level pada props.

<!-- MyHeading.vue -->
<script setup>
defineProps({
  level: Number
})
</script>

<template>
  <component :is="`h${level}`">
    <slot />
  </component>
</template>
<!-- App.vue -->
<script setup>
import MyHeading from '@/components/MyHeading.vue';
</script>

<template>
  <my-heading :level="1">Level 1</my-heading>
  <my-heading :level="2">Level 2</my-heading>
  <my-heading :level="3">Level 3</my-heading>
  <my-heading :level="4">Level 4</my-heading>
  <my-heading :level="5">Level 5</my-heading>
  <my-heading :level="6">Level 6</my-heading>
</template>

Hasilnya.

MyHeading Component