Menulis Markup dengan JSX
JSX adalah perpanjangan sintaksis untuk menulis kode seperti HTML dalam file JavaScript. Meskipun ada beberapa cara lain, JSX lebih dipilih oleh sebagian besar developer React dan codebase karena kepadatannya.
Anda akan mempelajari
- Mengapa React mencampur markup dan logika render
- Perbedaan JSX dengan HTML
- Cara menampilkan informasi menggunakan JSX
JSX: Meletakkan markup ke JavaScript
Website selama ini terbuat dari HTML, CSS, dan JavaScript. Selama bertahun-tahun, pengembang website menaruh konten di HTML, desain di CSS, dan logika di JavaScript—tidak jarang di file yang berbeda! Konten dibangun di HTML sedangkan logika halaman disimpan secara terpisah dalam JavaScript:
Namun, seiring dengan situs yang makin iteraktif, logika semakin menentukan konten. JavaScript mengatur HTML! Inilah mengapa dalam React, logika render dan markup berada di satu tempat yang sama—komponen.
Menggabungkan logika render dan markup untuk sebuah tombol memastikan mereka tersinkronasi dengan satu sama lain pada tiap perubahan. Sebaliknya, detil yang tidak berhubungan, markup untuk tombol dan sidebar, juga tidak terhubung dengan satu sama lain, membuat perubahan masing-masing menjadi lebih aman.
Masing-masing komponen React adalah fungsi JavaScript yang bisa memiliki markup yang di-render oleh React ke peramban. Komponen React menggunakan ekstensi sitaksis yang bernama JSX untuk merepresentasikan markup tersebut. JSX terlihat sangat mirip dengan HTML, namun lebih ketat dan dapat menampilkan informasi secara dinamis. Cara terbaik untuk memahami JSX adalah dengan langsung mengubah beberapa markup HTML menjadi JSX.
Mengubah HTML menjadi JSX
Anggap anda memiliki HTML yang alid:
<h1>Daftar Tugas Putri</h1>
<img
src="https://i.imgur.com/yXOvdOSs.jpg"
alt="Putri"
class="photo"
>
<ul>
<li>Mengerjakan PR
<li>Pergi belanja
<li>Minum vitamin
</ul>
Dan anda ingin meletakkannya di komponen:
export default function TodoList() {
return (
// ???
)
}
Jika anda salin dan tempel secara langsung, maka dia tidak akan bekerja:
export default function TodoList() { return ( // This doesn't quite work! <h1>Daftar Tugas Putri</h1> <img src="https://i.imgur.com/yXOvdOSs.jpg" alt="Putri" class="photo" > <ul> <li>Mengerjakan PR <li>Pergi belanja <li>Minum vitamin </ul>
Ini dikarenakan JSX lebih ketat dan memiliki banyak peraturan dibandingkan HTML! Jika anda membaca pesan error yang tertera, pesan tersebut akan mengarahkanmu untuk memperbaiki markup, atau anda bisa mengikuti panduan berikut.
Aturan JSX
1. Hanya mengembalikan satu elemen
Untuk mengembalikan lebih dari satu elemen, bungkus mereka dengan satu tag parent.
Contohnya, anda dapat menggunakan tag <div>
:
<div>
<h1>Daftar Tugas Putri</h1>
<img
src="https://i.imgur.com/yXOvdOSs.jpg"
alt="Putri"
class="photo"
>
<ul>
...
</ul>
</div>
Jika anda tidak ingin menambahkan <div>
pada markup, anda dapat <>
dan </>
saja:
<>
<h1>Daftar Tugas Putri</h1>
<img
src="https://i.imgur.com/yXOvdOSs.jpg"
alt="Putri"
class="photo"
>
<ul>
...
</ul>
</>
Tag kosong di atas disebut Fragment. Fragments dapat menggabungkan beberapa tag tanpa memasukkan tag tersebut ke bagian dari HTML.
Pendalaman
JSX mirip dengan HTML, namun di balik layar, mereka berubah menjadi objek literal JavaScript. Anda tidak bisa mengembalikan dua objek dari sebuah fungsi tanpa membungkus mereka ke sebuah senarai. Inilah mengapa anda juga tidak bisa mengembalikan dua tag JSX tanpa membungkus mereka menjadi sebuah fragment.
2. Tutup semua tag
Semua tag JSX harus dapat ditutup: tag tunggal seperti <img>
harus ditulis <img />
, dan tag ganda seperti <li>oranges
harus ditulis <li>oranges</li>
.
Berikut adalah gambar dan daftar tugas Putri dengan tag ganda:
<>
<img
src="https://i.imgur.com/yXOvdOSs.jpg"
alt="Putri"
class="photo"
/>
<ul>
<li>Mengerjakan PR</li>
<li>Pergi Belanja</li>
<li>Minum vitamin</li>
</ul>
</>
3. Ubah semua sebagian menjadi camelCase!
JSX berubah menjadi JavaScript dan atribut yang dituis di JSX menjadi key pada objek di JavaScript. Dalam komponen, atribut akan lebih mudah dibaca sebagai variable. Namun JavaScript memiliki beberapa batasan dalam menamai variable. Contohnya, nama variable tidak boleh terdiri dari karakter minus dan tidak boleh menggunakan nama pesanan tertentu seperti class
.
Inilah mengapa di React, banyak atribut HTML dan SVG ditulis secara camelCase. Contohnya, stroke-width
dapat ditulis sebagai strokeWidth
. Dan karena class
merupakan nama pesanan, di React kita menulisnya sebagai className
, dinamakan sesuai dengan versi DOM-nya:
<img
src="https://i.imgur.com/yXOvdOSs.jpg"
alt="Putri"
className="photo"
/>
Anda dapat mencari semua atribut pada list DOM component berikut. Jika ada yang salah, jangan takut—React akan menampilkan pesan dengan koreksi ke konsol di peramban.
Tip: Gunakan JSX Converter
Mengubah atribut di markup yang sudah ada bisa menjadi membosankan! Kami sarankan untuk menggunakan converter untuk mengubah HTML dan SVG-mu menjadi JSX. Converters are very useful in practice, but it’s still worth understanding what is going on so that you can comfortably write JSX on your own.
Berikut hasil jadinya:
export default function TodoList() { return ( <> <h1>Daftar Tugas Putri</h1> <img src="https://i.imgur.com/yXOvdOSs.jpg" alt="Putri" className="photo" /> <ul> <li>Mengerjakan PR</li> <li>Pergi Belanja</li> <li>Minum vitamin</li> </ul> </> ); }
Rekap
Sekarang anda paham mengapa ada JSX dan cara menggunakannya pada komponen:
- Komponen React menggabungkan logika render dengan markup karena mereka berkaitan.
- JSX mirip dengan HTML, dengan beberapa perbedaan. Anda bisa menggunakan converter jika diperlukan.
- Pesan error umumnya mengarahkan anda ke sumber masalah pada markup.
Tantangan 1 dari 1: Mengubah beberapa HTML menjadi JSX
HTML berikut telah disalin ke sebuah komponen, tapi bukan JSX yang valid. Coba perbaiki:
export default function Bio() { return ( <div class="intro"> <h1>Selamat datang di website saya!</h1> </div> <p class="summary"> Anda dapat membaca uneg-unegku di sini. <br><br> <b>Juga ada <i>foto</b></i> ilmuwan! </p> ); }
Antara melakukannya dengan manual atau menggunakan converter, terserah Anda!