Catatan Belajar · · 3 menit baca
Belajar Vue 3: instalasi sampai pola komponen
Tutorial Vue 3 dari nol: scaffold dengan create-vue, anatomi Single File Component, ref/computed, v-model, dan aturan emas props turun–event naik — dengan contoh toko sederhana.
Vue 3 adalah framework yang paling ramah untuk pindah dari HTML/JS biasa ke aplikasi reaktif — template-nya masih terasa seperti HTML. Tutorial ini dari instalasi sampai pola komponen yang kupakai di project nyata.
1. Instalasi
Prasyarat: Node.js 20+. Scaffold project resmi (Vite di dalamnya):
npm create vue@latest toko-app
# jawab pertanyaannya (TypeScript? Router? Pinia?) — untuk belajar, pilih No dulu semua
cd toko-app
npm install
npm run dev # buka http://localhost:5173
2. Anatomi Single File Component (SFC)
Satu file .vue = logic + template + style dalam satu tempat:
<script setup>
import { ref, computed } from "vue";
const keranjang = ref([]); // state reaktif
const total = computed(() => // nilai turunan — hitung otomatis
keranjang.value.reduce((s, item) => s + item.harga, 0)
);
function tambah(item) {
keranjang.value.push(item);
}
</script>
<template>
<button @click="tambah({ nama: 'Kopi', harga: 25000 })">Tambah Kopi</button>
<p>{{ keranjang.length }} item — total Rp {{ total.toLocaleString("id-ID") }}</p>
</template>
Tiga hal yang perlu kamu hafal dari contoh ini:
ref()membungkus nilai jadi reaktif — di<script>aksesnyakeranjang.value, di template cukupkeranjang.computed()untuk nilai turunan — jangan simpantotalsebagai state terpisah (anti-pola yang sama dengan React).@clickadalah singkatanv-on:click.
3. Form dua arah dengan v-model
<script setup>
import { ref } from "vue";
const nama = ref("");
</script>
<template>
<input v-model="nama" placeholder="Nama produk" />
<p>Preview: {{ nama || "(kosong)" }}</p>
</template>
v-model = binding dua arah — mengetik di input langsung mengubah nama, dan sebaliknya. Ini yang membuat form di Vue terasa jauh lebih ringkas daripada onChange + setState.
4. Komponen: props turun, event naik
<!-- ProdukCard.vue -->
<script setup>
defineProps({ nama: String, harga: Number });
const emit = defineEmits(["beli"]);
</script>
<template>
<article class="card">
<h3>{{ nama }}</h3>
<p>Rp {{ harga.toLocaleString("id-ID") }}</p>
<button @click="emit('beli')">Beli</button>
</article>
</template>
<!-- Dipakai di parent -->
<ProdukCard v-for="p in produk" :key="p.id" :nama="p.nama" :harga="p.harga" @beli="tambah(p)" />
Aturan emasnya sama seperti framework mana pun: data mengalir turun lewat props, perubahan naik lewat event. Jangan pernah mutasi props dari anak.
Tips dari pengalaman
- Selalu beri
:keyunik div-for— tanpa itu Vue mendaur ulang DOM dengan cara yang bisa bikin bug halus. - Mulai tanpa Pinia/Router; tambahkan saat benar-benar butuh. Banyak aplikasi kecil cukup dengan
ref+ props. <script setup>adalah cara modern — kalau tutorial lain memakaiexport default { data() ... }, itu Options API lama; keduanya jalan, tapi pelajari Composition API duluan.
Mau fitur seperti ini dibangun untuk bisnismu?