Lihat gimana Svelte membantu kamu bikin aplikasi kontak.
Halo! Kamu lagi nyari cara asyik buat bikin aplikasi web yang performanya ngebut dan kodenya gampang dipahami, terutama buat aplikasi simpel kayak daftar kontak? Kalau iya, kenalan yuk sama Svelte!
Dibandingkan framework JavaScript lain yang mungkin udah sering kamu dengar, Svelte ini agak beda. Dia bukan framework yang jalan di browser waktu runtime, tapi lebih mirip compiler. Artinya, pas kamu build aplikasi Svelte, Svelte bakal nerjemahin kode Svelte-mu jadi JavaScript "biasa" yang efisien banget, tanpa perlu tambahan runtime Svelte di browser. Hasilnya? Ukuran file lebih kecil dan performa lebih cepat karena nggak ada overhead kayak virtual DOM yang perlu diurusin.
Nah, buat bikin aplikasi kontak sederhana, Svelte itu cocok banget. Kenapa? Karena aplikasi kontak itu dasarnya cuma ngelola daftar data (kontak), nambahin data baru, mungkin ngedit atau nghapus, terus nampilin datanya dalam bentuk daftar. Svelte punya fitur reaktivitas bawaan yang bikin ngurusin data dan nampilinnya itu jadi gampang banget. Kamu nggak perlu pusing mikirin gimana caranya biar UI update otomatis pas data berubah, Svelte yang urusin itu.
Yuk, kita bedah gimana caranya Svelte ngebantu kamu bikin aplikasi kontak ini. Kita bakal mulai dari yang paling dasar sampai nanti aplikasi kontak kita beneran bisa nambahin dan nampilin kontak. Anggap aja ini tutorial santai tapi padat biar kamu langsung bisa praktek.
Persiapan Awal: Memulai Proyek Svelte
Sebelum nyelam lebih dalam, pastiin kamu udah punya Node.js dan npm (atau yarn/pnpm) terinstal di komputermu. Kalau udah, buka terminal atau command prompt, terus ketik perintah ini:
bash
npm create svelte@latest my-contact-app
cd my-contact-app
npm install
npm create svelte@latest my-contact-app
: Ini perintah buat bikin proyek Svelte baru dengan namamy-contact-app
. Kamu bakal ditanya beberapa opsi, pilih aja yang standar (misalnya,Skeleton project
,No
untuk TypeScript,No
untuk ESLint,No
untuk Prettier).cd my-contact-app
: Masuk ke dalam folder proyek yang baru dibuat.
npm install
: Pasang semua dependency* yang dibutuhkan proyek.
Setelah semua beres, kamu bisa jalanin server development dengan perintah npm run dev
. Buka browser ke alamat yang dikasih (biasanya http://localhost:5173
), dan kamu bakal lihat halaman standar Svelte.
Mikirin Struktur Aplikasi Kontak Kita
Aplikasi kontak sederhana ini bisa kita pecah jadi beberapa bagian (komponen) biar lebih rapi dan gampang diurus:
App.svelte
: Ini komponen utama yang bakal jadi wadah buat semua komponen lain. Dia juga yang bakal megang data daftar kontak secara keseluruhan.AddContactForm.svelte
: Komponen ini isinya form buat nginput data kontak baru (nama, nomor telepon, email, dll.). Nanti form ini bakal ngirim data kontak baru ke komponen induk (dalam kasus iniApp.svelte
).ContactList.svelte
: Komponen ini tugasnya nampilin daftar kontak. Dia bakal nerima data daftar kontak dari induknya.ContactItem.svelte
: Komponen ini bakal nampilin detail satu kontak aja.ContactList
nanti bakal pake komponen ini berulang kali buat nampilin setiap kontak dalam daftar.
Data Kontak: Gimana Nyimpennya?
Di Svelte, data yang berubah dan mempengaruhi tampilan itu disebut state. Buat aplikasi kontak, state utamanya adalah daftar kontak itu sendiri, yang bisa kita simpan dalam bentuk array objek. Setiap objek di array itu mewakili satu kontak, isinya { nama: string, telepon: string, email: string, id: string }
. Kenapa ada id
? Biar gampang ngidentifikasi tiap kontak, apalagi kalau nanti mau ngedit atau nghapus. Kamu bisa pakai sesuatu kayak Date.now()
atau library uuid
buat bikin ID unik sederhana.
Di App.svelte
, kita bisa inisialisasi state ini pake let
:
svelte
let contacts = []; // Array kosong di awal
Aplikasi Daftar Kontak
Tapi gimana caranya biar data contacts
ini bisa diakses sama komponen lain (ContactList
) dan gimana caranya komponen lain (AddContactForm
) bisa nambahin data ke array contacts
ini?
Svelte punya beberapa cara buat ngelola state antar komponen:
- Props: Kirim data dari komponen induk ke anak.
App.svelte
bisa ngirimcontacts
keContactList
pake props. - Event Dispatching: Kirim pesan atau data dari komponen anak ke induk.
AddContactForm
bisa ngirim data kontak baru keApp.svelte
pake event. - Stores: Ini semacam "tempat penyimpanan" data yang bisa diakses dari komponen manapun di aplikasi. Untuk aplikasi sederhana kayak gini, stores bisa jadi pilihan yang bagus biar
AddContactForm
danContactList
nggak harus "ngobrol" lewatApp.svelte
terus. Tapi, untuk contoh ini, kita pake cara 1 & 2 dulu biar kebayang alurnya dari induk ke anak dan sebaliknya.
Mari kita fokus ke cara 1 & 2 dulu karena lebih fundamental buat aplikasi kecil.
Mulai Bikin Komponen AddContactForm.svelte
Kita bikin komponen form dulu buat nambahin kontak baru. Bikin file baru src/lib/AddContactForm.svelte
.
svelte
import { createEventDispatcher } from 'svelte';<p>// Data buat input form
let name = '';
let phone = '';
let email = '';</p><p>// Dispatcher buat ngirim event ke komponen induk
const dispatch = createEventDispatcher();</p><p>function handleSubmit() {
// Bikin objek kontak baru
const newContact = {
id: Date.now().toString(), // ID sederhana
name: name,
phone: phone,
email: email
};</p><p>// Validasi sederhana (contoh: nama gak boleh kosong)
if (!name) {
alert('Nama wajib diisi!');
return;
}</p><p>// Kirim event 'addcontact' ke komponen induk
// Data yang dikirim adalah objek newContact
dispatch('addcontact', newContact);</p><p>// Reset form setelah data dikirim
name = '';
phone = '';
email = '';
}
Nama:
Telepon:
Email:
Tambah Kontak
Penjelasan kode AddContactForm.svelte
:
import { createEventDispatcher } from 'svelte';
: Ini kita impor fungsi buat bikin event dispatcher*. let name = '', phone = '', email = '';
: Kita bikin variabel lokal buat nyimpen nilai dari setiap input* form. Pake let
biar variabel ini bisa diubah-ubah. const dispatch = createEventDispatcher();
: Bikin instance dispatcher*.
: Ini elemen form-nya. on:submit
itu buat nangkep event submit form. |preventDefault
itu modifier di Svelte yang otomatis manggil event.preventDefault()
, jadi halaman nggak refresh* pas form disubmit. handleSubmit
itu fungsi yang bakal dipanggil. : Ini elemen input nama. bind:value={name}
itu binding dua arah khas Svelte. Artinya, nilai input ini selalu sinkron sama variabel name
. Kalau inputnya diketik, variabel name
otomatis ke-update. Kalau variabel name
diubah (misalnya pas reset form), nilai inputnya juga otomatis ke-update. Keren kan? required
itu atribut HTML biasa buat validasi dasar dari browser*. function handleSubmit() { ... }
: Fungsi ini jalan pas form disubmit. Dia ambil nilai dari variabel name
, phone
, email
(yang udah sinkron sama input berkat bind:value
), bikin objek newContact
, validasi sederhana, terus panggil dispatch('addcontact', newContact);
. 'addcontact'
ini nama event yang kita bikin sendiri, dan newContact
itu data yang mau kita kirim bareng event* itu. Terakhir, kita reset variabel name
, phone
, email
jadi string kosong, dan berkat bind:value
, input form-nya juga otomatis kosong lagi.
Penjelasan kode ContactItem.svelte
:
export let contact;
: Ini cara Svelte mendefinisikan props*. Variabel contact
ini akan diisi datanya dari komponen induk yang memakai ContactItem
. Kita pake export
di sini. {contact.name}
, {contact.phone}
, {contact.email}
: Ini cara nampilin nilai variabel di Svelte (interpolasi teks). Kalau nilai contact
berubah dari induknya, tampilan di sini otomatis update*. {#if contact.phone}
dan {#if contact.email}
: Ini conditional rendering di Svelte. Konten di dalamnya cuma bakal ditampilin kalau kondisi contact.phone
atau contact.email
itu truthy* (misalnya, bukan string kosong).
Penjelasan kode ContactList.svelte
:
import ContactItem from './ContactItem.svelte';
: Impor komponenContactItem
biar bisa dipake di sini.
export let contacts = [];
: Definisiin props* contacts
. Ini array yang bakal nerima data kontak dari induknya. Dikasih nilai default []
biar aman kalau belum ada data.
{#if contacts.length === 0}
: Cek kalau arraycontacts
kosong. Kalau ya, tampilin "Belum ada kontak".{:else}
: Kalau nggak kosong, baru jalanin yang ini.
{#each contacts as contact (contact.id)}
: Ini looping* di Svelte. Dia bakal jalanin blok kode di dalamnya buat setiap item di array contacts
. contacts
: Array yang mau di-loop*. * as contact
: Setiap item di array sementara disimpan di variabel contact
buat dipake di dalam loop. (contact.id)
: Ini penting banget! Ini namanya key di Svelte (mirip kayak di React atau Vue). Ngasih key unik buat setiap item di list bikin Svelte lebih efisien waktu mau update daftar (misalnya nambahin atau nghapus item). ID kontak yang kita bikin tadi (Date.now()
) itu cocok banget buat jadi key*. : Di dalam loop, kita pake komponen ContactItem
. Sintaks {contact}
itu singkatan dari contact={contact}
. Kita ngirim objek kontak yang sedang di-loop sebagai props* ke komponen ContactItem
.
Menyambungkan Semuanya di App.svelte
Terakhir, kita gabungin semua komponen ini di App.svelte
dan atur gimana datanya mengalir.
Edit file src/App.svelte
:
svelte
import AddContactForm from './lib/AddContactForm.svelte';
import ContactList from './lib/ContactList.svelte';<p>// State utama: array daftar kontak
let contacts = [
// Contoh data awal (opsional)
{ id: '1', name: 'Budi Santoso', phone: '08123456789', email: '[email protected]' },
{ id: '2', name: 'Siti Aminah', phone: '08567890123', email: '[email protected]' }
];</p><p>// Fungsi buat nambah kontak baru
function handleAddContact(event) {
const newContact = event.detail; // Data kontak baru ada di event.detail
contacts = [...contacts, newContact]; // Tambahkan kontak baru ke array
// Penting: Untuk array, cara update-nya gini. Svelte mendeteksi perubahan
// pada variabel <code>contacts</code> ketika nilainya <em>diganti</em> dengan array baru
// (meskipun isinya nambah). Kalau cuma <code>contacts.push(newContact)</code>,
// Svelte TIDAK akan mendeteksi perubahan secara otomatis.
}</p><p>// Reaktivitas Svelte: Contoh, menghitung jumlah kontak
$: totalContacts = contacts.length; // Ini sintaks reaktivitas ($:)</p><p>
Aplikasi Daftar Kontak Keren Total Kontak: {totalContacts}
Penjelasan kode App.svelte
:
import AddContactForm from './lib/AddContactForm.svelte';
danimport ContactList from './lib/ContactList.svelte';
: Mengimpor komponen yang sudah kita buat.
let contacts = [...]
: Mendefinisikan state* contacts
yang jadi sumber data utama. Kita bisa isi data awal di sini kalau mau. function handleAddContact(event) { ... }
: Fungsi ini bakal dipanggil pas event addcontact
dari AddContactForm
terpicu. Data yang dikirim bareng event* (newContact
) ada di event.detail
. contacts = [...contacts, newContact];
: Ini bagian paling Svelte-nya. Kita tidak pake contacts.push(newContact)
. Di Svelte, untuk array dan object yang punya state (let
), deteksi reaktivitasnya berjalan ketika variabel tersebut ditugaskan dengan nilai baru. Dengan ...contacts
(spread syntax) kita bikin array baru yang isinya semua elemen dari array contacts
yang lama, terus ditambah newContact
. Karena variabel contacts
ditugaskan dengan array baru, Svelte tahu ada perubahan dan otomatis update* UI yang bergantung pada variabel contacts
(dalam hal ini ContactList
). $: totalContacts = contacts.length;
: Nah, ini sintaks reaktivitas Svelte yang paling khas: $:
(labeled statement). Baris ini artinya, setiap kali nilai contacts
berubah, Svelte akan otomatis menghitung ulang contacts.length
dan meng-update variabel totalContacts
. Dan kalau variabel totalContacts
ini dipakai di template HTML (misalnya di
Total Kontak: {totalContacts}
), Svelte juga otomatis akan me-render* ulang bagian itu. Simpel banget, kan? Nggak perlu useEffect
atau semacamnya. : Di sini kita pakai komponen AddContactForm
dan mendengarkan event addcontact
yang dikirimnya. Pas event* itu terjadi, fungsi handleAddContact
dipanggil. : Di sini kita pakai komponen ContactList
dan mengirim array contacts
sebagai props. Karena variabel contacts
itu reaktif (bisa berubah), pas nilainya berubah (setelah nambah kontak baru), Svelte otomatis ngasih tahu ContactList
buat update* tampilannya.