React Native-də useMemo hook-u komponentin renderləri arasında hesablama nəticələrini memoizasiya edir, bahalı əməliyyatların təkrar yerinə yetirilməsinin qarşısını alır. useCallback-dən fərqli olaraq, useMemo funksiyanı yox, qaytarılan dəyəri saxlayır və onu yalnız göstərilən asılılıqlar dəyişdikdə yenidən hesablayır. React Docs, 2024-ə görə, memoizasiya xüsusilə böyük ölçülü massivlər və mürəkkəb məlumat transformasiyaları üçün effektivdir. React Native-də hər əlavə yenidən render JavaScript və nativ thread-lar arasında körpü əlaqəsinə əlavə yük yaradır, buna görə də useMemo-nun düzgün istifadəsi animasiyaların hamarlığına və interfeysin cavab sürətinə birbaşa təsir edir.
Əsas məqamlar
useMemo — React-in standart kitabxanasından olan hook, React Native-də əlavə paketlər olmadan mövcuddur. Ötürülən funksiyanın qaytardığı dəyəri memoizasiya edir və massivdə göstərilən asılılıqlar dəyişməyənə qədər bu dəyəri sonrakı renderlərdə təkrar istifadə edir.
Hook-un adı ingilis memoization sözündən gəlir — bahalı funksiyanın nəticəsinin keşdə saxlanıldığı optimallaşdırma texnikası. Eyni arqumentlərlə təkrar çağırışda yenidən hesablama əvəzinə saxlanılmış dəyər qaytarılır.
React Native kontekstində memoizasiya arxitektura xüsusiyyətlərinə görə xüsusilə vacibdir. Komponentin hər yenidən renderi məlumatları JavaScript — Nativ körpüsü vasitəsilə göndərir, bu da vaxt aparır. Komponent bahalı hesablamalar (siyahının filtrasiyası, sıralanması, formatlaşdırılması) ehtiva edərsə, hər yenidən render onları təkrarlayacaq, JS thread-nı bloklayacaq və frame düşmələrinə səbəb olacaq.
React Native Performance Docs, 2024-ə görə, dar boğaz ən çox nativ komponentlərin render edilməsi deyil, renderlər arasında JavaScript məntiqinin icrasıdır. useMemo məhz bu problemi həll edir.
useMemo funksiya və asılılıq massivi qəbul edir, memoizasiya olunmuş dəyəri qaytarır. React əvvəlki dəyəri və asılılıq massivini saxlayır. Hər renderdə React cari asılılıqları əvvəlkilərlə Object.is vasitəsilə müqayisə edir. Ən azı bir asılılıq dəyişərsə, funksiya yenidən icra olunur və nəticə saxlanılır.
useMemo-nun imzası veb və React Native-də tamamilə eynidir. Birinci arqument — parametrsiz funksiya, memoizasiya olunan dəyəri qaytarır. İkinci — dəyişdikdə dəyərin yenidən hesablanacağı asılılıq massivi.
import React, { useMemo } from 'react';
const sortedList = useMemo(() => {
return items.sort((a, b) => a.name.localeCompare(b.name));
}, [items]);
Bu nümunədə sortedList yalnız items massivinin referansı dəyişdikdə yenidən hesablanır. Massiv məzmunca dəyişibsə, lakin referans eyni qalıbsa (mutasiya), useMemo dəyişikliyi görməyəcək — bu mühüm məhdudiyyətdir.
React asılılıqları müqayisə etmək üçün Object.is alqoritmindən istifadə edir, bu da ciddi bərabərlik === kimi işləyir, lakin NaN-ı düzgün idarə edir (+0 və -0 fərqli sayılır). Bu o deməkdir ki, primitiv tiplər (sətirlər, ədədlər, booleanlar) üçün müqayisə dəyər üzrə, obyektlər və massivlər üçün isə referans üzrə işləyir.
// Object.is({'a': 1}, {'a': 1}) -> false (fərqli referanslar)
// Object.is(42, 42) -> true (primitiv dəyər üzrə)
// Object.is(NaN, NaN) -> true (NaN-ın düzgün işlənməsi)
Bu mexanizmi başa düşmək kritikdir: hər renderdə asılılıqlara yeni obyekt ötürülərsə, memoizasiya faydasız olacaq, çünki asılılıqlar hər dəfə dəyişmiş sayılacaq.
useMemo üç ssenaridə əsaslandırılır: bahalı hesablamalar, uşaq komponentlərə stabil propsların ötürülməsi və obyektlərin referans eyniliyinin qorunması. React Native-də hər üç ssenari mobil tətbiqlərin arxitektura xüsusiyyətlərinə görə mütəmadi olaraq baş verir.
Komponent böyük məlumat massivlərinin emalını (filtrasiya, sıralama, qruplaşdırma) və ya resurs tutumlu riyazi əməliyyatları yerinə yetirirsə, useMemo hər yenidən renderdə bu hesablamaların təkrarlanmasının qarşısını alır. Mobil tətbiqlərdə tipik nümunə — API-dən gələn məlumatların siyahıda göstərilməzdən əvvəl formatlaşdırılmasıdır.
Uşaq komponent React.memo-ya büküldükdə, yalnız propslar dəyişdikdə yenidən render olunur. Əgər props obyekti valideyn daxilində useMemo olmadan yaradılırsa, valideynin hər renderində yeni referans yaranacaq və uşaq komponent yenidən render olunacaq, React.memo-nun faydasını sıfıra endirəcək.
React Native-də stillər çox vaxt propslardan asılıdır — məsələn, elementin eni ekran ölçüsünə əsasən hesablanır. useMemo bu cür dinamik stilləri yalnız giriş parametrləri dəyişdikdə hesablamağa imkan verir.
useMemo universal optimallaşdırma vasitəsi deyil. Bir sıra ssenarilərdə qazanc vermir və hətta asılılıqların saxlanması və müqayisəsi üçün əlavə xərclər səbəbindən performansı pisləşdirə bilər. React Native-də hər bayt yaddaşın vacib olduğu yerdə, useMemo-nun təsirini ölçmədən kor-koranə tətbiqi anti-nümunədir.
Hook üç əsas halda fayda gətirmir. Birincisi, hesablama trivialdırsa (sadə toplama, sətir birləşdirmə), useMemo xərcləri hesablamanın özünün dəyərini üstələyir. İkincisi, asılılıqlar hər renderdə dəyişirsə — funksiya yenə də icra olunacaq, memoizasiya isə yalnız əlavə iş gətirəcək. Üçüncüsü, komponent nadir hallarda render olunursa, keşin saxlanması xərci əsaslandırılmır.
Kent C. Dodds, 2023-ə görə, useMemo əlavə etməzdən əvvəl problemi React DevTools Profiler və ya React Native-də quraşdırılmış Performance Monitor vasitəsilə ölçmək lazımdır. Komponentin yenidən renderi 1 ms-dən az çəkirsə, memoizasiya lazım deyil.
useMemo və useCallback — React-dən tez-tez qarışdırılan iki memoizasiya hook-u. Fərq ondadır ki, onlar nəyi saxlayır: useMemo funksiyanın icra nəticəsini (istənilən dəyər), useCallback isə funksiyanın özünü qaytarır. Hər ikisi asılılıq massivi qəbul edir, lakin sintaksis fərqlənir.
| Xüsusiyyət | useMemo | useCallback |
|---|---|---|
| Qaytarır | Funksiyanın icra nəticəsi | Funksiyaya referans |
| Birinci arqument | Dəyər qaytaran funksiya | Memoizasiya ediləcək funksiya |
| Tipik tətbiq | Hesablamaların keşləşdirilməsi | Uşaq komponentlər üçün stabil callback-lər |
| Ekvivalentlik | useMemo(() => fn, deps) | useCallback(fn, deps) === useMemo(() => fn, deps) |
Praktikada useCallback — funksiyanı memoizasiya etmək lazım olduqda useMemo üzərində sintaktik şəkərdir. React Native-də hər iki hook eyni dərəcədə tez-tez istifadə olunur: useMemo — məlumatlar üçün (formatlaşdırılmış mətn, hesablanmış stillər), useCallback — hadisə handlerləri üçün (onPress, onChangeText).
React Native tətbiqlərində useMemo-nun iki real ssenarisini nəzərdən keçirək. Birincisi — axtarış sorğusuna əsasən kontakt siyahısının filtrasiyası, ikincisi — ekran ölçüsünə əsasən dinamik stillərin hesablanması.
Bu nümunədə useMemo, nə axtarış sorğusu, nə də mənbə məlumatlar dəyişməzsə, böyük kontakt siyahısının hər renderdə təkrar filtrasiyasının qarşısını alır.
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 filtrasiya hər renderdə icra olunardı, o cümlədən animasiyalar və ya komponentin digər hissələrinin vəziyyət dəyişikliyi nəticəsində yaranan renderlər. useMemo ilə filtrasiya yalnız contacts və ya searchQuery dəyişdikdə işə düşür.
React Native-də stillər çox vaxt ekran ölçülərindən və ya komponentin propslarından asılıdır. useMemo belə bir stil obyektini bir dəfə hesablamağa və asılılıqlar dəyişməyənə qədər təkrar istifadə etməyə imkan verir.
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 yanaşma cardStyle obyektinin isSelected dəyişməyənə qədər stabil (eyni referans) qalmasını təmin edir. Card React.memo-ya bükülübsə, bu nümunə uşaq elementlərin lazımsız yenidən renderlərinin qarşısını alır.
Tez-tez verilən suallar
useMemo memoizasiya olunmuş dəyəri qaytarır — birinci arqument kimi ötürülən funksiyanın icra nəticəsi. Sonrakı renderlərdə React, asılılıqlar dəyişməyibsə, saxlanılmış dəyəri qaytarır.
useMemo funksiyanın icrasının nəticəsini qaytarır (istənilən dəyər: ədəd, obyekt, JSX), useCallback isə funksiyanın özünü qaytarır. Bununla belə, useCallback(fn, deps) useMemo(() => fn, deps)-ə ekvivalentdir.
useMemo trivial hesablamalarda (toplama, birləşdirmə), nadir yenidən renderlərdə, hər renderdə dəyişən asılılıqlarda və primitiv tiplər üçün faydasızdır. useMemo əlavə etməzdən əvvəl həmişə performansı ölçün.
Bəli, lazımsız istifadə edildikdə. React əvvəlki dəyərləri yaddaşda saxlayır və hər renderdə asılılıqları müqayisə edir. Sadə hesablamalar üçün bu əməliyyatların xərci memoizasiyanın qazancını üstələyir.
Komponentlərin render vaxtını ölçmək üçün React DevTools Profiler-dən istifadə edin. React Native-də həmçinin tərtibatçı menyusu vasitəsilə Performance Monitor mövcuddur. Render 1 ms-dən az çəkirsə — useMemo lazım deyil.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun