Menampilkan List — React

Coba liat feed timeline Twitter/X. Ratusan tweet berderet dari atas ke bawah, masing-masing punya struktur sama (avatar, nama, isi, tombol like) tapi konten…

Menampilkan list di React artinya mengubah array data jadi deretan elemen, satu elemen untuk tiap isi array. Caranya pakai map, method array yang sudah kamu kenal dari JavaScript. Bayangin bikin undangan nikahan: desainnya cukup satu, daftar tamunya yang panjang, dan mesin cetak memakai desain yang sama untuk tiap nama. Di React, desainnya adalah JSX untuk satu item, daftar tamunya adalah array, dan mesin cetaknya map.

🧪 Tebakan cepat: kalau kamu menulis buah.map((item) => { <li>{item}</li> }), dengan kurung kurawal, berapa <li> yang muncul: 3 atau 0? Tebak dulu, jawabannya ada di bagian "Dari array ke <li>".

Dari array ke <li>

function App() {
  const buah = ["Apel", "Mangga", "Jeruk"];

  return (
    <ul>
      {buah.map((item) => (
        <li key={item}>{item}</li>
      ))}
    </ul>
  );
}

Apa yang terjadi tiap putaran:

Putaran item Yang dikembalikan callback
1 "Apel" <li key="Apel">Apel</li>
2 "Mangga" <li key="Mangga">Mangga</li>
3 "Jeruk" <li key="Jeruk">Jeruk</li>

map mengembalikan array berisi 3 elemen <li>. React bisa menggambar array: isinya digambar satu per satu, sesuai urutan. Hasilnya di browser:

<ul>
  <li>Apel</li>
  <li>Mangga</li>
  <li>Jeruk</li>
</ul>

Tambah satu buah ke array, dan <li> keempat muncul sendiri. JSX-nya gak perlu diubah sama sekali.

Kalau callback-nya pakai kurung kurawal, (item) => { <li>{item}</li> }, gak ada yang dikembalikan karena gak ada return. Hasil map jadi [undefined, undefined, undefined], dan React gak menggambar apa-apa untuk undefined. Jadi yang muncul 0 <li>, tanpa error. Itu jawaban tebakannya. Pakai kurung biasa, atau tulis return <li>{item}</li>; di dalam kurung kurawalnya.

key: tanda pengenal tiap item

Tiap elemen yang dibuat map butuh prop key: nilai yang membedakan item itu dari item lain di list yang sama. Waktu datanya berubah dan React menggambar ulang, React mencocokkan item lama dengan item baru lewat key. Tanpa key, React menulis peringatan di console: Each child in a list should have a unique "key" prop.

Data dari database hampir selalu punya id, dan itulah key terbaik. Daftar teks yang semuanya beda, seperti nama buah tadi, boleh pakai teksnya sendiri.

Bagaimana dengan index, posisi item di array ((item, index) => <li key={index}>)? index itu nomor urut, bukan identitas. Kalau ada item yang disisipkan di atas, dihapus, atau diurutkan ulang, nomor urut semua item bergeser, dan React bisa memasangkan item yang salah. Jadi index sebagai key gak ideal, cuma aman untuk list yang urutannya gak pernah berubah. Kenapa bisa salah pasang, dibahas tuntas di pelajaran berikutnya, Keys & Reconciliation.

List dari array object

Data sungguhan biasanya berupa object. Ambil isinya dengan titik, dan pakai id sebagai key:

function App() {
  const buah = [
    { id: 1, nama: "Apel", harga: 12000 },
    { id: 2, nama: "Mangga", harga: 15000 },
    { id: 3, nama: "Jeruk", harga: 8000 },
  ];

  return (
    <ul>
      {buah.map((b) => (
        <li key={b.id}>
          {b.nama}: Rp{b.harga.toLocaleString("id-ID")}
        </li>
      ))}
    </ul>
  );
}

Hasilnya tiga baris: Apel: Rp12.000, Mangga: Rp15.000, Jeruk: Rp8.000.

Mau cuma sebagian? filter dulu, baru map:

{buah
  .filter((b) => b.harga < 10000)
  .map((b) => <li key={b.id}>{b.nama}</li>)}

Cuma Jeruk yang harganya di bawah Rp10.000, jadi cuma satu <li> yang dibuat.

⚠️ Jebakan yang sering ketemu

TL;DR: List di React dibuat dengan array.map(): callback-nya mengembalikan satu elemen untuk tiap isi array, dan React menggambar array elemen itu sesuai urutan. Tiap elemen butuh key yang unik di list itu dan tetap untuk item yang sama, idealnya id dari data, ditaruh di elemen yang dikembalikan map (bukan di <ul>). index sebagai key gak ideal kalau urutan list bisa berubah. Callback dengan { } butuh return, kalau gak list-nya kosong. forEach gak menggambar apa-apa. Butuh sebagian saja? filter dulu, baru map.

Yang akan kamu pelajari