Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
React’te useEffect içinden döndürülen temizleme fonksiyonu, efektin oluşturduğu dış kaynakları ve abonelikleri artık kullanılmadığında kapatmak için kullanılır. Zamanlayıcıyı durdurmak, olay dinleyicisini kaldırmak, WebSocket bağlantısını kapatmak veya devam eden bir isteği iptal etmek buna örnektir. React bu fonksiyonu efekt yeniden çalışmadan önce ve bileşen DOM’dan kaldırılırken çağırır.

Temizleme yapılmazsa eski efekt çalışmaya devam edebilir. Bunun sonucu olarak aynı olay birden fazla kez işlenebilir, gereksiz ağ istekleri sürebilir veya artık ekranda olmayan bir bileşen için işlem yapılabilir.

Nasıl çalışır?​


Bir efektin genel yapısı şöyledir:

Kod:
useEffect(() => {
  // Kurulum: dış kaynak oluşturulur

  return () => {
    // Temizleme: dış kaynak kapatılır
  };
}, [bagimliliklar]);

React’in davranışı bağımlılık dizisine göre değişir:

BağımlılıkTemizleme ne zaman çalışır?Tipik kullanım
[]Unmount sırasında; geliştirmede Strict Mode ek setup/cleanup sınaması da yapabilirTek seferlik abonelik veya zamanlayıcı
Değişkenler içeren diziEfekt yeniden çalışmadan önce ve kaldırılmadaKimliği değişen veri aboneliği
Bağımlılık dizisi yokHer yeniden çalışmadan önce ve kaldırılmadaGenellikle dikkatle kullanılmalıdır

Temizleme fonksiyonu yalnızca efekt gerçekten bir kaynak oluşturduğunda gerekir. Örneğin bir değeri hesaplayıp konsola yazan efektin kapatılacak bir kaynağı yoksa temizleme döndürmek zorunlu değildir.

Somut örnek: interval temizlemek​


Aşağıdaki bileşen, her saniye sayacı artıran bir zamanlayıcı kurar. Efekt yeniden çalıştığında veya bileşen kaldırıldığında clearInterval zamanlayıcıyı durdurur:

Kod:
import { useEffect, useState } from "react";

export default function Sayac() {
  const [sayi, setSayi] = useState(0);

  useEffect(() => {
    const intervalId = setInterval(() => {
      setSayi((mevcut) => mevcut + 1);
    }, 1000);

    return () => {
      clearInterval(intervalId);
    };
  }, []);

  return <p>Zamanlayıcı adımı: {sayi}</p>;
}

Uygulama adımları:

  1. Bileşene ait dosyada useEffect ve useState içe aktarılır.
  2. Efekt içinde setInterval çağrılır ve dönen kimlik intervalId değişkeninde tutulur.
  3. Efektin döndürdüğü fonksiyonda aynı kimlik clearInterval ile kapatılır.
  4. Bileşeni JSX ağacından kaldırarak (örneğin koşullu render ile) temizlemeyi gözlemleyin. Yalnızca CSS ile display:none vermek unmount değildir ve cleanup tetiklemez.

Sayaç interval callback sayısını gösterir; arka plan sekmesi ve yoğun ana iş parçacığı nedeniyle gerçek geçen süreye eşit olmak zorunda değildir. Başarı sonucu, bileşen mount edilmişken sayacın ilerlemesi ve bileşen kaldırıldıktan sonra yeni interval’ların çalışmamasıdır. Temizleme unutulursa bileşen görünür değilken de zamanlayıcı çalışabilir. Geliştirme ortamında Strict Mode kullanılıyorsa React kurulumu ve temizlemeyi art arda test edebilir; bu, temizleme fonksiyonunun güvenilir ve tekrar çağrılabilir yazılması gerektiğini gösteren bir geliştirme davranışıdır.

Hangi durumda ne temizlenir?​


Efekt içinde oluşturduğunuz kaynağın karşılığını temizleme fonksiyonunda kullanın:

  • setInterval veya setTimeout için clearInterval veya clearTimeout çağırın.
  • addEventListener için aynı hedef, olay adı, işleyici referansı ve capture seçeneğiyle removeEventListener kullanın. İşleyiciyi temizleme içinde yeniden oluşturmayın; aynı fonksiyon referansını saklayın.
  • WebSocket veya benzeri bağlantılar için bağlantının API’sindeki kapatma yöntemini çağırın.
  • Fetch isteği için efekt içinde AbortController oluşturup temizlemede abort() çağırın. İptal hatasını uygulamanın gerçek hata akışından ayrı ele alın; geç gelen sonuçları state’e yazmadan önce effect’in hâlâ geçerli olduğunu da kontrol edin. Abort isteği, sunucuda başlamış işlemi mutlaka geri almaz.
  • Harici bir mağaza veya kütüphane aboneliği için abonelikten çıkma işlevini çağırın.

Sık yapılan hatalar​


Yanlış kaynağı kapatmak: Her efekt kendi oluşturduğu kaynağın kimliğini veya referansını temizlemelidir. Ortak bir değişkeni yanlışlıkla değiştirmek, başka bir bileşenin zamanlayıcısını kapatabilir.

Bağımlılıkları eksik yazmak: Efekt içinde kullanılan değişken değişebiliyorsa bağımlılık dizisine uygun şekilde eklenmelidir. Aksi durumda efekt eski değeri görebilir veya eski abonelik çalışmaya devam edebilir.

Temizleme fonksiyonunda yeni kaynak oluşturmak: Temizleme bölümü yeni interval, dinleyici veya abonelik kurmamalıdır; amacı mevcut kaynağı kapatmaktır.

Her efektin mutlaka temizlenmesi gerektiğini düşünmek: Temizlenecek dış kaynak yoksa gereksiz bir fonksiyon eklemek sorunu çözmez. Önce efektin React dışındaki hangi kaynağı oluşturduğunu belirleyin.

Kaynaklar​



Sık sorulan sorular​


Temizleme fonksiyonu bileşen kaldırılınca state’i sıfırlar mı?​


Hayır. Temizleme fonksiyonunun amacı kaynakları kapatmaktır. State’in başlangıç değerine dönmesi, bileşenin yeniden oluşturulmasıyla ilgilidir.

useEffect içinden her zaman bir fonksiyon döndürmek gerekir mi?​


Hayır. Yalnızca kapatılması veya iptal edilmesi gereken bir dış kaynak kuruyorsanız fonksiyon döndürün. Kaynak oluşturmayan efektlerde dönüş değeri gerekmeyebilir.

Temizleme fonksiyonu neden efekt yeniden çalışmadan önce çağrılır?​


Böylece önceki bağımlılıklarla kurulmuş kaynak kapanır, ardından yeni bağımlılıklarla tek bir güncel kaynak kurulur. Bu düzen, eski aboneliklerin ve zamanlayıcıların birikmesini önler.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.