Menu

React Bileşen Yaşam Döngüsü: Mount, Update, Unmount

Her React bileşeni mount olur (görünür), güncellenir (yeniden render olur) ve unmount olur (kaldırılır). Her aşamanın useEffect ile nasıl eşleştiğini, class yaşam döngüsü metotlarını ve hook karşılıklarını, render ve commit aşamalarını öğren.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

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:

  1. 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.
  2. Commit aşaması. React farkları DOM'a uygular, ref'leri bağlar ve useLayoutEffect callback'lerini çalıştırır; hepsi tarayıcı boyamadan önce. useEffect callback'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 metoduNe zaman çalışırFonksiyon bileşeni karşılığı
constructorbir kez, ilk render'dan önceuseState(initial), useRef
static getDerivedStateFromPropsher render'dan öncedeğeri render sırasında hesapla ya da bir key ile sıfırla
renderher renderfonksiyon gövdesi
componentDidMountilk render DOM'a girdikten sonrauseEffect(fn, [])
shouldComponentUpdatebir güncellemeden önce, onu atlayabilirReact.memo (ters cevabı döndürür: "props eşit mi")
getSnapshotBeforeUpdateDOM değişmeden hemen öncedoğrudan bir hook yok; en yakını bir ref ile useLayoutEffect
componentDidUpdateher güncellemeden sonrauseEffect(fn, [deps]) (mount'tan sonra da çalışır)
componentWillUnmountkaldırılmadan önceuseEffect'in döndürdüğü temizleme
getDerivedStateFromError, componentDidCatchbir çocuk hata fırlattığındayok: 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.

Coddy programlama dilleri çizimi

Coddy ile kodlamayı öğren

BAŞLA