useEffect: bu nədir, yan təsir hooku və React-də həyat dövrü

Müəllif: IT Sectr Dərc olunub: 2026-07-04 Oxuma vaxtı: 9 dəq

useEffect — bu, funksional komponentlərdə yan təsirləri yerinə yetirməyə imkan verən React hookudur, sinif komponentlərinin həyat dövrü metodlarını əvəz edir: componentDidMount, componentDidUpdate və componentWillUnmount. React Documentation (2025)-yə görə, useEffect React DOM-da dəyişiklikləri təsdiqlədikdən sonra işləyir ki, bu da aktual DOM ağacına çıxışı təmin edir. Hook effekt funksiyası və icra tezliyini idarə eden isteğə bağlı asılılıq massivi qəbul edir.

Başlıca

  • useEffect — komponentin renderindən sonra yan təsirləri yerinə yetirmək üçün hook.
  • Asılılıq massivi — effektin nə vaxt yenidən işə düşəcəyini idarə edir; boş massiv = bir dəfə.
  • Təmizləmə — cleanup funksiyası demontaj zamanı və yenidən işə salınmadan əvvəl çağrılır.
  • Həyat dövrü — componentDidMount, componentDidUpdate və componentWillUnmount-u əvəz edir.
  • İcra sırası — effektlər DOM-da dəyişikliklər təsdiqləndikdən sonra işə düşür.

React-də useEffect nədir

useEffect — bu, React 16.8-də funksional komponentlərdə yan təsirləri yerinə yetirmək üçün əlavə edilmiş hookdur. Yan təsirlər dedikdə, UI renderləmə ilə birbaşbağlı olmayan əməliyyatlar başa düşülür: API-yə HTTP sorğuları, hadisə abunəlikləri, taymerlərlə iş, DOM manipulyasiyaları, loglama və üçüncü tərəf kitabxanalarla inteqrasiya.

Hooklar meydana çıxmamışdAN əvvəl bütün bu əməliyyatlar sinif komponentlərinin həyat dövrü metodlarında yerləşdirilməli idi: inisializasiya üçün componentDidMount, props dəyişikliklərinə reaksiya üçün componentDidUpdate, təmizləmə üçün componentWillUnmount. useEffect hər üç ssenarini vahid API-də birləşdirdi, burada asılılıq massivi effektin nə vaxt işə düşəcəyini müəyyən edir. Bu, mantiqanı sadələşdirdi və kodun təkrarlanmasını azaltdı, xüsusən də abunəlik ssenarilərində.

React DevTools Usage Survey (2024)-yə görə, useEffect useState-dən sonra ikinci ən populyar hookdur və React tətbiqlərinin 89%-də istifadə olunur. Tərtibatçıların əksəriyyəti onu məlumat yükləmək, xarici sistemlərlə sinxronizasiya və DOM hadisə abunəliklərini idarə etmək üçün istifadə edir.

jsx
import { useEffect } from 'react';

function UserProfile({ userId }) {
    useEffect(() => {
        fetch(`/api/users/${userId}`)
            .then(res => res.json())
            .then(data => setUser(data));
    }, [userId]);
}

useEffect necə işləyir: effektin həyat dövrü

useEffect React renderi bitirib DOM-u yenilədikdən sonra ötürülən effekt funksiyasını işə salır. Bu, render zamanı hesablamalardan əsas fərqdir: effekt çəkməni bloklamır, bu da UX performansı üçün vacibdir. Əgər effektlər sinxron icra olunsaydı, istifadəçi məlumat yükləmə zamanı «donmuş» interfeys görərdi.

Tipik effektin həyat dövrü üç fazadan ibarətdir. Komponentin montajı zamanı React effekti icra edir. Hər yeniləmədə, əgər massivdən ən azı bir asılılıq dəyişərsə, React əvvəlcə əvvəlki effektin təmizləmə funksiyasını, sonra isə yeni effekti işə salır. Komponent demontaj edildikdə yalnız təmizləmə funksiyası icra olunur.

