- Bab 3 dari 10
- 30 menit
- 1 latihan kode
- 4 soal kuis
JSX dan komponen: aturan menulis UI di JavaScript
Di bab ini (9 bagian)
Tujuan bab ini
- Memahami apa itu JSX dan menjadi apa JSX setelah dikompilasi.
- Menulis JSX sesuai aturannya: satu root,
className, tag tertutup, camelCase, ekspresi dalam{}. - Membuat function component dengan nama kapital, lalu meng-export dan meng-import-nya.
- Menyusun komponen kecil menjadi tampilan besar (komposisi).
Apa itu JSX?
JSX (JavaScript XML) adalah perluasan sintaks JavaScript yang membuat kamu bisa menulis struktur mirip HTML langsung di dalam kode JavaScript.
Penting: JSX bukan HTML dan bukan string. Browser tidak mengerti JSX. Saat build, alat seperti Babel atau esbuild (dipakai Vite) mengubah JSX menjadi pemanggilan fungsi JavaScript biasa.
JSX dikompilasi jadi apa?
Di masa lalu, JSX diubah menjadi React.createElement(...). Sejak React 17 ada "JSX transform" baru yang memakai fungsi jsx() dari react/jsx-runtime, dan inilah yang dipakai Vite. Hasilnya sama: sebuah objek yang menggambarkan elemen.
Objek inilah yang menjadi bahan Virtual DOM dari bab sebelumnya. Karena JSX pada akhirnya adalah ekspresi JavaScript, kamu bisa menyimpannya di variabel, mengembalikannya dari fungsi, atau memasukkannya ke array.
Ini juga menjelaskan kenapa nama komponen harus kapital. Saat kompilator melihat <profil /> (huruf kecil), ia membuat createElement("profil") dengan string, dianggap tag HTML. Saat melihat <Profil />, ia membuat createElement(Profil) yang merujuk ke fungsi komponenmu.
Aturan penulisan JSX
1. Satu elemen root
Sebuah ekspresi JSX hanya boleh punya satu elemen terluar, karena satu fungsi tidak bisa mengembalikan dua objek sekaligus. Kalau tidak mau menambah <div> ekstra, pakai Fragment <>...</>.
2. className, bukan class
class adalah kata kunci JavaScript, jadi atribut CSS ditulis className. Sama halnya for pada label menjadi htmlFor.
3. Semua tag harus ditutup
Di HTML kamu boleh menulis <br> atau <img src="a.png">. Di JSX semua tag wajib ditutup, termasuk yang tanpa isi: <br />, <img src={url} alt="foto" />, <input type="text" />.
4. Atribut memakai camelCase
Atribut yang terdiri dari beberapa kata ditulis camelCase: onClick, onChange, tabIndex, maxLength. Pengecualian: atribut aria-* dan data-* tetap pakai tanda hubung.
Atribut style menerima objek, bukan string, dan nama properti CSS-nya juga camelCase:
5. Ekspresi JavaScript di dalam {}
Di dalam {} kamu boleh menaruh ekspresi apa pun: variabel, operasi matematika, pemanggilan fungsi, ternary, atau map.
Yang tidak boleh adalah pernyataan (statement) seperti if, for, atau deklarasi const langsung di dalam {}. Kalau butuh percabangan, pakai ternary di dalam JSX atau if di atas return.
Beberapa nilai tidak tampil apa-apa di layar: true, false, null, dan undefined. Angka 0 justru tampil. Ini akan penting di bab rendering bersyarat.
Komponen fungsi
Komponen adalah fungsi JavaScript yang mengembalikan JSX. Itu saja.
Aturannya:
- Nama diawali huruf kapital.
TombolKirim, bukantombolKirim. - Mengembalikan JSX (atau
nullkalau tidak ingin menampilkan apa-apa). - Didefinisikan di level atas file, bukan di dalam komponen lain. Komponen yang dibuat di dalam komponen lain akan dianggap tipe baru setiap render, sehingga isinya terus dibuat ulang dan state-nya hilang.
Export dan import komponen
Biasanya satu komponen disimpan di satu file. Ada dua gaya export:
| Gaya | Cara export | Cara import |
|---|---|---|
| Default | export default function TombolKirim | import TombolKirim from "./TombolKirim.jsx" |
| Named | export function IkonCek | import { IkonCek } from "./Ikon.jsx" |
Satu file hanya boleh punya satu default export, tapi boleh banyak named export. Pada default import kamu bebas memberi nama apa pun; pada named import namanya harus sama persis dengan yang di-export.
Komposisi: menyusun komponen
Kekuatan komponen ada di komposisi: komponen kecil dirangkai jadi komponen lebih besar, seperti menyusun LEGO.
Hasilnya membentuk pohon komponen: App di puncak, di bawahnya FormKontak, dan di dalamnya TombolKirim. Kalau desain tombol berubah, kamu cukup mengedit satu file dan semua form ikut berubah.
Kapan memecah komponen? Patokan praktis: kalau sebuah bagian dipakai lebih dari sekali, atau sebuah komponen sudah terlalu panjang untuk dibaca sekali lihat, pecah jadi komponen baru.
Kesalahan umum
- Mengembalikan dua elemen sejajar tanpa pembungkus. Bungkus dengan
<div>atau Fragment. - Menulis
classdanfor, bukanclassNamedanhtmlFor. - Lupa menutup tag seperti
<img>dan<input>. - Nama komponen huruf kecil, sehingga dianggap tag HTML dan tidak dirender.
- Menaruh
ifdi dalam{}. Pakai ternary atau pindahkanifke atasreturn. - Salah gaya import: memakai
{ }untuk default export atau sebaliknya.
Rangkuman
- JSX adalah sintaks mirip HTML di JavaScript yang dikompilasi menjadi pemanggilan fungsi yang menghasilkan objek elemen.
- Aturan JSX: satu root (atau Fragment),
className, semua tag ditutup, atribut camelCase, ekspresi di dalam{}. - Komponen adalah fungsi bernama kapital yang mengembalikan JSX, didefinisikan di level atas file.
- Default export di-import tanpa kurung kurawal, named export dengan kurung kurawal.
- Komposisi menyusun komponen kecil menjadi pohon komponen yang mudah dirawat.
Slide 14 sampai 16 dari deck ReactJS. Penjelasan lengkapnya ada di mode Baca.

