useMemo: nedir, hesaplamaları önbellekleme ve React Native

Yazar: IT Sectr Yayınlanma: 2026-07-05 Okuma süresi: 10 dk

React Native'deki useMemo hook'u, bileşen oluşturmaları arasındaki hesaplama sonuçlarını belleğe alarak pahalı işlemlerin tekrarlanan yürütülmesini önler. Bir işlevi belleğe alan useCallback'in aksine, useMemo döndürülen değeri korur ve yalnızca belirtilen bağımlılıklar değiştiğinde yeniden hesaplar. React Docs, 2024'e göre, belleğe alma özellikle büyük diziler ve karmaşık veri dönüşümleri içeren hesaplamalar için etkilidir. React Native'de, her gereksiz yeniden oluşturma JavaScript ve yerel iş parçacıkları arasındaki köprü bağlantısında ek yük oluşturur, bu nedenle useMemo'nun doğru kullanımı animasyonların akıcılığını ve arayüz yanıt hızını doğrudan etkiler.

Önemli noktalar

  • useMemo — değerleri belleğe almak için bir React hook'u, oluşturmalar arasında bir işlevin sonucunu önbelleğe alır
  • Hook iki argüman alır: bir hesaplama işlevi ve bir bağımlılık dizisi
  • Değer yalnızca en az bir bağımlılık değiştiğinde yeniden hesaplanır
  • React Native'de useMemo, listelerin ve animasyonların performansını optimize etmek için kritiktir
  • useMemo'nun aşırı kullanımı, bağımlılıkları karşılaştırma maliyeti nedeniyle performansı kötüleştirebilir

React Native'de useMemo nedir

useMemo — ek paketler olmadan React Native'de kullanılabilen React standart kütüphanesinin bir hook'udur. Geçirilen işlev tarafından döndürülen değeri belleğe alır ve dizide belirtilen bağımlılıklar değişene kadar sonraki oluşturmalarda bu değeri yeniden kullanır.

Hook'un adı memoization'dan gelir — pahalı bir işlevin sonucunun önbellekte saklandığı bir optimizasyon tekniği. Aynı argümanlarla sonraki çağrılarda, yeniden hesaplama yerine önbelleğe alınmış değer döndürülür.

React Native bağlamında, mimari özellikler nedeniyle belleğe alma özellikle önemlidir. Her bileşen yeniden oluşturması JavaScript — Yerel köprüsü üzerinden veri gönderir ve bu zaman alır. Bir bileşen pahalı hesaplamalar (liste filtreleme, sıralama, biçimlendirme) içeriyorsa, her yeniden oluşturma bunları tekrarlayacak, JS iş parçacığını bloke edecek ve kare düşüşlerine neden olacaktır.

React Native Performance Docs, 2024'e göre, darboğaz genellikle yerel bileşenlerin oluşturulması değil, oluşturmalar arasında JavaScript mantığının yürütülmesidir. useMemo tam olarak bu sorunu çözer.

Değer belleğe alma nasıl çalışır

useMemo bir işlev ve bir bağımlılık dizisi alır, belleğe alınmış bir değer döndürür. React önceki değeri ve bağımlılık dizisini saklar. Her oluşturmada, React Object.is kullanarak mevcut bağımlılıkları öncekilerle karşılaştırır. En az bir bağımlılık değiştiyse, işlev yeniden yürütülür ve sonuç saklanır.

Sözdizimi ve argüman geçirme

useMemo'nun imzası web'de ve React Native'de tamamen aynıdır. İlk argüman, belleğe alınacak değeri döndüren parametresiz bir işlevdir. İkincisi, değiştiğinde değerin yeniden hesaplanacağı bağımlılık dizisidir.

js
import React, { useMemo } from 'react';

const sortedList = useMemo(() => {
    return items.sort((a, b) => a.name.localeCompare(b.name));
}, [items]);

Bu örnekte, sortedList yalnızca items dizisine yapılan referans değiştiğinde yeniden hesaplanır. Dizi içeriği değişti ancak referans aynı kaldıysa (mutasyon), useMemo değişiklikleri algılamaz — bu önemli bir sınırlamadır.

Object.is ile bağımlılık karşılaştırması

React, bağımlılıkları karşılaştırmak için Object.is algoritmasını kullanır; bu, katı eşitlik === ile benzer şekilde çalışır ancak NaN'i doğru şekilde işler (+0 ve -0 farklı kabul edilir). Bu, ilkel türler (dizgiler, sayılar, boole'lar) için karşılaştırmanın değere göre, nesneler ve diziler için ise referansa göre çalıştığı anlamına gelir.