React Team — useEffect RFC (2024)-yə görə, useEffect-in daxili tətbiqi fiber ağacında yan təsir növbəsindən istifadə edir. Dəyişikliklər təsdiqləndikdən sonra (commit phase) React bu növbədən keçir və effekt funksiyalarını komponentdə elan edilmə ardıcıllığı ilə çağırır. Hər fiber qovşağı düzgün təmizləmə və yenidən işə salma üçün əvvəlki effektə istinad saxlayır.

MərhələReact-in hərəkətiNə vaxt icra olunur
MontajEffekt funksiyasının çağrılmasıİlk renderdən sonra
Yeniləməcleanup → effektAsılılıqlar dəyişdikdə
DemontajYalnız cleanupKomponent silindikdə

useEffect asılılıq massivi

Asılılıq massivi — useEffect-in ikinci arqumenti — effektin nə vaxt yenidən işə salınacağını müəyyən edir. React Object.is vasitəsilə massivdəki hər bir dəyəri əvvəlki renderlə müqayisə edir. Əgər ən azı bir dəyər dəyişərsə, effekt yenidən işə düşür. Əgər massiv boşdursa ([]), effekt yalnız montajdan sonra bir dəfə icra olunur.

Düzgün asılılıq seçimi — useEffect ilə işin ən çətin hissəsidir. Massivə effekt daxilində istifadə olunan və renderlər arasında dəyişə bilən bütün dəyişənlər və funksiyalar daxil edilməlidir. Asılılığın buraxılması stale closures-a gətirib çıxarır — effekt əvvəlki renderdən köhnəlmiş dəyəri «görür». Lazımsız asılılıqların əlavə edilməsi həddindən artıq yenidən işə salmalara və potensial səhvlərə gətirib çıxarır.

jsx
// Asılılıqlar effektin nə vaxt yenidən işə düşəcəyini idarə edir
useEffect(() => {
    document.title = `User: ${user.name}`;
}, [user.name]); // yalnız user.name dəyişdikdə yenidən işə sal

// eslint-disable-next-line react-hooks/exhaustive-deps
// Bir asılılığı buraxsanız, köhnəlmiş məlumat alırsınız

React eslint-plugin-react-hooks qoşmasını exhaustive-deps qaydası ilə təmin edir, hansı ki, asılılıq massivinin tamlığını avtomatik yoxlayır. Meta Engineering Blog (2024)-a görə, bu qoşmanın aktivləşdirilməsi hooklarla bağlı səhvlərin sayını 72% azaldır. Nadir halları çıxmaqla, bütün exhaustive-deps xəbərdarlıqlarını şərh ilə basdırmaq əvəzinə düzəltmək tövsiyə olunur.

useEffect asılılıqsız və boş massivlə

Əgər asılılıq massivini ümumiyyətlə ötürməsənəz, useEffect hər renderdən sonra icra olunacaq. Bu, DOM ilə sinxronizasiya və ya loglama üçün faydalı ola bilər, lakin əksər hallarda bu səhvdir: effekt çox tez-tez işləyir ki, bu da performans itkisinə gətirib çıxarır. Əksər hallarda boş massiv (montaj zamanı bir dəfə) və ya konkret props/state ilə massiv ötürmək lazımdır.

Boş massiv ([]) o deməkdir ki, effekt heç bir dəyərdən asılı deyil və ciddi şəkildə bir dəfə icra olunur. Bu, sinif komponentlərində componentDidMount-un analoqudur. Lakin yadda saxlamaq lazımdır: əgər effekt daxilində props və ya state istifadə olunursa, lakin onlar asılılıq massivində göstərilməyibsə, effekt onların ilkin dəyərlərindən istifadə edəcək və yenilənmələri heç vaxt görməyəcək. Buna stale capture deyilir və tez-tez çətin aşkar edilən səhvlərin mənbəyidir.

Asılılıq massiviDavranışSiniflərdən analoq
ArqumentsizHər renderdən sonracomponentDidUpdate
[]Montaj zamanı bir dəfəcomponentDidMount
[a, b]a və ya b dəyişdikdəcomponentWillReceiveProps analoqu
cleanup returnDemontajın idarə edilməsicomponentWillUnmount

useEffect-də effektlərin təmizlənməsi

Təmizləmə funksiyası (cleanup) — bu, useEffect-in öz callbackindən qaytara biləcəyi funksiyadır. React onu komponent demontaj edildikdə və asılılıqlar dəyişdikdə effekti yenidən işə salmazdan əvvəl çağırır. Cleanup abunəliklərin, taymerlərin, sorğuların ləğv edilməsi və azad edilməli olan istənilən resurslar üçün zəruridir.

Tipik nümunə — WebSocket abunəliyi. Montaj zamanı əlaqə yaradılır, asılılıqlar yeniləndikdə — yenidən yaradılır (cleanup köhnəni bağlayır, effekt yenisini açır), demontaj zamanı — bağlanır. Cleanup olmadan komponentin hər yenidən montajı yeni WebSocket əlaqəsi yaradar ki, bu da yaddaş sızıntısına və çoxsaylı bağlantılara gətirib çıxarır.

jsx
useEffect(() => {
    const socket = new WebSocket('wss://api.example.com');
    socket.onmessage = event => setData(event.data);

    // Təmizləmə funksiyası — demontajda və yenidən işə salınmazdan əvvəl işləyir
    return () => {
        socket.close();
    };
}, []);

React Documentation (2025)-yə görə, AbortController cleanup-də fetch sorğularını ləğv etmək üçün müasir yanaşmadır. Əgər effekt HTTP sorğusu edirsə və komponent onun tamamlanmasından əvvəl demontaj edilirsə, sorğu icra olunmağa davam edir və demontajdan sonra setState səhvə səbəb olur. Effekt daxilində AbortController yaradın və sorğunu ləğv etmək üçün cleanup-də controller.abort() çağırın.

useEffect ilə tipik səhvlər

Ən geniş yayılmış səhv — asılılıqların buraxılması. Məsələn, effekt userId propsundan istifadə edir, lakin asılılıq massivi boşdur. Nəticədə effekt userId-nin ilkin dəyəri ilə bir dəfə icra olunur və onun dəyişikliklərinə heç vaxt reaksiya vermir. Tərtibatçı komponentin yeni userId aldığını görür, lakin məlumatlar yenilənmir. eslint-plugin-react-hooks exhaustive-deps qaydası ilə belə səhvləri avtomatik aşkar edir.

  • Sonsuz dövrü — effekt daxilində vəziyyətin yenilənməsi, yenidən renderə səbəb olur, bu da effekti yenidən işə salır. Həll: asılılıq massivini yoxlayın və ya setter-in funksional formasından istifadə edin.
  • Sorğu yarışı (race condition) — əgər userId tez dəyişirsə, birinci userId üçün sorğu ikincidən sonra tamamlana bilər və məlumatlar səhv nəticə göstərər. Höll: cancelled bayrağı və ya AbortController istifadə edin.
  • Lazımsız effektlər — əlaqəsiz mantiqaların bir useEffect-də birləşdirilməsi. React mantiqanı bir neçə effektə bölməyi tövsiyə edir, hətta eyni asılılıq massivinə malik olsalar belə.
  • Unudulmuş cleanup — hadisə abunəliklərinin ləğv edilməməsi, taymerlərin təmizlənməməsi və ya sorğuların ləğv edilməməsi yaddaş sızıntılarına və demontajdan sonra setState səhvlərinə gətirib çıxarır.
jsx
// ❌ Race condition — ləğv etmə yoxdur
useEffect(() => {
    fetch(`/api/user/${userId}`).then(res => setUser(res));
}, [userId]);

// ✅ AbortController ilə düzəldildi
useEffect(() => {
    const controller = new AbortController();
    fetch(`/api/user/${userId}`, { signal: controller.signal })
        .then(res => setUser(res));
    return () => controller.abort();
}, [userId]);

Sonsuz dövrü problemini həll etmək üçün əvvəlki vəziyyət əsasında vəziyyəti yeniləyən mantiqanı useEffect-də yerləşdirməkdən çəkinin. setState-in funksional formasından istifadə edin və ya hesablamaları effektin xaricindən aparın. Əgər effekt storage və ya brauzer hadisəsinə abunə olursa, dinləyici instansiyasının bir dəfə yaradıldığına əmin olun, hər renderdə yox.

Tez-tez verilən suallar

useEffect daxilində async/await istifadə etmək olarmı?

Birbaşa — yox, çünki useEffect sinxron funksiyanın və ya undefined-in qaytarılmasını gözləyir. Əgər callback async olaraq elan edilirsə, o, Promise qaytarır, React isə onu görməzə gəlir və təmizləmə mexanizmi işləməyi dayandırır. Həll: effekt daxilində async funksiyasını çağırın: useEffect(() => { async function load() { ... }; load(); }, []).

Bir komponentdə neçə useEffect ola bilər?

Heç bir məhdudiyyət yoxdur. React əlaqəsiz mantiqanı ayrı useEffect-lərə bölməyi tövsiyə edir, hətta eyni asılılıq massivinə malik olsalar belə. Hər effekt bir dəqiq müəyyən edilmiş yan təsir tapşırığına cavab verməlidir: biri abunəlik üçün, digəri məlumat yükləmək üçün, üçüncüsü sekme başlığını sinxronizasiya etmək üçün. Bu, anlamaşı və debug prosesini asanlaşdırır.

Niyə StrictMode-da useEffect iki dəfə icra olunur?

React Strict Mode-da (yalnız tərtibat rejimi) bütün effektlər montaj edilir, demontaj edilir və yenidən montaj edilir. Bu xüsusiyyətdir, səhv deyil — React cleanup-ın düzgün işlədiyini yoxlayır. Əgər demontaj və yenidən montajdan sonra effekt düzgün işləmirsə (məsələn, abunəliklər təkrarlanırsa), cleanup tam deyil. İstehsalatda effekt bir dəfə icra olunur.

useEffect-də fetch sorğusunu necə ləğv etməli?

AbortController istifadə edin. Effekt daxilində controller yaradın, controller.signal-i fetch-ə ötürün və cleanup-də controller.abort() çağırın. Əgər komponent sorğu tamamlanmazdan əvvəl demontaj edilirsə, fetch ləğv ediləcək və setState çağrılmayacaq. Bu, race condition və «Can't perform a React state update on an unmounted component» səhvindən qoruyur.

Asılılıq massivini ötürməsənəz nə olar?

useEffect istisnasız hər renderdən sonra icra olunacaq. Bu o deməkdir ki, effekt daxilindəki istənilən setState yeni renderə → yeni effektə → sonsuz dövrüyə səbəb olacaq. Praktikada asılılıq massivi olmayan effekt demək olar ki, həmişə səhvdir. İstisnalar — hər render sinxronizasiya tələb edən loglama və ya xarici sistemlə sinxronizasiya.

Nəticə

  • useEffect — DOM təsdiqlənməsindən sonra yan təsirləri yerinə yetirmək üçün hook, componentDidMount, componentDidUpdate və componentWillUnmount-u əvəz edir.
  • Asılılıq massivi — effektin yenidən işə salınmasını idarə edir; boş massiv = bir dəfə, asılılıqların buraxılması = stale closure.
  • Cleanup — təmizləmə funksiyası abunəliklər, taymerlər və sorğular üçün məcburidir; onsuz yaddaş sızıntıları baş verir.
  • AbortController — race condition-un qarşısını alan, useEffect daxilində fetch sorğularını ləğv etməyin düzgün yolu.
  • StrictMode — cleanup-ın düzgünlüyünü yoxlamaq üçün tərtibat rejimində effekti iki dəfə montaj edir.
  • Effektləri ayırın — hər useEffect bir tapşırığa cavab verir, hətta asılılıqlar üst-üstə düşsə belə.
  • eslint-plugin-react-hooks — asılılıq massivinin tamlığını avtomatik yoxlayır, səhvlərin sayını 72% azaldır.

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.

Layihəni müzakirə et

Həm də oxuyun