Jaka jest różnica między componentWillMount i componentDidMount w ReactJS?


91

Przejrzałem dokumentację Facebooka pod adresem ( React.Component ) i wspomina, jak componentWillMountjest wywoływana na kliencie / serwerze, podczas gdy componentDidMountjest wywoływana tylko na kliencie. Co robi componentWillMountz serwerem?

Odpowiedzi:


70

componentWillMount jest zasadniczo konstruktorem. Możesz ustawić właściwości instancji, które nie mają wpływu na renderowanie, synchronicznie pobierać dane ze sklepu i ustawiać z nim stan, a także inny prosty kod bez efektu ubocznego, który musisz uruchomić podczas konfigurowania komponentu.

Jest to rzadko potrzebne i wcale nie jest potrzebne w przypadku klas ES6.


To nie to samo, co konstruktor. W trybie ścisłym w dev, na przykład twój konstruktor zostanie wywołany dwukrotnie (dla dwóch różnych instancji), ale tylko jeden będzie miał nazwę componentWillMount - stackoverflow.com/questions/61254372/…
adarsh

63

constructormetoda nie jest taki sam, jak componentWillMount.

Zdaniem autora Reduxa wysyłanie akcji od konstruktora jest ryzykowne, ponieważ może skutkować mutacją stanu podczas renderowania.

Jednak wysyłka z componentWillMountjest w porządku.

z wydania github :

Dzieje się tak, gdy metoda dispatch () wewnątrz konstruktora jednego składnika powoduje wywołanie setState () wewnątrz innego składnika. React śledzi „aktualnego właściciela” dla takich ostrzeżeń - i myśli, że wywołujemy metodę setState () wewnątrz konstruktora, gdy technicznie konstruktor powoduje wywołanie setState () w innej części aplikacji. Myślę, że nie powinniśmy się tym zajmować - po prostu React stara się jak najlepiej wykonać swoją pracę. Rozwiązaniem jest, jak słusznie zauważyłeś, zamiast tego metoda dispatch () wewnątrz componentWillMount ().


Zdecydowanie nie jest to w porządku we wszystkich okolicznościach, w zależności od tego, co się dzieje componentXxxMount, np. Ajax willMountmoże powodować problemy.
Dave Newton

2
@DaveNewton Nie powiedziałem, że jest to dobre we wszystkich okolicznościach. Podałem tylko przykład, w którym istnieje różnica, aby udowodnić, że odpowiedź „componentWillMount jest zasadniczo konstruktorem” jest błędna. Dzięki za wyjaśnienie
Liran Brimer

@LiranBrimer Ta odpowiedź staje się niedokładna, ponieważ składnik componentWillMount jest przestarzały i przestanie działać odpowiednio w wersjach 0.16 i 0.17, szczególnie w odniesieniu do „Jednak wysyłanie z componentWillMount jest w porządku”. oświadczenie
Brian Webster

37

Aby dodać do tego, co powiedział FakeRainBrigand, componentWillMountjest wywoływany podczas renderowania React na serwerze i kliencie, ale componentDidMountjest wywoływany tylko na kliencie.


10
componentWillMountzadzwoni na serwer i klienta. patrz: facebook.github.io/react/docs/…
David

1
@DaveNewton jak? Nie było componentWillMount
napisane, że

7
@AyushShanker IMO ważne jest, aby podawać niewprowadzające w błąd informacje. Brak jednoznaczności pozwala na błędną interpretację: dokumenty są jednoznaczne. Masz rację, że nie jest to również jawnie sprzeczne.
Dave Newton

31

componentWillMountjest wykonywana przed INITIALEM renderkomponentu i jest używana do oceny właściwości i wykonywania na ich podstawie dodatkowej logiki (zwykle również do aktualizacji stanu) i jako taka może być wykonana na serwerze w celu uzyskania pierwszego renderowanego znacznika po stronie serwera .

componentDidMountjest wykonywana PO pierwszej renderaktualizacji, gdy DOM został zaktualizowany (ale przede wszystkim PRZED aktualizacją DOM jest namalowana w przeglądarce, co pozwala na wykonywanie wszelkiego rodzaju zaawansowanych interakcji z samym DOM). To oczywiście może się zdarzyć tylko w samej przeglądarce i nie występuje w ramach SSR, ponieważ serwer może generować tylko znaczniki, a nie sam DOM, dzieje się to po wysłaniu go do przeglądarki, jeśli używa SSR

Zaawansowane interakcje z DOM, o którym mówisz? Whaaaat ?? ... Tak - w tym momencie, ponieważ DOM został zaktualizowany (ale użytkownik nie widział jeszcze aktualizacji w przeglądarce) możliwe jest przechwycenie rzeczywistego malowania na ekranie za pomocą, window.requestAnimationFramea następnie wykonanie takich rzeczy, jak zmierzenie rzeczywistego Elementy DOM, które zostaną wyprowadzone, do których możesz dokonać dalszych zmian stanu, super przydatne na przykład do animacji do wysokości elementu, który ma nieznaną zawartość zmiennej długości (ponieważ możesz teraz zmierzyć zawartość i przypisać wysokość do animacji), lub aby uniknąć flashowania scenariuszy treści podczas pewnych zmian stanu.

Bądź jednak bardzo ostrożny, aby strzec zmian stanu w jakikolwiek componentDid...inny sposób, ponieważ w przeciwnym razie może to spowodować nieskończoną pętlę, ponieważ zmiana stanu spowoduje również ponowne renderowanie, a zatem kolejne componentDid...i ciągle i dalej i dalej


1
Nie sądzę, dodając setStatew componentDidMountspowoduje nieskończoną pętlę.
Maddy

ponieważ w przeciwnym razie może spowodować nieskończoną pętlę, ponieważ zmiana stanu spowoduje również ponowne renderowanie, a zatem inny składnik componentDidMount. i dalej i dalej i dalej ”, to wcale nie jest prawda. Zmiany stanu spowodują ponowne renderowanie, ale nie będą wywoływać componentDidMountponownie. componentDidMount jest wywoływane tylko raz, gdy komponent zostanie zamontowany.
hussain.codes


2

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

Jest jednak pewien problem: asynchroniczne wywołanie pobierania danych nie powróci przed renderowaniem. Oznacza to, że komponent przynajmniej raz wyrenderuje się z pustymi danymi.

Nie ma możliwości „wstrzymania” renderowania i czekania na nadejście danych. Nie możesz w jakiś sposób zwrócić obietnicy z componentWillMount ani zmagać się z setTimeout.

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

nasz komponent nie będzie miał dostępu do natywnego interfejsu użytkownika (DOM itp.). Nie będziemy też mieli dostępu do referencji dla dzieci, ponieważ nie zostały one jeszcze utworzone. KomponentWillMount () to dla nas szansa na obsługę konfiguracji, aktualizację stanu i generalnie przygotowanie do pierwszego renderowania. Oznacza to, że możemy rozpocząć obliczenia lub procesy w oparciu o wartości rekwizytów.


1

Przypadek użycia dla componentWillMount ()

Na przykład, jeśli chcesz zachować datę utworzenia komponentu w stanie komponentu, możesz to ustawić w tej metodzie. Pamiętaj, że ustawienie stanu w tej metodzie nie spowoduje ponownego renderowania modelu DOM. Należy o tym pamiętać, ponieważ w większości przypadków za każdym razem, gdy zmieniamy stan komponentu, wyzwalane jest ponowne renderowanie.

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

Przykład zastosowania dla componentDidMount ()

Na przykład, jeśli tworzysz aplikację z wiadomościami, która pobiera dane dotyczące aktualnych wiadomości i wyświetla je użytkownikowi, i możesz chcieć, aby te dane były aktualizowane co godzinę bez konieczności odświeżania strony przez użytkownika.

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

0

ComponentDidMount()Metoda zmienia tylko bieżącą stronę w komponentach klasy, ale ComponentWillMount()zmienia wszystkie strony, na które wpłynąłsetStates()

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.