js
// Object.is({'a': 1}, {'a': 1}) -> false (different refs)
// Object.is(42, 42) -> true (primitive by value)
// Object.is(NaN, NaN) -> true (correct handling of NaN)

Bu mekanizmayı anlamak çok önemlidir: her oluşturmada bağımlılıklara yeni bir nesne geçirirseniz, bağımlılıklar her seferinde değişmiş olarak kabul edileceğinden belleğe alma işe yaramaz.

useMemo ne zaman kullanılır

useMemo üç senaryoda haklı çıkar: pahalı hesaplamalar, alt bileşenlere kararlı props geçirme ve nesnelerin referans kimliğini koruma. React Native'de, mobil uygulamaların mimarisi nedeniyle her üç senaryo da düzenli olarak gerçekleşir.

Pahalı hesaplamalar

Bir bileşen büyük veri dizilerini (filtreleme, sıralama, gruplama) veya kaynak yoğun matematiksel işlemleri işliyorsa, useMemo bu hesaplamaların her yeniden oluşturmada tekrarlanmasını önler. Mobil uygulamalarda, tipik bir örnek, bir listede görüntülemeden önce API'den gelen verileri biçimlendirmektir.

Alt bileşenler için kararlı Props

Bir alt bileşen React.memo ile sarıldığında, yalnızca props'ları değiştiğinde yeniden oluşturulur. Üst öğe içinde useMemo olmadan bir prop nesnesi oluşturulursa, üst öğenin her oluşturmasında yeni bir referans oluşturulacak ve alt bileşen gereksiz yere yeniden oluşturularak React.memo'nun avantajı geçersiz kılınacaktır.

Stil hesaplamalarının belleğe alınması

React Native'de stiller genellikle props'a bağlıdır — örneğin, bir öğenin genişliği ekran boyutuna göre hesaplanır. useMemo, bu tür dinamik stilleri yalnızca giriş parametreleri değiştiğinde hesaplamaya olanak tanır.

useMemo ne zaman işe yaramaz

useMemo evrensel bir optimizasyon aracı değildir. Birkaç senaryoda, hiçbir fayda sağlamaz ve bağımlılıkları saklama ve karşılaştırma yükü nedeniyle performansı daha da kötüleştirebilir. Her bayt belleğin önemli olduğu React Native'de, etkisini ölçmeden useMemo'yu körü körüne uygulamak bir anti-kalıptır.

Hook üç ana durumda fayda sağlamaz. Birincisi, hesaplama önemsiz ise (basit toplama, dizi birleştirme), useMemo'nun maliyeti hesaplamanın kendi maliyetini aşar. İkincisi, bağımlılıklar her oluşturmada değişiyorsa — işlev yine de yürütülecek ve belleğe alma yalnızca ekstra iş ekleyecektir. Üçüncüsü, bileşen nadiren oluşturuluyorsa, önbellek depolama yükü haklı değildir.

Kent C. Dodds, 2023'e göre, useMemo eklemeden önce, sorunu React DevTools Profiler veya React Native'de yerleşik Performans Monitörü kullanarak ölçmelisiniz. Bir bileşen yeniden oluşturması 1 ms'den az sürüyorsa, belleğe alma gerekli değildir.

  • Önemsiz hesaplamalar — toplama, birleştirme, basit üçlü işlemler
  • Seyrek yeniden oluşturmalar — bir kez oluşturulan statik ekranlar
  • Değişen bağımlılıklar — bağımlılıklar her oluşturmada yeniyse, belleğe alma işe yaramaz
  • İlkel değerler — sayılar ve dizgiler belleğe alma gerektirmez, zaten ucuzdurlar

useMemo ve useCallback: karşılaştırma

useMemo ve useCallback — sıklıkla karıştırılan iki React belleğe alma hook'udur. Fark, korudukları şeyde yatar: useMemo bir işlevin yürütülmesinin sonucunu (herhangi bir değer) döndürürken, useCallback işlevin kendisini döndürür. Her ikisi de bir bağımlılık dizisi alır, ancak sözdizimi farklıdır.

ÖzellikuseMemouseCallback
Döndürürİşlev yürütmesinin sonucuİşleve referans
İlk argümanDeğer döndüren işlevBelleğe alınacak işlev
Tipik kullanımHesaplamaları önbelleklemeAlt bileşenler için kararlı geri çağrımlar
EşdeğerlikuseMemo(() => fn, deps)useCallback(fn, deps) === useMemo(() => fn, deps)

