JSX Dasar — React

Pernah kebayang nulis HTML di dalam JavaScript? Awalnya kedengeran aneh — kayak nuangin teh ke gelas yang lagi isi kopi. Tapi pas dicoba, kamu ngerti kenapa…

JSX adalah cara menulis tampilan di React: bentuknya mirip HTML, tapi ditulis di dalam JavaScript. Namanya singkatan dari JavaScript XML. Browser gak mengerti JSX, jadi sebelum kodenya jalan, build tool seperti Vite mengubah tiap tag JSX jadi panggilan fungsi JavaScript biasa. Mirip template undangan: kalimatnya sudah dicetak, nama tamunya diisi di kotak kosong. Di JSX, kotak kosong itu ditulis dengan kurung kurawal {}.

🧪 Tebakan cepat: ada const nama = "Budi", lalu kamu menulis <h2>Halo, nama!</h2>. Yang tampil Halo, Budi! atau Halo, nama!? Jawabannya ada di bagian "Kurung kurawal: tempat nilai JavaScript".

JSX jadi apa?

Ambil komponen kecil ini:

function App() {
  const nama = "Budi"
  const jumlah = 3

  return (
    <div className="kartu">
      <h2>Halo, {nama}!</h2>
      <p>Kamu punya {jumlah * 2} poin.</p>
    </div>
  )
}

Sebelum jalan, JSX di dalam return itu diubah jadi:

React.createElement(
  "div",
  { className: "kartu" },
  React.createElement("h2", null, "Halo, ", nama, "!"),
  React.createElement("p", null, "Kamu punya ", jumlah * 2, " poin.")
)

Lalu React membuat DOM ini di halaman:

<div class="kartu">
  <h2>Halo, Budi!</h2>
  <p>Kamu punya 6 poin.</p>
</div>

Kurung kurawal: tempat nilai JavaScript

Dengan nama = "Budi":

JSX Yang tampil
<h2>{nama}</h2> Budi
<h2>nama</h2> nama
<p>{2 + 3}</p> 5
<p>{nama.toUpperCase()}</p> BUDI
<p>{nama === "Budi" ? "Halo Bos" : "Halo"}</p> Halo Bos

Tanpa kurung kurawal, nama cuma teks biasa. Jadi <h2>Halo, nama!</h2> menampilkan Halo, nama!, bukan Halo, Budi!. Itu jawaban tebakannya.

Di dalam {} cuma boleh ekspresi: kode yang menghasilkan satu nilai, seperti variabel, hitungan, pemanggilan fungsi, atau ternary syarat ? a : b. Statement seperti if, for, atau const gak bisa ditaruh di sana, karena statement gak menghasilkan nilai. {if (login) { ... }} gagal di-compile.

Aturan JSX yang beda dari HTML

  1. Satu elemen paling luar. return cuma bisa mengembalikan satu nilai, jadi dua elemen sejajar harus dibungkus. Pakai <div>, atau Fragment <>...</> kalau kamu gak mau ada elemen tambahan di DOM.
  2. Semua tag ditutup. <img />, <br />, <input />. Di HTML boleh <br>, di JSX wajib ada /.
  3. className, bukan class. htmlFor, bukan for. class dan for adalah kata kunci di JavaScript.
  4. Atribut dua kata pakai camelCase. onClick, tabIndex, maxLength. style diisi objek, jadi kurung kurawalnya dua: style={{ color: "red" }}.
  5. Comment ditulis {/* ... */}. <!-- --> gak berlaku di JSX.
function App() {
  return (
    <>
      {/* Fragment: gak ada div tambahan di DOM */}
      <h1 className="judul">Toko Budi</h1>
      <img src="logo.png" alt="Logo Toko Budi" />
      <label htmlFor="email">Email</label>
      <input id="email" maxLength={40} />
      <p style={{ color: "gray" }}>Buka setiap hari.</p>
    </>
  )
}

⚠️ Jebakan yang sering ketemu

TL;DR: JSX (JavaScript XML) adalah tulisan mirip HTML di dalam JavaScript. Tiap tag diubah jadi React.createElement(jenis, atribut, ...isi), lalu React membuat DOM-nya. {} menyisipkan nilai JavaScript (cuma ekspresi, bukan if atau for); tanpa {}, tulisannya jadi teks biasa. Aturannya: satu elemen paling luar per return (bungkus dengan <div> atau Fragment <>...</>), semua tag ditutup (<img />), className dan htmlFor, atribut camelCase, style={{ ... }}, dan comment {/* ... */}.

Yang akan kamu pelajari