useLayoutEffect vs useEffect: React Yan Etkileri İçin Pratik Bir Kılavuz
React bileşenlerinde, kullanıcı arayüzünde görünen değişikliklerden bağımsız olarak, yan etkilerle başa çıkmanız gerekebilir. Bu yan etkiler, veri çekme, DOM manipülasyonu veya zamanlama işlemleri gibi işlemleri içerir. React, bu yan etkileri yönetmek için useEffect ve useLayoutEffect hook’larını sunar. Her iki hook da benzer şekilde kullanılır, ancak önemli bir farkları vardır: **zamanlama**.
useEffect: Görüntüleme Döngüsü Sonrasında Çalışma
useEffect hook’u, React bileşeninin DOM’a render edilmesinden sonra çalışır. Bu, bileşeniniz yeniden oluşturulduktan ve göründükten sonra, tüm DOM güncellemeleri tamamlandıktan sonra yan etkiyi tetikler. Bu durum, veri çekme gibi senkron olmayan işlemler için veya DOM manipülasyonu gerektiren ancak render performansını etkilemeyen görevler için idealdir.
Örnek olarak, bir bileşen render olduğunda API’den veri çekmek istediğimizi varsayalım:
“`jsx
import React, { useState, useEffect } from ‘react’;
function DataFetcher() {
const [data, setData] = useState(null);
useEffect(() => {
const fetchData = async () => {
const response = await fetch(‘https://api.example.com/data’);
const json = await response.json();
setData(json);
};
fetchData();
}, []);
if (!data) {
return
;
}
return (
{data.description}
);
}
export default DataFetcher;
“`
Bu örnekte, useEffect hook’u, bileşen render edildikten sonra API çağrısını çalıştırmak için kullanılır. Veriler yüklenene kadar “Veriler yükleniyor…” mesajı gösterilir ve daha sonra veri başarılı bir şekilde alınır ve bileşen güncellenir.
useLayoutEffect: Görüntüleme Döngüsü Sırasında Çalışma
useLayoutEffect hook’u, useEffect ile benzer şekilde çalışır ancak önemli bir farkla: **render döngüsü sırasında** çalışır. Bu, bileşen DOM’a render edilmeden önce, ancak ekranı yeniden çizmeden önce yan etkinin çalıştığı anlamına gelir. Bu durum, DOM’a yapılan değişikliklerin kullanıcı arayüzünü etkilediği ve hemen yansıması gereken görevler için idealdir.
Örnek olarak, bir bileşenin yüksekliğini dinamik olarak ayarlamamız gerektiğini varsayalım. useLayoutEffect ile, bileşen render edildikten sonra, ancak ekran yeniden çizmeden önce, yüksekliği ayarlayabiliriz:
“`jsx
import React, { useState, useLayoutEffect } from ‘react’;
function DynamicHeight() {
const [height, setHeight] = useState(0);
useLayoutEffect(() => {
const element = document.getElementById(‘myElement’);
setHeight(element.offsetHeight);
}, []);
return (
);
}
export default DynamicHeight;
“`
Bu örnekte, useLayoutEffect hook’u, bileşen render edildikten sonra, ancak ekran yeniden çizmeden önce, myElement öğesinin yüksekliğini hesaplar ve setHeight durumunu günceller. Bu sayede, yükseklik hemen doğru bir şekilde ayarlanır ve kullanıcı bir gecikme yaşamaz.
Hangisini Kullanmalıyım?
Genel olarak, useEffect, **senkron olmayan işlemler** veya DOM manipülasyonu gerektiren, ancak kullanıcı arayüzünü hemen etkilemeyen görevler için tercih edilmelidir. Öte yandan, useLayoutEffect, DOM’a yapılan değişikliklerin **anında yansıması** gereken görevler için kullanılmalıdır. Bu nedenle, DOM’a yapılan değişiklikler kullanıcının hemen görmesi gereken durumlarda veya performansı etkileyecek bir render işlemi olduğunda useLayoutEffect kullanılmalıdır.
İşte bir özet tablo:
| Hook | Zamanlama | Kullanım Durumları |
|---|---|---|
useEffect |
Render döngüsü sonrasında |
|
useLayoutEffect |
Render döngüsü sırasında |
|
Sonuç
useEffect ve useLayoutEffect hook’ları, React bileşenlerinde yan etkileri yönetmek için güçlü araçlardır. Her iki hook da benzer şekilde kullanılır, ancak **zamanlama** açısından farklılık gösterirler. useEffect, render döngüsü sonrasında çalışırken, useLayoutEffect render döngüsü sırasında çalışır. Doğru hook’u seçmek, uygulama performansını optimize etmek ve kullanıcı deneyimini iyileştirmek için çok önemlidir. Bu kılavuz, React bileşenlerinde yan etkileri yönetmek için gereken bilgileri sağlayarak, daha etkili ve verimli uygulamalar oluşturmanıza yardımcı olacaktır. Eğer React ve hook’lar hakkında daha fazla bilgi edinmek istiyorsanız, kendi web sitemi [fatihsoysal.com](https://fatihsoysal.com) ziyaret edebilirsiniz.
#Etiketler
React, useEffect, useLayoutEffect, Yan Etkiler, Hook’lar, Performans, DOM Manipülasyonu, API Çağrıları, Render Döngüsü, Zamanlama, Kullanıcı Deneyimi, Web Geliştirme, JavaScript, Kılavuz, Fatih Soysal