Selesaikan bab ini
- 1. Baca materi
- 2. Latihan kode (1)
- 3. Kuis (4 soal)
Latihan kode: Membuat objek elemen seperti hasil JSX
JSX dikompilasi menjadi pemanggilan fungsi yang menghasilkan objek. Tiru prosesnya dengan dua fungsi:
buatElemen(type, props, ...children)mengembalikan objek{ type, props }:propsadalah salinan baru dari props yang diberikan (nulldianggap{}); objek asli tidak boleh diubah.- Tanpa children:
propstidak punya keychildren. - Satu child:
props.childrenberisi child itu langsung. - Lebih dari satu:
props.childrenberisi array.
jenisTag(nama)mengembalikan"komponen"bila huruf pertamanamakapital, dan"html"bila tidak.
Contoh: buatElemen("h1", { className: "judul" }, "Halo, ", "Rina", "!") menghasilkan { type: "h1", props: { className: "judul", children: ["Halo, ", "Rina", "!"] } }, persis bentuk yang kamu tulis sebagai <h1 className="judul">Halo, {nama}!</h1>. Fungsi jenisTag meniru cara kompilator memutuskan apakah <Profil /> merujuk ke komponen atau ke tag HTML.
Cek pemahaman
1Kenapa JSX memakai className, bukan class?
2Teks apa yang tampil di layar?
const harga = 15000; const jumlah = 3; const el = <p>Total: Rp{harga * jumlah}</p>;3Menulis <profil /> dengan huruf kecil akan merender komponen Profil buatanmu.
4File Ikon.jsx berisi export function IkonCek(). Cara import mana yang benar?