Pratikte useCallback, bir işlevi belleğe almanız gereken durumlar için useMemo üzerinde sözdizimsel şekerdir. React Native'de her iki hook da eşit sıklıkta kullanılır: useMemo — veriler için (biçimlendirilmiş metin, hesaplanmış stiller), useCallback — olay işleyicileri için (onPress, onChangeText).

useMemo ile pratik örnekler

React Native uygulamalarında useMemo kullanımının iki gerçek senaryosuna bakalım. Birincisi, arama sorgusuna göre bir kişi listesini filtrelemek, ikincisi ekran boyutuna göre dinamik stiller hesaplamaktır.

Örnek 1: liste arama ve filtreleme

Bu örnekte useMemo, ne arama sorgusu ne de kaynak veri değişmemişse, büyük bir kişi listesinin her oluşturmada tekrarlanan şekilde filtrelenmesini önler.

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

useMemo olmadan, filtreleme her oluşturmada yürütülürdü; buna animasyonlar veya bileşenin diğer bölümlerindeki durum değişikliklerinin neden olduğu oluşturmalar da dahildir. useMemo ile filtreleme yalnızca contacts veya searchQuery değiştiğinde çalışır.

Örnek 2: dinamik stil hesaplama

React Native'de stiller genellikle ekran boyutlarına veya bileşen props'larına bağlıdır. useMemo, bu tür bir stil nesnesini bir kez hesaplamaya ve bağımlılıklar değişene kadar yeniden kullanmaya olanak tanır.

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

Bu yaklaşım, cardStyle nesnesinin isSelected değişene kadar kararlı (aynı referans) kalmasını sağlar. Card React.memo ile sarılmışsa, bu model alt öğelerin gereksiz yeniden oluşturulmasını önler.

Sık sorulan sorular

useMemo ne döndürür?

useMemo, belleğe alınmış bir değer döndürür — ilk argüman olarak geçirilen işlevin yürütülmesinin sonucu. Sonraki oluşturmalarda, bağımlılıklar değişmemişse React önbelleğe alınmış değeri döndürür.

useMemo, useCallback'den nasıl farklıdır?

useMemo işlev yürütmesinin sonucunu (herhangi bir değer: sayı, nesne, JSX) döndürürken, useCallback işlevin kendisini döndürür. useCallback(fn, deps)'in useMemo(() => fn, deps)'e eşdeğer olduğunu unutmayın.

useMemo ne zaman gerekli değildir?

useMemo önemsiz hesaplamalar (toplama, birleştirme), seyrek yeniden oluşturmalar, her oluşturmada değişen bağımlılıklar ve ilkel türler için işe yaramaz. useMemo eklemeden önce her zaman performansı ölçün.

useMemo performansı kötüleştirebilir mi?

Evet, gereksiz yere kullanılırsa. React önceki değerleri bellekte saklar ve her oluşturmada bağımlılıkları karşılaştırır. Basit hesaplamalar için bu işlemlerin yükü, belleğe almanın faydasını aşar.

useMemo davranışı nasıl hata ayıklanır?

Bileşen oluşturma sürelerini ölçmek için React DevTools Profiler kullanın. React Native'de, geliştirici menüsü aracılığıyla Performans Monitörü de mevcuttur. Bir yeniden oluşturma 1 ms'den az sürüyorsa — useMemo gerekli değildir.

Özet

  • useMemo — değerleri belleğe almak için bir React hook'u, oluşturmalar arasında bir işlevin sonucunu önbelleğe alır
  • Hook bir hesaplama işlevi ve bağımlılık dizisi alır, yalnızca bunlar değiştiğinde değeri yeniden hesaplar
  • React Native'de useMemo özellikle listeleri, animasyonları ve karmaşık hesaplamaları optimize etmek için önemlidir
  • Ana senaryolar: pahalı hesaplamalar, React.memo için kararlı props, dinamik stiller
  • useMemo, useCallback'den farklıdır: ilki bir değer döndürür, ikincisi — bir işlev
  • useMemo'nun aşırı kullanımı, bağımlılıkları saklama ve karşılaştırma yükü nedeniyle performansı düşürür
  • useMemo eklemeden önce, React DevTools Profiler veya React Native'deki Performans Monitörü kullanarak sorunu her zaman ölçün

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun