ReactJS'de componentWillMount ve componentDidMount arasındaki fark nedir?


92

Facebook'un belgelerine ( React.Component ) baktım ve sadece componentWillMountistemcide çalıştırılırken istemci / sunucuda nasıl çağrıldığından bahsediyor componentDidMount. componentWillMountSunucuya ne yapar ?

Yanıtlar:


70

componentWillMount esasen yapıcıdır. Oluşturmayı etkilemeyen örnek özelliklerini ayarlayabilir, eşzamanlı olarak bir mağazadan veri çekebilir ve bununla birlikte setState'i ve bileşeninizi kurarken çalıştırmanız gereken diğer basit yan etkili ücretsiz kodları ayarlayabilirsiniz.

Nadiren ihtiyaç duyulur ve ES6 sınıflarında hiç gerekmez.


Yapıcı ile aynı değildir. Geliştiricideki katı modda, örneğin,
kurucunuz

63

constructoryöntem değildir aynı componentWillMount.

Redux'un yazarına göre, oluşturucudan eylemler göndermek risklidir çünkü işleme sırasında durumun değişmesine neden olabilir.

Ancak, buradan göndermek componentWillMountgayet iyi.

dan github konuya :

Bu, bir bileşenin yapıcısının içindeki dispatch () başka bir bileşenin içinde bir setState () oluşturduğunda gerçekleşir. React, bu tür uyarılar için "mevcut sahibin" kaydını tutar ve teknik olarak yapıcı uygulamanın başka bir bölümünde bir setState () oluşturmasına neden olduğunda kurucu içinde setState () 'i çağırdığımızı düşünür. Bunu halletmemiz gerektiğini düşünmüyorum - sadece React işini en iyi şekilde yapmaya çalışıyor. Çözüm, doğru bir şekilde belirttiğiniz gibi, bunun yerine componentWillMount () içine () göndermektir.


İçinde ne olduğuna bağlı olarak her koşulda kesinlikle iyi değildir componentXxxMount, örneğin, Ajax içeri willMountsorunlara neden olabilir.
Dave Newton

2
@DaveNewton Her koşulda cezasını söylemedim. Ben sadece "componentWillMount aslında yapıcıdır" cevabının yanlış olduğunu kanıtlayacak bir farkın olduğu bir örnek verdim.
Açıklığa

@LiranBrimer Bu yanıt, componentWillMount kullanımdan kaldırıldığından ve sırasıyla 0.16 ve 0.17'de çalışmayı durduracağından, özellikle "Ancak, componentWillMount'tan gönderim gayet iyi." açıklama
Brian Webster

37

FakeRainBrigand'ın söylediği şeye eklemek gerekirse componentWillMount, sunucuda ve istemcide React işlenirken çağrılır, ancak componentDidMountyalnızca istemcide çağrılır.


10
componentWillMountsunucu ve istemciyi arayacaktır. bkz: facebook.github.io/react/docs/…
David

1
@DaveNewton nasıl? componentWillMountİstemciden
aranmayacağını

7
@AyushShanker IMO yanıltıcı olmayan bilgiler sağlamak önemlidir. Açık olmamakla, yanlış yorumlamaya yer vardır: belgeler açıktır. Bunun açıkça çelişkili olmadığı konusunda da haklısınız.
Dave Newton

31

componentWillMountrenderbir bileşenin BAŞLANGICI öncesinde yapılır ve sahne öğelerini değerlendirmek ve bunlara dayalı herhangi bir ekstra mantık yapmak için kullanılır (genellikle durumu da güncellemek için) ve bu nedenle, ilk sunucu tarafında oluşturulan işaretlemeyi elde etmek için sunucuda gerçekleştirilebilir .

componentDidMountrenderDOM güncellendiğinde baştan SONRA gerçekleştirilir (ancak bu DOM güncellemesi tarayıcıya boyanmadan ÖNCE, DOM'un kendisiyle her türlü gelişmiş etkileşimi yapmanıza izin verir). Bu elbette yalnızca tarayıcının kendisinde olabilir ve bu nedenle SSR'nin bir parçası olarak gerçekleşmez, çünkü sunucu yalnızca işaretleme oluşturabilir, DOM'un kendisini oluşturmaz, bu, SSR kullanılıyorsa tarayıcıya gönderildikten sonra yapılır.

Dediğiniz DOM ile gelişmiş etkileşimler? Ne var ?? ... Evet - bu noktada DOM güncellendiğinden (ancak kullanıcı güncellemeyi tarayıcıda henüz görmedi) kullanarak gerçek resmi ekrana kesmek window.requestAnimationFrameve ardından gerçek olanı ölçmek gibi şeyler yapmak mümkündür. Başka durum değişikliklerini gerçekleştirebileceğiniz, çıktısı alınacak DOM öğeleri, örneğin, bilinmeyen değişken uzunluklu içeriklere sahip bir öğenin yüksekliğine animasyon uygulamak gibi süper kullanışlıdır (artık içeriği ölçüp animasyona bir yükseklik atayabileceğiniz gibi), veya bazı durum değişiklikleri sırasında içerik senaryolarının yanıp sönmesini önlemek için.

Durum değişikliklerini korumak için çok dikkatli olun componentDid..., aksi takdirde sonsuz bir döngüye neden olabilir çünkü bir durum değişikliği aynı zamanda bir yeniden oluşturmaya ve dolayısıyla başka componentDid...ve sürekli olarak


1
Ben ekleyerek sanmıyorum setStateiçinde componentDidMountsonsuz bir döngüye neden olur.
Maddy

" aksi takdirde sonsuz bir döngüye neden olabilir çünkü bir durum değişikliği aynı zamanda bir yeniden oluşturmaya ve dolayısıyla başka bir componentDidMount'a neden olur . Durum değişiklikleri yeniden oluşturmaya neden olur, ancak componentDidMounttekrar tekrar başlatılmaz . componentDidMount, bileşen bağlandığında yalnızca bir kez çağrılır.
hussain.codes


2

componentWillMount https://daveceddia.com/where-fetch-data-componentwillmount-vs-componentdidmount/

Yine de bir "aldatma" var: Verileri almak için eşzamansız bir çağrı, işleme gerçekleşmeden önce geri dönmeyecek. Bu, bileşenin en az bir kez boş verilerle işleneceği anlamına gelir.

Verilerin gelmesini beklemek için oluşturmayı "duraklatmanın" bir yolu yoktur. ComponentWillMount'tan bir sözü geri döndüremez veya bir setTimeout'ta bir şekilde tartışamazsınız.

https://developmentarc.gitbooks.io/react-indepth/content/life_cycle/birth/premounting_with_componentwillmount.html

Bileşenimizin Yerel Kullanıcı Arayüzüne (DOM, vb.) erişimi olmayacaktır. Henüz oluşturulmadıkları için çocuk referanslarına da erişimimiz olmayacak. ComponentWillMount (), konfigürasyonu yönetmemiz, durumumuzu güncellememiz ve genel olarak ilk render için hazırlanmamız için bir fırsattır. Bu, prop değerlerine göre hesaplamalar veya işlemler yapmaya başlayabileceğimiz anlamına gelir.


1

ComponentWillMount () için kullanım durumu

Örneğin, bileşen durumunuzda bileşenin oluşturulduğu tarihi tutmak istiyorsanız, bunu bu yöntemde ayarlayabilirsiniz. Lütfen bu yöntemdeki ayar durumunun DOM'u yeniden oluşturmayacağını unutmayın. Bunu akılda tutmak önemlidir, çünkü çoğu durumda bileşenin durumunu her değiştirdiğimizde, bir yeniden oluşturma tetiklenir.

componentWillMount() {
  this.setState({ todayDate: new Date(Date.now())});
}

ComponentDidMount () için kullanım durumu

Örneğin, güncel haberlerle ilgili verileri alan ve kullanıcıya görüntüleyen bir haber uygulaması oluşturuyorsanız ve bu verilerin, kullanıcının sayfayı yenilemesine gerek kalmadan her saat güncellenmesini isteyebilirsiniz.

componentDidMount() {
  this.interval = setInterval(this.fetchNews, 3600000);
}

0

ComponentDidMount()Yöntem yalnızca sınıf bileşenlerinde mevcut sayfayı değiştirir, ancak ComponentWillMount()etkilenen tüm sayfaları değiştirir.setStates()

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.