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.

You will learn

  • 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:

HTML markup with purple background and a div with two child tags: p and form.
HTML markup with purple background and a div with two child tags: p and form.

HTML

Three JavaScript handlers with yellow background: onSubmit, onLogin, and onClick.
Three JavaScript handlers with yellow background: onSubmit, onLogin, and onClick.

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.

React component with HTML and JavaScript from previous examples mixed. Function name is Sidebar which calls the function isLoggedIn, highlighted in yellow. Nested inside the function highlighted in purple is the p tag from before, and a Form tag referencing the component shown in the next diagram.
React component with HTML and JavaScript from previous examples mixed. Function name is Sidebar which calls the function isLoggedIn, highlighted in yellow. Nested inside the function highlighted in purple is the p tag from before, and a Form tag referencing the component shown in the next diagram.

Komponen React Sidebar.js

React component with HTML and JavaScript from previous examples mixed. Function name is Form containing two handlers onClick and onSubmit highlighted in yellow. Following the handlers is HTML highlighted in purple. The HTML contains a form element with a nested input element, each with an onClick prop.
React component with HTML and JavaScript from previous examples mixed. Function name is Form containing two handlers onClick and onSubmit highlighted in yellow. Following the handlers is HTML highlighted in purple. The HTML contains a form element with a nested input element, each with an onClick prop.

Komponen React Form.js

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.

Note

JSX dan React adalah dua hal yang berbeda. Mereka masing-masing digunakan secara bersama, namun kamu dapat digunakan sendiri secara independen. JSX merupakan ekstensi sintaks, sedangkan React adalah library JavaScript.

Mengubah HTML menjadi JSX

Anggap kamu 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 kamu ingin meletakkannya di komponen:

export default function TodoList() {
return (
// ???
)
}

Jika kamu 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 kamu membaca pesan error yang tertera, pesan tersebut akan mengarahkanmu untuk memperbaiki markup, atau kamu bisa mengikuti panduan berikut.

Note

Umumnya, pesan error pada React akan memandu kamu mencari sumber masalah yang ada di kode. Jangan lupa membaca pesan error jika kamu stuck!

Aturan JSX

1. Hanya mengembalikan satu elemen

Untuk mengembalikan lebih dari satu elemen, bungkus mereka dengan satu tag parent.

Contohnya, kamu 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 kamu tidak ingin menambahkan <div> pada markup, kamu 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.

Deep Dive

Mengapa beberapa tag JSX perlu dibungkus?

JSX mirip dengan HTML, namun di balik layar, mereka berubah menjadi objek literal JavaScript. Kamu tidak bisa mengembalikan dua objek dari sebuah fungsi tanpa membungkus mereka ke sebuah array. Inilah mengapa kamu 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"
/>

Kamu dapat [] You can mencari semua atribut pada list DOM component berikut. Jika ada yang salah, jangan takut—React akan menampilkan pesan dengan koreksi ke konsol pada peramban.

Pitfall

Untuk beberapa alasan, atribut aria-* dan data-* ditulis menggunakan tanda minus.

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>
    </>
  );
}

Recap

Sekarang kamu 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. Kamu bisa menggunakan converter jika diperlukan.
  • Pesan error umumnya mengarahkan kamu ke sumber masalah pada markup.

Challenge 1 of 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">
      Kamu dapat membaca uneg-unegku di sini.
      <br><br>
      <b>Juga ada <i>foto</b></i> ilmuwan!
    </p>
  );
}

Kamu bebas untuk mengubah secara manual atau menggunakan converter!