Hook useMemo di React Native memoisasi hasil perhitungan antar render komponen, mencegah eksekusi ulang operasi yang mahal. Berbeda dengan useCallback yang memoisasi fungsi, useMemo menyimpan nilai yang dikembalikan dan menghitung ulang hanya ketika dependensi yang ditentukan berubah. Menurut React Docs, 2024, memoisasi sangat efektif untuk perhitungan dengan array berukuran besar dan transformasi data yang kompleks. Di React Native, setiap render ulang tambahan menciptakan beban tambahan pada koneksi jembatan antara thread JavaScript dan native, sehingga penggunaan useMemo yang benar secara langsung memengaruhi kelancaran animasi dan kecepatan respons antarmuka.
Poin-poin utama
useMemo — adalah hook dari pustaka standar React, tersedia di React Native tanpa paket tambahan. Ia memoisasi nilai yang dikembalikan oleh fungsi yang diberikan dan menggunakan kembali nilai tersebut pada render berikutnya sampai dependensi yang ditentukan dalam array berubah.
Nama hook berasal dari bahasa Inggris memoization — teknik optimasi di mana hasil fungsi yang mahal disimpan dalam cache. Pada panggilan berulang dengan argumen yang sama, nilai yang disimpan dikembalikan daripada menghitung ulang.
Dalam konteks React Native, memoisasi sangat penting karena arsitekturnya. Setiap render ulang komponen mengirim data melalui jembatan JavaScript — Native, yang memakan waktu. Jika komponen berisi perhitungan mahal (memfilter daftar, mengurutkan, memformat), setiap render ulang akan mengulanginya, memblokir thread JS dan menyebabkan penurunan frame.
Menurut React Native Performance Docs, 2024, hambatan paling sering bukanlah rendering komponen native, melainkan eksekusi logika JavaScript di antara render. useMemo memecahkan masalah ini.
useMemo menerima fungsi dan array dependensi, mengembalikan nilai yang telah dimemoisasi. React menyimpan nilai sebelumnya dan array dependensi. Pada setiap render, React membandingkan dependensi saat ini dengan yang sebelumnya menggunakan Object.is. Jika setidaknya satu dependensi berubah, fungsi dijalankan kembali dan hasilnya disimpan.
Signature useMemo sepenuhnya identik di web dan di React Native. Argumen pertama — fungsi tanpa parameter, mengembalikan nilai yang akan dimemoisasi. Kedua — array dependensi, yang perubahannya akan memicu perhitungan ulang nilai.
import React, { useMemo } from 'react';
const sortedList = useMemo(() => {
return items.sort((a, b) => a.name.localeCompare(b.name));
}, [items]);
Dalam contoh ini, sortedList dihitung ulang hanya ketika referensi array items berubah. Jika array berubah isinya tetapi referensinya tetap sama (mutasi), useMemo tidak akan melihat perubahan — ini adalah batasan penting.
React menggunakan algoritma Object.is untuk membandingkan dependensi, yang bekerja mirip dengan kesetaraan ketat ===, tetapi menangani NaN dengan benar (+0 dan -0 dianggap berbeda). Ini berarti untuk tipe primitif (string, angka, boolean) perbandingan bekerja berdasarkan nilai, dan untuk objek serta array — berdasarkan referensi.
// Object.is({'a': 1}, {'a': 1}) -> false (referensi berbeda)
// Object.is(42, 42) -> true (primitif berdasarkan nilai)
// Object.is(NaN, NaN) -> true (penanganan NaN yang benar)
Memahami mekanisme ini sangat penting: jika Anda memberikan objek baru dalam dependensi setiap render, memoisasi akan sia-sia karena dependensi akan dianggap berubah setiap kali.
useMemo dibenarkan dalam tiga skenario: perhitungan mahal, memberikan props yang stabil ke komponen anak, dan mempertahankan identitas referensial objek. Di React Native, ketiga skenario ini sering terjadi karena arsitektur aplikasi seluler.
Jika komponen melakukan pemrosesan array data besar (memfilter, mengurutkan, mengelompokkan) atau operasi matematika yang memakan sumber daya, useMemo mencegah pengulangan perhitungan ini pada setiap render ulang. Dalam aplikasi seluler, contoh tipikal adalah memformat data dari API sebelum ditampilkan dalam daftar.
Ketika komponen anak dibungkus dalam React.memo, ia hanya render ulang ketika props berubah. Jika objek props dibuat di dalam induk tanpa useMemo, setiap render induk akan membuat referensi baru, dan komponen anak akan render ulang, meniadakan manfaat React.memo.
Di React Native, gaya sering bergantung pada props — misalnya, lebar elemen dihitung berdasarkan ukuran layar. useMemo memungkinkan menghitung gaya dinamis ini hanya ketika parameter input berubah.
useMemo bukanlah alat optimasi universal. Dalam beberapa skenario, ia tidak memberikan keuntungan dan bahkan dapat memperburuk kinerja karena overhead penyimpanan dan perbandingan dependensi. Di React Native, di mana setiap byte memori penting, penggunaan useMemo secara membabi buta tanpa mengukur efeknya adalah anti-pattern.
Hook tidak memberikan manfaat dalam tiga kasus utama. Pertama, jika perhitungan trivial (penjumlahan sederhana, konkatenasi string), biaya useMemo melebihi nilai perhitungan itu sendiri. Kedua, jika dependensi berubah setiap render — fungsi akan tetap dijalankan, dan memoisasi hanya menambah pekerjaan ekstra. Ketiga, jika komponen jarang render, overhead penyimpanan cache tidak dapat dibenarkan.
Menurut Kent C. Dodds, 2023, sebelum menambahkan useMemo, Anda perlu mengukur masalah menggunakan React DevTools Profiler atau Performance Monitor bawaan di React Native. Jika render ulang komponen memakan waktu kurang dari 1 ms, memoisasi tidak diperlukan.
useMemo dan useCallback — dua hook memoisasi dari React yang sering tertukar. Perbedaannya terletak pada apa yang mereka simpan: useMemo mengembalikan hasil eksekusi fungsi (nilai apa pun), sedangkan useCallback mengembalikan fungsi itu sendiri. Keduanya menerima array dependensi, tetapi sintaksnya berbeda.
| Karakteristik | useMemo | useCallback |
|---|---|---|
| Mengembalikan | Hasil eksekusi fungsi | Referensi ke fungsi |
| Argumen pertama | Fungsi yang mengembalikan nilai | Fungsi yang akan dimemoisasi |
| Penggunaan tipikal | Caching perhitungan | Callback stabil untuk komponen anak |
| Kesetaraan | useMemo(() => fn, deps) | useCallback(fn, deps) === useMemo(() => fn, deps) |
Dalam praktiknya, useCallback adalah gula sintaksis di atas useMemo untuk kasus ketika perlu mememoisasi fungsi. Di React Native, kedua hook digunakan sama sering: useMemo — untuk data (teks terformat, gaya terhitung), useCallback — untuk handler peristiwa (onPress, onChangeText).
Mari kita lihat dua skenario nyata penggunaan useMemo di aplikasi React Native. Pertama — memfilter daftar kontak berdasarkan kueri pencarian, kedua — menghitung gaya dinamis berdasarkan ukuran layar.
Dalam contoh ini, useMemo mencegah pemfilteran ulang daftar kontak besar pada setiap render, jika baik kueri pencarian maupun data sumber tidak berubah.
const ContactList = ({ contacts, searchQuery }) => {
const filteredContacts = useMemo(() => {
if (!searchQuery.trim()) return contacts;
const query = searchQuery.toLowerCase();
return contacts.filter((c) =>
c.name.toLowerCase().includes(query) ||
c.phone.includes(query)
);
}, [contacts, searchQuery]);
return (
<FlatList
data={filteredContacts}
renderItem={renderContact}
keyExtractor={(item) => item.id}
/>
);
};
Tanpa useMemo, pemfilteran akan dijalankan pada setiap render, termasuk yang disebabkan oleh animasi atau perubahan status bagian lain dari komponen. Dengan useMemo, pemfilteran hanya dipicu ketika contacts atau searchQuery berubah.
Di React Native, gaya sering bergantung pada ukuran layar atau props komponen. useMemo memungkinkan menghitung objek gaya seperti itu sekali dan menggunakannya kembali sampai dependensi berubah.
const Card = ({ title, isSelected }) => {
const cardStyle = useMemo(() => ({
backgroundColor: isSelected ? '#e3f2fd' : '#ffffff',
borderWidth: isSelected ? 2 : 1,
padding: 16,
}), [isSelected]);
return (
<View style={cardStyle}>
<Text>{title}</Text>
</View>
);
};
Pendekatan ini memastikan bahwa objek cardStyle tetap stabil (referensi yang sama) sampai isSelected berubah. Jika Card dibungkus dalam React.memo, pola ini mencegah render ulang yang tidak perlu pada elemen anak.
Pertanyaan yang sering diajukan
useMemo mengembalikan nilai yang dimemoisasi — hasil eksekusi fungsi yang diberikan sebagai argumen pertama. Pada render berikutnya, React mengembalikan nilai yang disimpan jika dependensi tidak berubah.
useMemo mengembalikan hasil eksekusi fungsi (nilai apa pun: angka, objek, JSX), sedangkan useCallback mengembalikan fungsi itu sendiri. Selain itu, useCallback(fn, deps) setara dengan useMemo(() => fn, deps).
useMemo tidak berguna untuk perhitungan trivial (penjumlahan, konkatenasi), render ulang jarang, dependensi yang berubah setiap render, dan untuk tipe primitif. Selalu ukur kinerja sebelum menambahkan useMemo.
Ya, jika digunakan tanpa perlu. React menyimpan nilai sebelumnya di memori dan melakukan perbandingan dependensi pada setiap render. Untuk perhitungan sederhana, overhead operasi ini melebihi manfaat memoisasi.
Gunakan React DevTools Profiler untuk mengukur waktu render komponen. Di React Native juga tersedia Performance Monitor melalui menu pengembang. Jika render ulang memakan waktu kurang dari 1 ms — useMemo tidak diperlukan.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga