Sintaks Template
Teks dan Ekspresi
{{ message }} {{ count + 1 }} {{ ok ? 'Yes' : 'No' }}
Direktif
{{ expr }}Interpolasi teks
v-bind:attr / :attrIkat atribut ke ekspresi
v-on:event / @eventPasang event listener
v-modelBinding dua arah (form)
v-if / v-else-if / v-elseRendering kondisional
v-showToggle CSS display (tetap di DOM)
v-forRendering daftar
v-slot / #nameKonten slot bernama
Binding Atribut
Reaktivitas
ref (Primitif)
import { ref } from 'vue' const count = ref(0) console.log(count.value) // 0 count.value++ // pembaruan reaktif
reactive (Objek)
import { reactive } from 'vue' const state = reactive({ count: 0, name: 'Vue' }) state.count++ // tidak perlu .value
ref vs reactive
ref()Semua tipe; akses via .value di script
reactive()Hanya objek/array; akses properti langsung
TemplateKeduanya auto-unwrap (tidak perlu .value)
Destructurereactive kehilangan reaktivitas; gunakan toRefs()
Computed dan Watcher
Properti Computed
import { ref, computed } from 'vue' const items = ref([1, 2, 3, 4, 5]) const evenItems = computed(() => items.value.filter(n => n % 2 === 0) )

Nilai computed di-cache dan hanya dievaluasi ulang saat dependensi berubah

Watcher
import { ref, watch, watchEffect } from 'vue' const query = ref('') // Pantau sumber tertentu watch(query, (newVal, oldVal) => { console.log(`Changed: ${oldVal} → ${newVal}`) }) // Lacak dependensi secara otomatis watchEffect(() => { console.log(`Query is: ${query.value}`) })
Opsi Watch
immediate: trueJalankan callback segera saat dibuat
deep: truePantau mendalam objek bersarang
flush: 'post'Jalankan setelah pembaruan DOM
once: trueDipicu sekali lalu berhenti
Komponen
Single-File Component (SFC)
Mendaftarkan Komponen
Blok SFC
<script setup>Composition API (disarankan)
<template>Template HTML
<style scoped>CSS berskope ke komponen
<style module>CSS Modules (objek $style)
Props dan Event
Mendefinisikan Props
Emit Event
Penggunaan di Komponen Induk
v-model pada Komponen
Slot
Slot Default

Konten kustom di sini

Slot Bernama

Konten utama

Scoped Slot
Composition API
Fungsi Composable
// useMouse.js import { ref, onMounted, onUnmounted } from 'vue' export function useMouse() { const x = ref(0) const y = ref(0) function update(e) { x.value = e.pageX y.value = e.pageY } onMounted(() => window.addEventListener('mousemove', update)) onUnmounted(() => window.removeEventListener('mousemove', update)) return { x, y } }
Menggunakan Composable
provide / inject
// Induk import { provide, ref } from 'vue' const theme = ref('dark') provide('theme', theme) // Keturunan (kedalaman berapa pun) import { inject } from 'vue' const theme = inject('theme', 'light') // default
Router (Vue Router)
Definisi Route
import { createRouter, createWebHistory } from 'vue-router' const router = createRouter({ history: createWebHistory(), routes: [ { path: '/', component: Home }, { path: '/about', component: About }, { path: '/user/:id', component: User }, ] })
Navigasi di Template
Home User 1
Navigasi Programatik
import { useRouter, useRoute } from 'vue-router' const router = useRouter() const route = useRoute() router.push('/about') router.push({ name: 'user', params: { id: 1 } }) console.log(route.params.id)
Fitur Route
/user/:idSegmen dinamis (route.params.id)
name: 'user'Route bernama untuk navigasi programatik
children: [...]Route bersarang
beforeEnterNavigation guard per route
meta: { auth: true }Metadata kustom untuk guard
redirect: '/new-path'Redirect route
Lifecycle Hook
Urutan Hook
onBeforeMountSebelum render DOM awal
onMountedDOM siap (ambil data, tambah listener)
onBeforeUpdateSebelum state reaktif me-render ulang DOM
onUpdatedSetelah re-render DOM
onBeforeUnmountSebelum komponen dihancurkan
onUnmountedPembersihan (hapus listener, timer)
Penggunaan
Daftar dan Kondisional
v-for
  • {{ item.name }}
  • {{ index }}: {{ item.name }}
  • {{ key }}: {{ val }}

    Selalu gunakan :key dengan v-for untuk pembaruan DOM yang efisien

    v-if vs v-show
    v-ifRender kondisional (tambah/hapus dari DOM)
    v-else-ifRantai else-if
    v-elseCabang fallback
    v-showToggle display: none (tetap di DOM)

    Gunakan v-show untuk toggle sering, v-if untuk perubahan jarang

    Contoh Kondisional
    Memuat...
    Error!
    {{ data }}
    Penanganan Form
    Dasar v-model
    Modifier v-model
    v-model.lazySinkron pada change bukan input
    v-model.numberAuto-typecast ke angka
    v-model.trimAuto-trim spasi
    Modifier Event
    @click.preventPanggil preventDefault()
    @click.stopPanggil stopPropagation()
    @click.onceDipicu paling banyak sekali
    @keyup.enterHanya pada tombol Enter
    @submit.preventCegah pengiriman form default