ReactJS #27: Mengoptimalkan Kinerja
React.memo dan useCallback – Biar Aplikasi Ngebut
Halo, pembalap kode! 🏎️
Pernahkah kamu merasa aplikasi React-mu mulai lemot saat digunakan? Bisa jadi karena banyak render ulang yang tidak perlu. Bayangkan seorang guru yang terus mengulang pelajaran yang sama padahal muridnya sudah hafal. Buang waktu, kan? Nah, di React kita punya dua alat ajaib untuk mencegah render ulang yang tidak berguna: React.memo dan useCallback.
🔍 Masalah: Render Ulang Tidak Perlu
Di React, ketika state induk berubah, semua komponen anak ikut render ulang. Padahal mungkin props anak tidak berubah. Ini boros kinerja, terutama jika komponen anak berat (misal menampilkan daftar panjang).
Contoh kasus:
Setiap kali tombol diklik, count berubah, Child ikut render ulang meskipun props name tidak berubah. Lihat di console, pesan "Child render!" muncul terus.
🛡️ React.memo: Menghindari Render Ulang yang Tidak Perlu
React.memo adalah Higher Order Component yang membungkus komponen fungsi. Ia akan "mengingat" hasil render berdasarkan props. Jika props sama dengan sebelumnya, ia akan memakai hasil lama (skip render).
Perbaiki kode di atas dengan React.memo:
Sekarang, saat tombol diklik, console tidak akan mencetak "Child render!" lagi karena props name tidak berubah. Hemat!
🎣 useCallback: Menstabilkan Fungsi
Di React, fungsi dibuat ulang setiap render. Jika fungsi dikirim sebagai props ke komponen anak yang dibungkus React.memo, anak akan tetap render ulang karena fungsi dianggap berbeda (walaupun isinya sama).
Contoh bermasalah:
Meskipun Child dibungkus memo, ia tetap render ulang karena props onClick dianggap baru setiap render. Solusinya: gunakan useCallback untuk "menstabilkan" fungsi.
Sekarang handleClick hanya dibuat sekali, sehingga props onClick stabil, dan Child tidak render ulang.
🧩 Contoh Lengkap: Daftar Tugas dengan Optimasi
Mari lihat contoh daftar tugas yang dioptimasi:
Sekarang, setiap kali tombol counter diklik, TodoList tidak render ulang karena props-nya stabil (todos tidak berubah, fungsi dari useCallback stabil).
🧪 Kapan Harus Menggunakan?
- Gunakan React.memo jika komponen sering render dengan props yang sama.
- Gunakan useCallback untuk fungsi yang dikirim ke komponen anak yang sudah dibungkus memo.
- Gunakan useMemo (tidak dibahas di sini) untuk nilai hasil kalkulasi berat.
Jangan gunakan secara berlebihan! Optimasi prematur bisa bikin kode rumit. Ukur dulu apakah ada masalah performa.
🧪 Latihan: Optimasi Aplikasi Cuaca
Buka aplikasi cuaca dari artikel #14. Identifikasi komponen mana yang mungkin sering render ulang tidak perlu. Coba terapkan React.memo pada komponen tampilan cuaca (WeatherCard) dan gunakan useCallback pada fungsi pencarian yang dikirim ke komponen anak (jika ada).
Petunjuk: Biasanya komponen yang menampilkan data statis (seperti card) bisa dibungkus memo.
🚀 Kesimpulan
- React.memo mencegah render ulang komponen jika props tidak berubah.
- useCallback mengembalikan fungsi yang sama di setiap render (jika dependensi tidak berubah).
- Keduanya membantu mengoptimalkan kinerja dengan mengurangi render ulang tidak perlu.
- Gunakan dengan bijak, jangan optimasi sebelum ada masalah.
Di artikel selanjutnya kita akan belajar tentang Testing Sederhana dengan React Testing Library. Sampai jumpa!