Props: Mengirim Data ke Komponen Anak

defineProps (bentuk array & objek), validasi tipe, required & default, aliran data satu arah, props dinamis, dan v-bind objek.

Part 12 dari 25 ± 50 menit Gratis

Komponen yang bisa dikonfigurasi

Komponen KartuProduk yang selalu menampilkan "Laptop" tidak berguna. Kita ingin memberinya nama dan harga berbeda tiap pemakaian. Itulah fungsi props: atribut khusus yang diterima komponen dari induknya, seperti argumen pada sebuah fungsi.

Mendeklarasikan props

<script setup>
// bentuk array (sederhana, tanpa validasi)
defineProps(['nama', 'harga'])

// bentuk objek (disarankan: ada tipe, required, default)
defineProps({
  nama: { type: String, required: true },
  harga: { type: Number, required: true },
  stok: { type: Number, default: 0 },
  tag: { type: Array, default: () => [] },   // objek/array: default berupa fungsi
})
</script>

defineProps adalah compiler macro: tidak perlu diimpor. Props langsung bisa dipakai di template.

Jika ingin mengakses props di script, simpan hasilnya:

const props = defineProps({ nama: String })
console.log(props.nama)

Mengirim props dari induk

<KartuProduk nama="Laptop" :harga="8000000" :stok="5" />
<KartuProduk v-for="p in produk" :key="p.id" v-bind="p" />
PenulisanArti
nama="Laptop"String literal
:harga="8000000"Ekspresi JS → angka (tanpa titik dua akan jadi string "8000000")
:aktif="true" / aktifBoolean (atribut tanpa nilai = true)
v-bind="objek"Kirim semua properti objek sebagai props

Nama props di script ditulis camelCase (namaLengkap), tetapi di template induk boleh kebab-case (nama-lengkap="...").

Aliran data satu arah

Jangan ubah props di komponen anak! Props mengalir ke bawah (induk → anak). Jika anak butuh versi yang bisa diubah, salin ke state lokal atau buat computed. Jika anak ingin meminta perubahan, ia mengirim event ke induk (bab 13).

// salin sebagai nilai awal
const props = defineProps({ awal: Number })
const hitung = ref(props.awal)

// turunan dari props
const harga2x = computed(() => props.harga * 2)

Validasi props

defineProps({
  level: {
    type: String,
    validator: (v) => ['pemula', 'mahir'].includes(v),
  },
  umur: [Number, String],     // beberapa tipe sekaligus
})

Validasi hanya memunculkan peringatan di console (mode development); aplikasi tetap jalan.

Tipe yang didukung

String, Number, Boolean, Array, Object, Date, Function, Symbol, atau class buatan sendiri.

Kesalahan umum

  • Mengirim angka tanpa titik dua: harga="5000" menjadi string, padahal prop bertipe Number → peringatan.
  • Default untuk objek/array ditulis langsung (default: []) — harus fungsi: () => [].
  • Mengubah props.nama = ... → peringatan "Attempting to mutate prop".

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X