JSX di Solid — SolidJS

Solid menggunakan JSX seperti React, tapi dengan perbedaan penting. Perbedaan dengan React // Solid - function hanya dijalankan SEKALI function Counter() {…

JSX adalah cara menulis tag mirip HTML langsung di dalam JavaScript. Di Solid, compiler menerjemahkan JSX itu jadi elemen DOM asli, elemen yang sama dengan hasil document.createElement. Bayangin Kak Nadia membuat kartu harga untuk tiap buku di Toko Buku Kak Nadia. Dia membuat satu cap berisi bagian yang selalu sama (bingkai, tulisan "Rp"), lalu tiap kartu cukup dicap, dan bagian yang beda (judul, harga) ditulis tangan di tempat kosongnya. JSX-mu adalah rancangan kartunya. Compiler Solid membuat capnya sekali, dan tiap komponen dipakai, capnya ditekan jadi elemen asli lalu bagian kosongnya diisi.

🧪 Tebakan cepat: di Solid, const judul = <h1>Toko Buku Kak Nadia</h1> lalu console.log(judul). Yang tercetak apa: objek gambaran seperti { type: "h1", props: {...} }, teks "<h1>Toko Buku Kak Nadia</h1>", atau elemen <h1> asli? Jawabannya ada di bagian "JSX jadi elemen DOM asli".

Menulis JSX

const buku = { judul: "Laskar Pelangi", penulis: "Andrea Hirata", harga: 89000 }

function KartuBuku() {
  return (
    <div class="kartu">
      <h2>{buku.judul}</h2>
      <p>{buku.penulis}</p>
      <p style={{ color: "#b45309", "font-size": "20px" }}>
        Rp{buku.harga.toLocaleString("id-ID")}
      </p>
    </div>
  )
}

Hasilnya kartu berisi judul Laskar Pelangi, penulis Andrea Hirata, dan harga Rp89.000 berwarna cokelat.

Latihan pelajaran ini memakai aturan yang sama: di dalam <div> yang sudah ada, tambahkan <h1>Belajar Solid</h1> dan <p>Solid menggunakan JSX.</p>. Teksnya dicek persis, termasuk titik di akhir paragraf.

JSX jadi elemen DOM asli

Ini kode yang ditulis compiler Solid 1.9 (babel-preset-solid) untuk KartuBuku tadi:

var _tmpl$ = _$template(`<div class=kartu><h2></h2><p></p><p style=color:#b45309;font-size:20px>Rp`)

function KartuBuku() {
  return (() => {
    var _el$ = _tmpl$(),
      _el$2 = _el$.firstChild,
      _el$3 = _el$2.nextSibling,
      _el$4 = _el$3.nextSibling
    _$insert(_el$2, () => buku.judul)
    _$insert(_el$3, () => buku.penulis)
    _$insert(_el$4, () => buku.harga.toLocaleString("id-ID"), null)
    return _el$
  })()
}

Jadi console.log(judul) mencetak elemen <h1> asli, sebuah HTMLHeadingElement yang bisa kamu tempel ke halaman dengan document.body.append(judul). Itu jawaban tebakannya. Di React, JSX yang sama menghasilkan objek gambaran ({ type: "h1", props: {...} }) yang baru jadi elemen setelah React memprosesnya.

Nama atribut ala HTML: class dan for

Karena compiler Solid menulis JSX-mu jadi string HTML dan pemanggilan DOM langsung, nama atributnya mengikuti HTML:

<label for="cari">Cari buku</label>
<input id="cari" class="kotak-cari" />

style sebagai objek

Atribut style boleh string biasa (style="color: red"), atau objek di dalam kurung kurawal ganda: kurung luar untuk JavaScript, kurung dalam untuk objeknya.

<p style={{ color: "#b45309", "font-size": "20px" }}>Rp89.000</p>

Editor latihan di sini memakai model kecil Solid, bukan compiler aslinya, dan di sana fontSize kebetulan masih jalan. Jangan jadikan patokan: di proyek Solid sungguhan, pakai kebab-case.

⚠️ Jebakan yang sering ketemu

TL;DR: JSX di Solid di-compile jadi elemen DOM asli: bagian tetapnya jadi satu template HTML yang di-clone, bagian {...} diisi lewat insert. Karena itu <h1>...</h1> menghasilkan HTMLHeadingElement sungguhan, bukan objek gambaran seperti di React. Nama atributnya ikut HTML: class (bukan className) dan for (bukan htmlFor). style boleh objek dengan kunci kebab-case bertanda kutip, style={{ color: "#b45309", "font-size": "20px" }}; camelCase seperti fontSize dibuang browser. Kembalikan satu elemen terluar, tutup semua tag, dan pakai kurung kurawal untuk nilai JavaScript.

Yang akan kamu pelajari