React bileşen yaşam döngüsünün üç aşaması vardır: mount (bileşen ekranda ilk kez görünür), update (state'i, props'u ya da context'i değiştiği için yeniden render olur) ve unmount (kaldırılır). Fonksiyon bileşenlerinde bu aşamalara useEffect ile tepki verirsin: [] ile bir efekt mount'tan sonra çalışır, bağımlılıkları olan bir efekt onların değiştiği güncellemelerden sonra çalışır ve bir efektin döndürdüğü fonksiyon unmount'ta çalışır.
Önizlemenin altındaki konsol her aşamayı gerçekleştiği anda gösterir.
Konsol render, count = 0 ve mounted ile başlar. Count'a her tıklama bir render ve bir update kaydeder. Unmount unmounted kaydeder; Mount again count = 0'dan baştan başlar, çünkü state bileşenle birlikte atıldı.
Mount
Bir bileşen, React onu ağaçtaki belirli bir yerde ilk kez render ettiğinde mount olur. React fonksiyonu çağırır, döndürdüğü JSX'ten DOM düğümlerini oluşturur, ekler, tarayıcının boyamasına izin verir ve sonra bileşenin efektlerini çalıştırır.
useEffect(fn, []), bileşen ekranda olduğu sürece var olması gereken şeyleri başlattığın yerdir: bir abonelik, bir zamanlayıcı, bir bağlantı, ilk bir veri isteği. Boyamadan sonra çalışır, bu yüzden ilk kareyi asla geciktirmez.
Update
Bir bileşen şu durumlarda güncellenir (yeniden render olur):
- kendi state'i değiştiğinde,
- ebeveyni yeniden render olduğunda (varsayılan olarak her çocuk, props'u değişsin ya da değişmesin, render olur),
- okuduğu bir context değiştiğinde.
Her güncellemeden sonra React bağımlılıkları değişen efektleri çalıştırır. Bir efekti yeniden çalıştırmadan önce o efektin önceki temizlemesini çalıştırır, böylece eski abonelik yenisi açılmadan kapanır. Render sayfası bir render'ı neyin tetiklediğini daha ayrıntılı anlatıyor.
Unmount
Bir bileşen, ebeveyni onu render etmeyi bıraktığında (yukarıdaki {show && <Counter />} gibi), key'i değiştiğinde ya da kökün kendisi unmount edildiğinde unmount olur. React DOM düğümlerini kaldırır, her efektin temizlemesini çalıştırır ve state'ini atar. Bileşen sonra yeniden görünürse yepyeni bir örnektir.
Ebeveynler ve çocuklar
React yukarıdan aşağı render eder ama efektleri aşağıdan yukarı çalıştırır. Bir ebeveyn ve çocuk birlikte mount olduğunda önce çocuğun efektleri çalışır, böylece bir ebeveynin efekti çocuklarının tamamen kurulmuş olmasına güvenebilir.
Mount render Parent, render Child, Child effect, Parent effect kaydeder. Remove'a bas; temizlemeler ters yönde çalışır: önce Parent cleanup, sonra Child cleanup.
Render ve commit aşamaları
Her güncelleme iki aşamadan geçer:
- Render aşaması. React yeni JSX'i hesaplamak için bileşenlerini çağırır ve onu önceki sonuçla karşılaştırır. Ekranda henüz hiçbir şey değişmez. React bu işi duraklatabilir, StrictMode'da iki kez çalıştırabilir ya da atabilir; render'ın saf olması gerekmesinin nedeni budur: istek yok, abonelik yok, dış değişkenlerde değişiklik yok.
- Commit aşaması. React farkları DOM'a uygular, ref'leri bağlar ve
useLayoutEffectcallback'lerini çalıştırır; hepsi tarayıcı boyamadan önce.useEffectcallback'leri bundan sonra, genellikle tarayıcı boyadıktan sonra çalışır. Güncellemeye bir tıklama ya da başka bir ayrık girdi yol açtığında React onları bunun yerine layout efektlerinin hemen ardından çalıştırır, böylece sonuç bir sonraki olaydan önce hazır olur.
Her tıklama üç satırı aynı sırayla kaydeder. Bu efektlerin bağımlılık dizisi yoktur, bu yüzden her render'dan sonra çalışırlar. İkisine de ikinci argüman olarak [] ekle; yalnızca ilkinden sonra çalışırlar.
Class yaşam döngüsü metotları ve hook karşılıkları
Class bileşenleri yaşam döngüsünü adlandırılmış metotlar olarak açıkça yazar. Onlarla eski kodda ve hâlâ class gerektiren error boundary'lerde karşılaşacaksın.
| Class metodu | Ne zaman çalışır | Fonksiyon bileşeni karşılığı |
|---|---|---|
constructor | bir kez, ilk render'dan önce | useState(initial), useRef |
static getDerivedStateFromProps | her render'dan önce | değeri render sırasında hesapla ya da bir key ile sıfırla |
render | her render | fonksiyon gövdesi |
componentDidMount | ilk render DOM'a girdikten sonra | useEffect(fn, []) |
shouldComponentUpdate | bir güncellemeden önce, onu atlayabilir | React.memo (ters cevabı döndürür: "props eşit mi") |
getSnapshotBeforeUpdate | DOM değişmeden hemen önce | doğrudan bir hook yok; en yakını bir ref ile useLayoutEffect |
componentDidUpdate | her güncellemeden sonra | useEffect(fn, [deps]) (mount'tan sonra da çalışır) |
componentWillUnmount | kaldırılmadan önce | useEffect'in döndürdüğü temizleme |
getDerivedStateFromError, componentDidCatch | bir çocuk hata fırlattığında | yok: bir error boundary class'ı yaz |
İşte çalıştıkça her metodu kaydeden bir class:
Mount constructor, getDerivedStateFromProps, render, componentDidMount kaydeder. Bir tıklama getDerivedStateFromProps, shouldComponentUpdate, render, getSnapshotBeforeUpdate, componentDidUpdate kaydeder. shouldComponentUpdate'in false döndürmesini sağla; tıklamalar düğmeyi güncellemeyi bırakır: state değişir, ama React render'ı atlar. Class bileşenleri sayfası bunun gibi bir class'ı bir fonksiyona nasıl dönüştüreceğini gösteriyor.
Yaşam döngüsüyle değil, senkronizasyonla düşün
Hook tablosu eski kodu okumak için kullanışlıdır, ama seni class alışkanlıklarını kopyalayan efektler yazmaya yöneltebilir; örneğin büyük bir "mount oldu" efekti ve büyük bir "güncellendi" efekti. Bir efekt daha iyi şöyle okunur: "bu dış şeyi bu değerlerle senkronize tut": roomId'ye bağlan ve roomId değiştiğinde bağlantıyı kesip yeniden bağlan. Senkronize ettiğin her şey için bir efekt yaz, kullandığı değerleri bağımlılık olarak listele ve onu ne zaman çalıştıracağına React karar versin.
Sıkça Sorulan Sorular
React bileşen yaşam döngüsünün aşamaları nelerdir?
Mount (React bileşeni oluşturur ve çıktısını ekrana koyar), update (state'i, props'u ya da context'i değiştiği için yeniden render olur) ve unmount (kaldırılır ve temizlik yapar).
componentDidMount'un hook karşılığı nedir?
useEffect(() => { ... }, []). Boş bağımlılık dizisi onun bir kez, ilk render ekrandayken çalışmasını sağlar. Döndürdüğü fonksiyon componentWillUnmount'un karşılığıdır.
componentDidUpdate'in hook karşılığı nedir?
Önemsediğin değerler bağımlılık dizisinde olan bir useEffect, örneğin [userId]. componentDidUpdate'in aksine ilk render'dan sonra da çalışır, yani mount ve update'i birlikte kapsar.
Ebeveyn ve çocuk efektleri hangi sırayla çalışır?
React ebeveynden aşağı doğru render eder, ama efektleri çocuklardan yukarı doğru çalıştırır: bir çocuğun efekti ebeveyninkinden önce çalışır. Unmount'ta ebeveynin temizlemesi çocuğunkinden önce çalışır.
Render ve commit aşamaları nedir?
Render aşamasında React ekranın nasıl görünmesi gerektiğini bulmak için bileşenlerini çağırır; bu işi duraklatabilir ya da atabilir. Commit aşamasında değişiklikleri DOM'a uygular ve layout efektlerini çalıştırır; normal efektler bundan sonra, genellikle tarayıcı boyadıktan sonra çalışır.