Props Svelte — Svelte

Props memungkinkan komponen menerima data dari parent. Di Svelte, gunakan export let untuk mendeklarasikan prop. Mendeklarasikan Props export let nama export…

Props adalah data yang dikirim komponen induk ke komponen anak, mirip argumen yang dikirim ke function. Di pelajaran sebelumnya, tiga <MenuItem /> semuanya "Nasi Goreng". Props yang membuat tiap salinan punya isinya sendiri. Bayangin nota pesanan Warung Bu Sri yang dicetak kosong: "Selamat datang, ____!". Notanya sama untuk semua pembeli, kasir tinggal mengisi namanya. Kadang di sudutnya sudah tercetak salam bawaan, dan kasir boleh menimpanya dengan salam lain. Komponen adalah nota cetaknya, prop adalah isian kosongnya, dan nilai bawaan adalah salam yang sudah tercetak.

🧪 Tebakan cepat: komponen Sapaan menampilkan <p>{pesan}, {nama}!</p>, dengan pesan punya nilai bawaan "Selamat datang" dan nama gak punya. Induknya cuma menulis <Sapaan />, tanpa mengirim apa-apa. Yang tampil error, Selamat datang, !, atau Selamat datang, undefined!? Jawabannya ada di bagian "Prop yang gak dikirim".

Mendeklarasikan prop dengan export let

Di Svelte 4, prop ditulis sebagai variabel dengan kata export di depannya. Ini Sapaan.svelte:

<script>
  export let nama
  export let pesan = "Selamat datang"
</script>

<p>{pesan}, {nama}!</p>

Mengirim prop dari induk

Di komponen induk, prop dikirim seperti atribut HTML:

<script>
  import Sapaan from "./Sapaan.svelte"
</script>

<Sapaan nama="Budi" />
<Sapaan nama="Sari" pesan="Apa kabar" />
Ditulis induk Tampil
<Sapaan nama="Budi" /> Selamat datang, Budi!
<Sapaan nama="Sari" pesan="Apa kabar" /> Apa kabar, Sari!

Sekarang kartu menu warung bisa beda-beda. MenuItem.svelte menerima dua prop:

<script>
  export let nama
  export let harga
</script>

<h3>{nama}</h3>
<p>Rp {harga.toLocaleString("id-ID")}</p>
<MenuItem nama="Nasi Goreng" harga={15000} />
<MenuItem nama="Mie Ayam" harga={12000} />
<MenuItem nama="Es Teh" harga={5000} />

Tiga kartu, tiga isi: Nasi Goreng Rp 15.000, Mie Ayam Rp 12.000, Es Teh Rp 5.000. harga={5000} mengirim angka. harga="5000" mengirim string, dan toLocaleString gak memformat string, jadi yang tampil Rp 5000, bukan Rp 5.000.

Prop yang gak dikirim

Induk menulis <Sapaan />. Ini yang terjadi:

Svelte 4 Svelte 5
Tampil Selamat datang, undefined! Selamat datang, !
Console (mode dev) <Sapaan> was created without expected prop 'nama' gak ada warning

Gak ada error. pesan memakai nilai bawaannya, sedangkan nama jadi undefined, dan Svelte 4 menampilkannya sebagai tulisan undefined. Itu jawaban tebakannya. Warning-nya cuma muncul di mode dev, saat npm run dev. Build produksi diam saja.

Prop yang hilang bisa lebih parah dari tulisan undefined. <MenuItem nama="Es Teh" /> tanpa harga membuat harga.toLocaleString(...) gagal dengan TypeError: Cannot read properties of undefined (reading 'toLocaleString'), dan aplikasinya berhenti di error itu.

Latihan kedua sengaja dijalankan tanpa induk yang mengirim apa pun. Jadi paragrafnya menampilkan Selamat datang, undefined!, dan itu benar: yang diperiksa adalah nilai bawaan Selamat datang yang benar-benar tampil.

Spread: kirim semua sekaligus

Kalau datanya sudah ada di satu objek, kirim semua isinya dengan spread:

<script>
  import Sapaan from "./Sapaan.svelte"
  const pelanggan = { nama: "Sari", pesan: "Apa kabar" }
</script>

<Sapaan {...pelanggan} />

{...pelanggan} sama dengan menulis nama="Sari" pesan="Apa kabar". Tiap properti objek jadi satu prop dengan nama yang sama. Kalau nama variabelnya sama dengan nama prop, ada juga singkatan seperti atribut: <Sapaan {nama} /> sama dengan <Sapaan nama={nama} />.

Svelte 5: $props

Di Svelte 5 dengan runes, prop diambil dari $props():

<script>
  let { nama, pesan = "Selamat datang" } = $props()
</script>

<p>{pesan}, {nama}!</p>

Latihan pelajaran ini memeriksa export let, jadi di editor latihan tulis gaya Svelte 4.

⚠️ Jebakan yang sering ketemu

TL;DR: Prop adalah data dari induk ke anak. Di Svelte 4 ditulis export let nama (wajib, tanpa nilai awal) dan export let pesan = "Selamat datang" (dengan nilai bawaan yang dipakai saat induk gak mengirimnya). Induk mengirim seperti atribut: <Sapaan nama="Budi" /> untuk string, harga={5000} untuk angka, atau {...pelanggan} untuk semua isi objek sekaligus. Prop wajib yang gak dikirim tampil sebagai undefined di Svelte 4 (kosong di Svelte 5), dengan warning di mode dev, dan bisa bikin TypeError kalau dipakai sebagai objek. Di Svelte 5 caranya let { nama, pesan = "Selamat datang" } = $props(), dan gak boleh dicampur dengan export let.

Yang akan kamu pelajari