Menampilkan List Data Secara Dinamis
Dalam aplikasi React, kita sering memiliki data dalam bentuk array yang perlu ditampilkan sebagai daftar komponen.
Daripada menulis setiap komponen secara manual, React memungkinkan kita membuat dynamic list rendering menggunakan method JavaScript map().
Contohnya:
Data Array
↓
map()
↓
Component JSX
↓
List ditampilkan
Pendekatan ini membuat kode lebih singkat, fleksibel, dan mudah dikelola.
1. Masalah dengan Penulisan Manual
Misalnya kita memiliki data:
const CORE_CONCEPTS = [
{
title: "Components",
description: "The core UI building blocks.",
image: componentsImg,
},
{
title: "JSX",
description: "A syntax extension for JavaScript.",
image: jsxImg,
},
{
title: "Props",
description: "Make components reusable.",
image: propsImg,
},
];
Kita bisa menampilkan setiap data secara manual:
<ul>
<CoreConcept
title={CORE_CONCEPTS[0].title}
description={CORE_CONCEPTS[0].description}
image={CORE_CONCEPTS[0].image}
/>
<CoreConcept
title={CORE_CONCEPTS[1].title}
description={CORE_CONCEPTS[1].description}
image={CORE_CONCEPTS[1].image}
/>
<CoreConcept
title={CORE_CONCEPTS[2].title}
description={CORE_CONCEPTS[2].description}
image={CORE_CONCEPTS[2].image}
/>
</ul>
Cara tersebut memang dapat bekerja, tetapi tidak ideal.
2. Kekurangan Pendekatan Hardcoded
Penulisan komponen secara manual memiliki beberapa masalah.
Kode Menjadi Berulang
Kita harus menulis:
<CoreConcept />
berulang kali.
Jika terdapat 20 data, kita harus menulis 20 component secara manual.
Tidak Fleksibel
Jika jumlah data berubah, JSX juga harus diubah.
Misalnya data bertambah:
3 data → 4 data
kita harus menambahkan component baru secara manual.
Jika data berkurang, component yang sudah tidak memiliki data juga harus dihapus.
3. Menggunakan map()
JavaScript menyediakan method:
map()
yang dapat digunakan untuk melakukan iterasi sekaligus mentransformasi setiap elemen array menjadi nilai baru.
Misalnya:
const numbers = [1, 2, 3];
const doubled = numbers.map((number) => {
return number * 2;
});
Hasilnya:
[2, 4, 6]
Dalam React, hasil transformasi tersebut dapat berupa JSX.
4. Mengubah Data Menjadi JSX
Misalnya:
const names = ["Budi", "Andi", "Sinta"];
Kita dapat mengubah setiap nama menjadi elemen <li>:
const items = names.map((name) => (
<li>{name}</li>
));
Kemudian:
<ul>
{items}
</ul>
React akan menampilkan:
Budi
Andi
Sinta
5. Menampilkan Component dengan map()
Untuk data CORE_CONCEPTS, kita dapat menggunakan:
<ul>
{CORE_CONCEPTS.map((conceptItem) => (
<CoreConcept
title={conceptItem.title}
description={conceptItem.description}
image={conceptItem.image}
/>
))}
</ul>
Method map() akan menjalankan callback untuk setiap item dalam array.
Jika terdapat:
3 data
maka callback akan dijalankan:
3 kali
Jika terdapat:
10 data
maka callback akan dijalankan:
10 kali
6. Menggunakan Spread Operator
Jika nama property pada object sama dengan nama prop yang diterima component, kita dapat menggunakan Spread Operator.
Contohnya:
<CoreConcept
title={conceptItem.title}
description={conceptItem.description}
image={conceptItem.image}
/>
dapat disederhanakan menjadi:
<CoreConcept {...conceptItem} />
Misalnya:
conceptItem = {
title: "Components",
description: "The core UI building blocks.",
image: componentsImg,
};
maka:
<CoreConcept {...conceptItem} />
secara konsep akan meneruskan:
<CoreConcept
title="Components"
description="The core UI building blocks."
image={componentsImg}
/>
7. Mengapa Membutuhkan key?
Saat menggunakan map() untuk merender list, React membutuhkan prop khusus:
key
Contohnya:
<CoreConcept
key={conceptItem.title}
{...conceptItem}
/>
key membantu React mengidentifikasi setiap item dalam list.
8. Fungsi key di React
Bayangkan sebuah list:
Components
JSX
Props
State
Kemudian salah satu item dihapus.
Tanpa identitas yang jelas, React akan lebih sulit menentukan perubahan yang terjadi pada list.
Dengan:
key={conceptItem.title}
setiap item memiliki identitas:
Components → "Components"
JSX → "JSX"
Props → "Props"
State → "State"
React dapat menggunakan identitas tersebut untuk membantu menentukan perubahan pada list secara efisien.
9. key Harus Unik
Nilai key sebaiknya unik di antara item dalam list yang sama.
Contohnya, jika setiap data memiliki id unik:
const users = [
{
id: 1,
name: "Budi",
},
{
id: 2,
name: "Andi",
},
];
Gunakan:
{users.map((user) => (
<User
key={user.id}
name={user.name}
/>
))}
Penggunaan id unik biasanya merupakan pilihan yang baik.
10. Hindari key yang Tidak Stabil
Hindari menggunakan nilai yang dapat berubah atau tidak unik sebagai key.
Misalnya:
key={Math.random()}
Penggunaan seperti ini tidak baik karena nilainya berubah setiap render.
Jika tersedia, gunakan identifier yang stabil:
key={item.id}
11. Apakah key Bisa Menggunakan Index?
JavaScript menyediakan index pada callback map():
items.map((item, index) => ...)
Sehingga secara teknis kita dapat menulis:
items.map((item, index) => (
<Item key={index} />
))
Namun, penggunaan index sebagai key sebaiknya dihindari jika list dapat berubah urutan, ditambah, atau dihapus.
Lebih baik menggunakan identifier unik dari data:
key={item.id}
12. key Bukan Prop Biasa
key memiliki perlakuan khusus di React.
Misalnya:
<CoreConcept
key={conceptItem.id}
{...conceptItem}
/>
key digunakan oleh React untuk mengidentifikasi item dalam list.
key tidak otomatis tersedia sebagai:
function CoreConcept({ key }) {
// ...
}
Jika component membutuhkan identifier tersebut, kirimkan sebagai prop terpisah:
<CoreConcept
key={conceptItem.id}
id={conceptItem.id}
{...conceptItem}
/>
Kemudian:
function CoreConcept({ id }) {
// ...
}
13. Contoh Lengkap
Misalnya kita memiliki data:
const CORE_CONCEPTS = [
{
id: "components",
title: "Components",
description: "The core UI building blocks.",
image: componentsImg,
},
{
id: "jsx",
title: "JSX",
description: "A syntax extension for JavaScript.",
image: jsxImg,
},
{
id: "props",
title: "Props",
description: "Make components reusable.",
image: propsImg,
},
];
Kemudian kita dapat merendernya secara dinamis:
function App() {
return (
<section id="core-concepts">
<h2>Core Concepts</h2>
<ul>
{CORE_CONCEPTS.map((conceptItem) => (
<CoreConcept
key={conceptItem.id}
{...conceptItem}
/>
))}
</ul>
</section>
);
}
14. Bagaimana map() Bekerja?
Misalnya array berisi:
const CORE_CONCEPTS = [
{
id: "components",
title: "Components",
},
{
id: "jsx",
title: "JSX",
},
{
id: "props",
title: "Props",
},
];
Ketika kita menulis:
CORE_CONCEPTS.map((conceptItem) => (
<CoreConcept
key={conceptItem.id}
{...conceptItem}
/>
))
callback akan dijalankan untuk setiap item:
Item 1
↓
<CoreConcept />
Item 2
↓
<CoreConcept />
Item 3
↓
<CoreConcept />
Hasil akhirnya adalah kumpulan JSX yang kemudian dirender React.
15. Keuntungan Dynamic List Rendering
Menggunakan map() memberikan beberapa keuntungan.
Lebih Ringkas
Tidak perlu menulis component secara berulang:
<CoreConcept />
<CoreConcept />
<CoreConcept />
Cukup:
CORE_CONCEPTS.map(...)
Lebih Fleksibel
Jika jumlah data berubah, UI akan mengikuti jumlah data tersebut secara otomatis.
3 data → 3 component
5 data → 5 component
10 data → 10 component
Mudah Dipelihara
Data dapat dikelola secara terpisah dari struktur UI.
Cocok untuk Data dari API
Konsep yang sama dapat digunakan ketika data berasal dari API:
API
↓
Array Data
↓
map()
↓
React Components
↓
UI
16. Dynamic List dari Data API
Misalnya API mengembalikan:
const products = [
{
id: 1,
name: "Laptop",
},
{
id: 2,
name: "Keyboard",
},
{
id: 3,
name: "Mouse",
},
];
Kita dapat menampilkan daftar produk:
<ul>
{products.map((product) => (
<li key={product.id}>
{product.name}
</li>
))}
</ul>
React akan menghasilkan daftar berdasarkan jumlah data yang tersedia.
17. map() Tidak Mengubah Array Asli
Method map() menghasilkan array baru.
Contohnya:
const numbers = [1, 2, 3];
const doubled = numbers.map(
(number) => number * 2
);
Array asli:
numbers
tetap:
[1, 2, 3]
Sedangkan hasil map():
doubled
adalah:
[2, 4, 6]
Karakteristik ini sangat sesuai dengan prinsip immutability yang banyak digunakan dalam React.
18. Callback map()
Callback pada map() dapat menerima beberapa parameter.
Parameter pertama adalah item:
items.map((item) => ...)
Parameter kedua adalah index:
items.map((item, index) => ...)
Contohnya:
items.map((item, index) => (
<li key={item.id}>
{index + 1}. {item.name}
</li>
))
Namun, untuk key, tetap lebih baik menggunakan identifier unik dari data jika tersedia.
19. Conditional Rendering pada List
map() juga dapat digunakan bersama conditional rendering.
Contohnya:
{products.map((product) => (
product.isAvailable && (
<li key={product.id}>
{product.name}
</li>
)
))}
Hanya produk yang memiliki:
isAvailable === true
yang akan ditampilkan.
20. Poin Penting
Beberapa hal yang perlu diingat:
- Gunakan
map()untuk melakukan iterasi dan mentransformasi data array menjadi JSX. - Jumlah component yang dihasilkan mengikuti jumlah item dalam array.
- Gunakan
keyketika merender list. keyharus stabil dan unik di antara item dalam list yang sama.- Jika tersedia, gunakan
idunik sebagaikey. - Hindari menggunakan
Math.random()sebagaikey. - Hindari penggunaan index sebagai
keyjika list dapat berubah. keymerupakan prop khusus React dan tidak diteruskan sebagai prop biasa ke component.- Spread operator dapat digunakan jika nama property object sama dengan nama prop component.
map()tidak mengubah array asli.
Kesimpulan
Dynamic List Rendering merupakan pola yang sangat sering digunakan dalam aplikasi React.
Daripada menulis component secara manual:
<CoreConcept ... />
<CoreConcept ... />
<CoreConcept ... />
kita dapat menggunakan:
{CORE_CONCEPTS.map((conceptItem) => (
<CoreConcept
key={conceptItem.id}
{...conceptItem}
/>
))}
Dengan pola tersebut:
Array Data
↓
map()
↓
Component JSX
↓
key
↓
React mengidentifikasi setiap item
↓
List ditampilkan
Konsep ini menjadi dasar penting ketika bekerja dengan list data, hasil API, daftar produk, artikel, pengguna, komentar, menu, dan berbagai data lainnya dalam aplikasi React.