JSX — adalah ekstensi sintaks mirip XML untuk JavaScript yang dikembangkan oleh tim React untuk mendeskripsikan antarmuka pengguna secara deklaratif. Tidak seperti mesin templat, JSX dikompilasi menjadi panggilan fungsi JavaScript biasa, memberikan kekuatan penuh bahasa di dalam markup. Menurut React, 2024, JSX didukung di semua framework dan pustaka React modern.
Poin utama
JSX (JavaScript XML) — ekstensi sintaks untuk JavaScript, pertama kali diperkenalkan di React pada tahun 2013. Ini memungkinkan pengembang untuk mendeskripsikan struktur antarmuka pengguna secara deklaratif, menggabungkan markup dan logika dalam satu file.
Sebelum munculnya JSX, pengembang menggunakan templat teks (Mustache, Handlebars) atau membuat elemen DOM secara manual melalui document.createElement. Kedua pendekatan memiliki kekurangan: templat teks tidak diperiksa tipenya, dan pembuatan DOM manual rumit dan rentan terhadap kesalahan.
React memilih jalan yang berbeda — menyematkan markup langsung ke dalam kode. Keputusan ini menimbulkan perdebatan di komunitas, tetapi seiring waktu menjadi standar. Saat ini JSX tidak hanya digunakan di React, tetapi juga di SolidJS, Preact, Qwik dan bahkan di Vue melalui plugin.
Elemen JSX terlihat seperti tag HTML, tetapi disematkan langsung ke JavaScript. Setiap elemen ditranspilasi menjadi panggilan React.createElement dengan tiga argumen: tipe elemen, objek props, dan elemen anak. Satu elemen root — aturan wajib: ekspresi JSX harus mengembalikan satu elemen induk atau fragmen.
import React from 'react';
// JSX dasar - satu elemen root
const element = (
<div className="app">
<h1>Hello, World!</h1>
<p>Welcome to React</p>
</div>
);
Ketika node DOM tambahan tidak diperlukan, gunakan React.Fragment atau sintaks pendek <></>. Fragmen tidak membuat elemen DOM nyata, hanya mengelompokkan node anak. Ini sangat berguna dalam tabel dan daftar, di mana pembungkus tambahan akan mengganggu struktur HTML.
function Columns() {
return (
<>
<td>First</td>
<td>Second</td>
</>
);
}
Ekspresi JavaScript apa pun disisipkan ke JSX melalui kurung kurawal { }. Di dalamnya dapat digunakan variabel, panggilan fungsi, operator ternary, dan metode array. Rendering bersyarat dilakukan melalui operator ternary atau AND logis.
function Greeting({ name, isLoggedIn }) {
const items = ['Red', 'Green', 'Blue'];
return (
<div>
{/* Expression with variable */}
<h1>Hello, {name}</h1>
{/* Conditional rendering */}
{isLoggedIn ?
<p>Welcome back!</p :
<button>Login</button>
}
{/* Render array */}
<ul>
{items.map(item =>
<li key={item}>{item}</li>
)}
</ul>
</div>
);
}
Batasan utama — di dalam kurung kurawal hanya dapat digunakan ekspresi, bukan pernyataan. if/else, for, switch tidak dapat digunakan — hanya operator ternary, operator logis, dan metode array. Panggilan fungsi, termasuk fungsi panah, diperbolehkan.
JSX secara visual mirip dengan HTML, tetapi memiliki perbedaan mendasar. Atribut ditulis dalam camelCase — className bukan class, onClick bukan onclick, tabIndex bukan tabindex. Ini karena JSX ditranspilasi ke JavaScript, di mana tanda hubung dalam nama properti tidak diperbolehkan.
| HTML | JSX | Alasan |
|---|---|---|
class="wrapper" | className="wrapper" | class — kata yang dilindungi di JS |
onclick="handle()" | onClick={handle} | camelCase untuk properti JS |
style="color: red" | style={{ color: 'red' }} | Objek gaya bukan string |
<input disabled> | <input disabled={true}> | Penentuan eksplisit atribut boolean |
Perbedaan penting lainnya — tag yang menutup sendiri. Di HTML, beberapa tag (br, hr, input) mungkin tidak ditutup. Di JSX, semua tag yang menutup sendiri harus memiliki garis miring penutup: <br />, <input />. Nama atribut SVG juga dikonversi ke camelCase: strokeWidth, fillOpacity.
Peramban tidak memahami JSX secara langsung. Sebelum eksekusi, kode JSX melewati transpiler — Babel, TypeScript atau esbuild. Setiap elemen JSX diubah menjadi panggilan createElement atau jsx/runtime.
// JSX asli
const element = <h1 className="title">Hello</h1>;
// Setelah transpilasi
const element = React.createElement(
'h1',
{ className: 'title' },
'Hello'
);
Sejak React 17, muncul transformasi JSX baru yang tidak memerlukan impor React. Impor otomatis jsx-runtime memungkinkan penulisan komponen tanpa import React from 'react'. Babel dan TypeScript mendukung transformasi ini melalui pengaturan {"runtime": "automatic"}.
Meskipun JSX diasosiasikan dengan React, framework lain juga menggunakannya. SolidJS menggunakan JSX dengan kompilasi ke node DOM nyata, tanpa Virtual DOM. Preact — alternatif ringan untuk React dengan dukungan penuh JSX. Vue mendukung JSX melalui @vue/babel-plugin-jsx, meskipun templat utamanya adalah template.
Perbedaan utama — semantik ekspresi. Di React, ekspresi JSX dieksekusi setiap kali rendering. Di SolidJS, JSX dikompilasi sekali, dan pembaruan dilacak melalui sinyal. Ini memengaruhi kinerja: SolidJS tidak memerlukan Virtual DOM dan rekonsiliasi, sehingga rendering JSX lebih cepat.
Di TypeScript, JSX didukung di tingkat bahasa. File dengan ekstensi .tsx secara otomatis memproses sintaks JSX. Tipifikasi props — salah satu keunggulan utama TypeScript + JSX: IDE menyarankan atribut yang diharapkan, tipe callback, dan kewajiban props.
Tulis kode JSX yang mudah dibaca dan dipelihara. Keluarkan ekspresi kompleks ke variabel atau fungsi terpisah — ini meningkatkan keterbacaan dan memungkinkan pengujian logika terpisah dari markup. Gunakan fragmen daripada pembungkus div yang tidak perlu.
Aturan indentasi — patuhi indentasi untuk elemen bersarang. Setiap tingkat sarang — satu tingkat indentasi. Tag penutup harus sejajar dengan tag pembuka. Untuk atribut panjang, gunakan pemutusan baris.
Hindari fungsi panah inline di props, jika dibuat setiap kali rendering. Dalam kasus seperti itu, bungkus callback dalam useCallback atau keluarkan fungsi ke luar komponen. Bagi komponen kompleks menjadi lebih kecil — setiap komponen harus bertanggung jawab atas satu unit logis antarmuka.
Pertanyaan yang sering diajukan
Ya, melalui plugin Babel @babel/plugin-transform-react-jsx JSX dapat dikonfigurasi untuk pustaka apa pun. SolidJS, Preact, Nerv, dan framework lain menggunakan JSX dengan runtime mereka sendiri. Untuk kemandirian penuh, dapat mengatur pragma ke fungsi sendiri.
class adalah kata yang dilindungi di JavaScript. JSX ditranspilasi menjadi createElement, di mana argumen kedua adalah objek props. Properti class bertentangan dengan sintaks kelas ES6, oleh karena itu React memilih className.
Gunakan string templat atau pustaka classnames: className={`“btn ${isActive ? 'active' : ''}”`}. Untuk logika kompleks, pasang paket npm clsx atau classnames, yang menerima objek dan array.
JSX hanya mendukung ekspresi, bukan pernyataan. Untuk kondisi, gunakan operator ternary, AND logis (&&) atau OR logis (||). Untuk logika kompleks, keluarkan kondisi ke variabel atau fungsi terpisah.
Atribut key membantu React mengidentifikasi elemen daftar saat render ulang. Tanpa key, React menggambar ulang seluruh daftar saat berubah. Dengan key unik, React menggunakan kembali node DOM dan mengurutkan ulang elemen, bukan membuatnya kembali.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga