Bayangkan Anda menulis HTML, tetapi dengan kekuatan penuh JavaScript yang berjalan di balik layar. Itulah kurang lebih kesan pertama ketika berkenalan dengan JSX di React. Bagi banyak pengembang front-end, JSX sering menjadi titik awal kebingungan: “Ini HTML atau JavaScript?”, “Kenapa pakai kurung kurawal di tengah tag?”, atau “Apakah ini wajib digunakan di React?”
Dalam artikel ini, kita akan membedah JSX secara menyeluruh: mulai dari konsep dasarnya, fungsi dan perannya dalam ekosistem React, hingga bagaimana menerapkannya dengan benar dalam kode sehari-hari. Dengan memahami JSX, Anda tidak hanya akan lebih nyaman menulis komponen React, tetapi juga dapat melihat dengan lebih jelas bagaimana UI yang Anda bangun sesungguhnya diterjemahkan menjadi JavaScript murni.
Mari mulai mengenal JSX-bahasa “campuran” yang menjadi jembatan antara cara kita memikirkan tampilan antarmuka dan cara React memprosesnya di balik layar.
Perbedaan JSX dengan JavaScript Biasa dan Cara Mesin React Menerjemahkannya
Secara teknis, JSX itu bukan bahasa baru, tapi lebih seperti lapisan gula di atas JavaScript biasa. Kalau di JavaScript murni kita harus memanggil fungsi seperti React.createElement() secara eksplisit, di JSX kita cukup menulis struktur mirip HTML yang jauh lebih enak dibaca. Bedanya, di JSX kita masih bermain di dunia JavaScript penuh, jadi tetap bisa menyisipkan ekspresi dengan {}, dan semua itu nantinya diubah oleh build tools (misalnya Babel atau bundler seperti Vite/Webpack) menjadi JavaScript biasa sebelum masuk ke browser. Browser sebenarnya tidak “mengerti” JSX; yang dia tahu cuma JavaScript murni, sementara JSX berhenti di tahap compile. Di balik layar, JSX akan diterjemahkan menjadi objek-objek yang mewakili elemen React.
- JSX: Penulisan deklaratif, mirip HTML, lebih manusiawi.
- JavaScript murni: Menggunakan fungsi dan objek, lebih verbose.
- Mesin React: Mengolah hasil terjemahan JSX menjadi virtual DOM.
- Build step: JSX di-transpile jadi JavaScript sebelum dijalankan.
| JSX | JavaScript Biasa |
|---|---|
| Mudah dibaca, mirip HTML | Lebih teknis, pakai fungsi |
| Butuh proses build | Bisa jalan langsung di browser |
| Lebih enak untuk UI kompleks | Cocok untuk kontrol sangat detail |
const elementJSX = ;
const elementJS = React.createElement(
"button",
{ className: "btn" },
"Klik Aku"
);
Cara React bekerja adalah dengan mengambil hasil terjemahan JSX (yang sudah berubah menjadi pemanggilan React.createElement()) dan mengubahnya menjadi representasi virtual DOM. Virtual DOM ini semacam “gambaran kasar” dari tampilan yang ingin ditampilkan. Setiap kali ada perubahan state atau props, React akan membandingkan virtual DOM lama dan yang baru, lalu menerapkan perubahan paling minimal ke DOM asli di browser. Inilah alasan kenapa kita boleh menulis JSX sesuka hati seolah-olah setiap render menggambar ulang semuanya: React yang mengurus optimasinya di belakang layar.
Menyusun Struktur UI yang Bersih dengan JSX Bersarang dan Komponen yang Dapat Digunakan Ulang
Bayangin struktur UI kamu kayak rak buku yang tertata rapi. JSX bikin kamu gampang bikin “rak” yang bersarang: ada komponen besar, di dalamnya ada komponen lebih kecil, dan seterusnya. Dengan cara ini, layout jadi lebih mudah dibaca dan dirawat, apalagi kalau kamu pakai pola seperti layout utama, komponen konten, dan komponen kecil pendukung. Kuncinya, jangan takut memecah UI jadi potongan-potongan kecil yang spesifik fungsinya. Biasanya, satu komponen idealnya mengurus satu hal saja, misalnya hanya bagian header, hanya kartu artikel, atau hanya tombol aksi.
- Gunakan komponen kecil berulang untuk elemen yang sering muncul, seperti tombol, badge, atau card.
- Kelompokkan logika dan tampilan ke dalam komponen agar JSX tetap bersih dan pendek.
- Manfaatkan props untuk bikin satu komponen bisa dipakai di banyak konteks tanpa copy-paste.
- Hindari JSX terlalu dalam; jika sudah bersarang kebangetan, pecah jadi komponen terpisah.
| Komponen | Peran | Dipakai di |
|---|---|---|
Layout |
Kerangka halaman utama | Semua halaman |
Navbar |
Navigasi dan branding | Bagian atas layout |
CardPost |
Menampilkan ringkasan konten | Daftar blog, rekomendasi |
function Layout({ children }) {
return (
{children}
);
}
function CardPost({ title, excerpt }) {
return (
{title}
{excerpt}
);
}
function BlogPage() {
return (
);
}
Menghindari Anti Pattern JSX dengan Praktik Terbaik Penulisan Atribut, Event, dan Conditional Rendering
JSX sebenarnya cukup fleksibel, tapi di sinilah jebakan anti pattern sering muncul: atribut yang berantakan, event handler yang berat, dan conditional rendering yang bikin komponen susah dibaca. Yang paling aman adalah mulai dari hal kecil: konsisten menamai prop, pisahkan logic yang kompleks ke fungsi terpisah, dan jangan jadikan JSX sebagai tempat menumpuk segala macam ekspresi. Misalnya, hindari menulis handler langsung dengan logika berat di dalam JSX, karena selain bikin kode sulit di-scan, performa juga bisa kena imbasnya.
- Gunakan camelCase untuk atribut dan event handler (misalnya
onClick,className). - Jangan definisikan fungsi anonim kompleks langsung di JSX, apalagi kalau dipanggil berulang di list.
- Batasi ternary operator bertingkat, lebih baik ekstrak ke variabel atau fungsi render kecil.
- Selalu bedakan UI state dan data, jangan sembunyikan state penting di dalam conditional yang rumit.
| Pola | Kurang Baik | Lebih Baik |
|---|---|---|
| Atribut | Atribut campur string & ekspresi di satu baris panjang | Pecah jadi beberapa baris, hanya ekspresi penting di JSX |
| Event | Fungsi anonim dengan banyak logika di onClick |
Tarik logika ke fungsi terpisah yang diberi nama jelas |
| Conditional | Ternary bersarang di dalam ternary | Gunakan variabel perantara atau fungsi render kecil |
Untuk conditional rendering, kuncinya adalah “baca nyaman dulu, baru pintar belakangan”. Banyak yang terpancing menulis satu baris super padat pakai ternary atau operator logika, padahal di JSX, keterbacaan hampir selalu lebih penting. Daripada menulis kondisi berlapis-lapis langsung di dalam markup, lebih rapi kalau kamu siapkan variabel penampung dulu.
“`jsx
// Anti pattern: logic berat langsung di JSX
“`
“`jsx
// Lebih baik: pisahkan logika, JSX tetap bersih
function handleDownloadClick() {
logEvent(‘download_click’);
if (!user || !user.isLoggedIn) {
return showLoginModal();
}
startDownload(fileId);
}
“`
“`jsx
// Conditional rendering lebih terbaca
let content;
if (isLoading) {
content =
Memuat data…
;
} else if (error) {
content =
Terjadi kesalahan.
;
} else {
content = ;
}
return (
);
“`
Menerapkan JSX secara Efektif dalam Proyek Nyata beserta Pola Folder, Testing, dan Optimasi Performa
Supaya JSX benar-benar terasa manfaatnya di proyek nyata, sejak awal biasakan diri dengan pola folder yang rapi dan konsisten. Salah satu pendekatan yang cukup fleksibel adalah memisahkan berdasarkan fitur alih-alih jenis file. Misalnya, setiap fitur punya folder sendiri berisi komponen, hook, dan test. Dengan begitu, JSX untuk tampilan dan logika UI tetap terorganisir, gampang dicari, dan enak di-maintain dalam jangka panjang. Untuk komponen kecil dan reusable, kamu bisa taruh di folder shared atau common, sementara halaman utama berada di folder pages. Pendekatan ini juga membantu saat menulis test, karena file test bisa “nempel” di sebelah file JSX-nya, sehingga alur kerja terasa natural.
| Folder | Isi Utama |
src/features |
Komponen JSX per fitur |
src/components |
UI reusable (button, modal, dll.) |
src/tests |
Test terpisah bila perlu struktur khusus |
- Testing: Gunakan kombinasi
Jestdan@testing-library/reactuntuk menguji JSX dari sudut pandang user, bukan hanya dari struktur DOM. Fokus ke perilaku: apakah teks muncul, event terpanggil, atau state berubah sesuai ekspektasi. - Optimasi performa: Di level JSX, kamu bisa mengandalkan
React.memo,useCallback, danuseMemountuk menghindari re-render berlebih, terutama pada list panjang atau komponen berat. - Pemecahan komponen: Kalau sebuah file JSX sudah lewat ratusan baris dan bikin pusing saat scroll, biasanya itu sinyal kuat untuk dipecah menjadi beberapa komponen kecil. Selain lebih cepat dipahami, performa juga cenderung lebih mudah dioptimasi.
“`jsx
// Contoh struktur sederhana komponen + test
// src/features/todo/TodoList.jsx
import React from “react”;
export function TodoList({ items }) {
return (
-
{items.map((item) => (
- {item.label}
))}
);
}
// src/features/todo/TodoList.test.jsx
import { render, screen } from “@testing-library/react”;
import { TodoList } from “./TodoList”;
test(“menampilkan list todo”, () => {
render(
expect(screen.getByText(“Belajar JSX”)).toBeInTheDocument();
});
“`
In Summary
Pada akhirnya, JSX bukanlah “bahasa baru” yang misterius, melainkan cara yang lebih alami untuk menulis antarmuka di React. Dengan memahami konsep dasarnya, mengenali fungsinya dalam menggabungkan logika dan tampilan, serta mempraktikkan penerapannya dalam komponen, Anda sudah berada di jalur yang tepat untuk membangun UI yang lebih terstruktur dan mudah dirawat.
Setelah ini, cobalah eksplorasi kecil: ubah sedikit struktur JSX Anda, pecah komponen menjadi bagian-bagian yang lebih kecil, atau kombinasikan JSX dengan kondisi dan perulangan. Semakin sering Anda bereksperimen, semakin intuitif JSX akan terasa-hingga akhirnya Anda tidak lagi “sekadar menulis markup”, tetapi benar-benar merancang alur antarmuka yang hidup dan dinamis.
JSX hanyalah pintu masuk. Di baliknya, masih banyak konsep React lain yang menunggu untuk Anda kenali. Namun, begitu Anda nyaman dengan JSX, setiap baris kode UI akan terasa lebih seperti merangkai cerita, bukan sekadar menulis instruksi.

