Menggunakan Directive Bawaan di Vue.js: v-if, v-for, dan v-model

Dalam pengembangan aplikasi web menggunakan Vue.js, ada tiga hal yang sering kita lakukan: menampilkan elemen secara kondisional, membuat daftar elemen dari data, dan mengikat input form ke data yang bisa diperbarui secara reaktif. Ketiga hal ini bisa dilakukan dengan sangat mudah berkat apa yang disebut sebagai directive bawaan Vue.
Directive adalah atribut khusus dalam template Vue yang diawali dengan v-
, dan memungkinkan kita untuk mengikat perilaku khusus ke elemen DOM. Dalam artikel ini, kita akan membahas tiga directive paling sering digunakan: v-if
, v-for
, dan v-model
. Dengan memahami cara kerja dan praktik terbaik ketiganya, kamu akan lebih siap membangun antarmuka pengguna yang dinamis dan responsif.
1. v-if – Mengatur Tampilan Elemen Berdasarkan Kondisi
Directive v-if
digunakan untuk merender elemen HTML hanya jika kondisi tertentu terpenuhi. Artinya, Vue akan menyisipkan atau menghapus elemen dari DOM secara dinamis sesuai dengan ekspresi yang diberikan. Hal ini sangat berguna ketika kita ingin menampilkan bagian UI hanya pada saat tertentu, seperti saat pengguna sudah login, saat ada data yang tersedia, atau saat proses tertentu selesai.
Salah satu keuntungan v-if
dibanding hanya menggunakan CSS
untuk menyembunyikan elemen (display: none
) adalah efisiensi dan kebersihan DOM. Elemen yang tidak perlu ditampilkan tidak akan berada di DOM sama sekali, sehingga kinerja aplikasi lebih optimal.
Contoh Penggunaan v-if
<template>
<div>
<button @click="toggle">Tampilkan/Sembunyikan</button>
<p v-if="isVisible">Teks ini hanya muncul jika isVisible = true</p>
</div>
</template>
<script setup>
import { ref } from 'vue';
const isVisible = ref(false);
function toggle() {
isVisible.value = !isVisible.value;
}
</script>
Pada contoh di atas:
isVisible
adalah sebuah reactive variable yang menentukan apakah paragraf<p>
ditampilkan atau tidak.- Ketika tombol diklik, fungsi
toggle()
akan membalik nilaiisVisible
. v-if="isVisible"
memastikan bahwa paragraf hanya dimunculkan di DOM ketika nilainyatrue
.
2. v-for – Merender Daftar Elemen Secara Dinamis
Dalam banyak aplikasi web, kita perlu merender daftar data dari array atau objek — seperti daftar produk, komentar, atau item menu. Vue menyediakan directive v-for
untuk menangani hal ini dengan cara yang sangat elegan dan efisien.
Dengan v-for
, kita bisa dengan mudah mengulang elemen template untuk setiap item dalam array. Vue juga mendukung destructuring dan menyediakan akses ke index dari iterasi saat dibutuhkan. Penting juga untuk menyertakan atribut :key
yang unik, agar Vue bisa melacak elemen dengan benar dan mengoptimalkan performa re-rendering.
Contoh Penggunaan v-for
<template>
<ul>
<li v-for="(item, index) in items" :key="index">
{{ index + 1 }}. {{ item }}
</li>
</ul>
</template>
<script setup>
const items = ['Apel', 'Jeruk', 'Mangga'];
</script>
Penjelasan:
- Kita menggunakan
v-for="(item, index) in items"
untuk mengulang setiap nilai dalam arrayitems
. - Atribut
:key="index"
disarankan agar Vue bisa melakukan DOM diffing secara efisien. Namun dalam praktik nyata, lebih baik gunakan ID unik jika tersedia (misalnyaitem.id
). - Elemen
<li>
akan dirender sebanyak panjang arrayitems
, dengan konten yang disesuaikan.
Iterasi dengan Objek
Vue juga memungkinkan iterasi terhadap objek, bukan hanya array. Ini berguna jika kita ingin menampilkan pasangan key: value
.
<template>
<div v-for="(value, key) in user" :key="key">
{{ key }}: {{ value }}
</div>
</template>
<script setup>
const user = {
nama: 'Budi',
umur: 30,
kota: 'Jakarta'
};
</script>
3. v-model – Binding Dua Arah Antara Data dan Form
Salah satu keunggulan Vue adalah data binding dua arah (two-way binding) yang sangat mudah digunakan berkat v-model
. Directive ini menghubungkan data model (variabel dalam JavaScript) dengan elemen input form di DOM. Ketika pengguna mengubah nilai input, data model akan diperbarui secara otomatis, dan sebaliknya — jika model diperbarui melalui JavaScript, input juga akan mencerminkan perubahan tersebut.
Ini sangat berguna untuk form interaktif seperti login, pendaftaran, filter pencarian, dan lainnya. Vue menangani event-event seperti input
, change
, dan checked
di balik layar, sehingga kita tidak perlu menulis event listener secara manual.
Contoh Penggunaan v-model
<template>
<div>
<input v-model="nama" placeholder="Masukkan nama" />
<p>Halo, {{ nama }}!</p>
</div>
</template>
<script setup>
import { ref } from 'vue';
const nama = ref('');
</script>
Penjelasan:
- Input akan secara otomatis memperbarui variabel
nama
setiap kali user mengetik. - Paragraf
<p>
akan memperbarui teks secara langsung berdasarkan isi variabelnama
, tanpa perlu event handler tambahan.
v-model pada Checkbox dan Select
Vue juga mendukung penggunaan v-model
untuk elemen checkbox
, radio
, dan select
.
<!-- Checkbox -->
<input type="checkbox" v-model="isChecked" />
<p>{{ isChecked ? 'Dicentang' : 'Belum dicentang' }}</p>
<!-- Select -->
<select v-model="pilihan">
<option value="a">Pilihan A</option>
<option value="b">Pilihan B</option>
</select>
<p>Terpilih: {{ pilihan }}</p>
Untuk select, nilai terpilih langsung terikat pada model pilihan
.
Untuk checkbox, variabel boolean akan mencerminkan status centang.
Studi Kasus: Formulir Pendaftaran
Berikut contoh yang menggabungkan v-if
, v-for
, dan v-model
dalam satu komponen kecil:
<template>
<form @submit.prevent="submitForm">
<div>
<label>Nama:</label>
<input v-model="form.nama" />
</div>
<div>
<label>Hobi:</label>
<div v-for="(hobi, index) in hobiTersedia" :key="index">
<input
type="checkbox"
:value="hobi"
v-model="form.hobiDipilih"
/>
{{ hobi }}
</div>
</div>
<div v-if="form.hobiDipilih.length === 0">
<p style="color: red;">Pilih minimal satu hobi!</p>
</div>
<button type="submit">Kirim</button>
</form>
</template>
<script setup>
import { ref } from 'vue';
const hobiTersedia = ['Membaca', 'Olahraga', 'Bermain Musik'];
const form = ref({
nama: '',
hobiDipilih: []
});
function submitForm() {
alert(`Nama: ${form.value.nama}\nHobi: ${form.value.hobiDipilih.join(', ')}`);
}
</script>
Tips dan Best Practice
- Selalu gunakan
:key
dalamv-for
untuk mencegah rendering yang tidak diinginkan. - Jangan gunakan
index
sebagaikey
kecuali memang tidak ada nilai unik lain. - Gunakan
v-if
untuk kondisi yang memengaruhi rendering DOM besar. Untuk tampilan kecil,v-show
bisa lebih efisien. - Hindari overuse
v-if
danv-for
dalam satu elemen (v-if
danv-for
di elemen yang sama dapat menyebabkan masalah). Gunakan computed properties untuk memfilter data.
Directive bawaan seperti v-if
, v-for
, dan v-model
adalah alat dasar namun sangat kuat dalam Vue.js. Mereka membantu kita menangani tampilan yang dinamis, membuat daftar berdasarkan data, dan mengikat data pengguna ke antarmuka dengan cara yang reaktif.
Dengan memahami bagaimana masing-masing directive bekerja, kamu bisa membangun aplikasi Vue yang lebih interaktif, efisien, dan mudah dipelihara. Jangan ragu untuk mengombinasikan ketiganya dalam satu komponen saat diperlukan — Vue dirancang untuk fleksibilitas seperti ini.