Właśnie odkryłem, że this.setState()
funkcja react w dowolnym komponencie jest asynchroniczna lub jest wywoływana po zakończeniu funkcji, w której została wywołana.
Teraz przeszukałem i znalazłem tego bloga ( setState () Operacja mutacji stanu może być synchroniczna w ReactJS )
Tutaj odkrył, że setState
jest to asynchronizacja (wywoływana, gdy stos jest pusty) lub synchronizacja (wywoływana zaraz po wywołaniu) w zależności od tego, jak wyzwolono zmianę stanu.
Teraz te dwie rzeczy są trudne do strawienia
- W blogu
setState
funkcja jest wywoływana wewnątrz funkcjiupdateState
, ale to, co ją wyzwoliło,updateState
nie jest czymś, o czym mogłaby wiedzieć wywoływana funkcja. - Dlaczego mieliby tworzyć
setState
async, ponieważ JS jest językiem jednowątkowym, a to setState nie jest WebAPI ani wywołaniem serwera, więc musi być wykonane tylko w wątku JS. Czy robią to po to, aby ponowne renderowanie nie zatrzymywało wszystkich słuchaczy zdarzeń i rzeczy, czy też jest jakiś inny problem projektowy.
setState
: medium.com/@agm1984/ ...Odpowiedzi:
Możesz wywołać funkcję po zaktualizowaniu wartości stanu:
Ponadto, jeśli masz wiele stanów do jednoczesnej aktualizacji, zgrupuj je wszystkie w tym samym
setState
:Zamiast:
Po prostu zrób to:
źródło
1)
setState
akcje są asynchroniczne i są grupowane w celu zwiększenia wydajności. Jest to wyjaśnione w dokumentacjisetState
.2) Dlaczego mieliby ustawiać setState jako async, skoro JS jest językiem jednowątkowym, a
setState
nie jest to wywołanie WebAPI ani wywołanie serwera?Dzieje się tak, ponieważ
setState
zmienia stan i powoduje ponowne poddanie się. Może to być kosztowna operacja, a synchronizacja może spowodować, że przeglądarka nie będzie odpowiadać.W związku z tym wywołania setState są asynchroniczne, a także grupowane w celu lepszego działania interfejsu użytkownika i wydajności.
źródło
this.setState({ something: true }, () => console.log(this.state))
Wiem, że to pytanie jest stare, ale przez długi czas powodowało wiele zamieszania u wielu użytkowników reakcji, w tym mnie. Niedawno Dan Abramov (z zespołu reagowania) właśnie napisał świetne wyjaśnienie, dlaczego natura
setState
jest asynchroniczna:https://github.com/facebook/react/issues/11527#issuecomment-360199710
setState
ma być asynchroniczny, a w powiązanym wyjaśnieniu Dana Abramova jest kilka naprawdę dobrych powodów. Nie oznacza to, że zawsze będzie asynchroniczny - oznacza to głównie, że po prostu nie możesz polegać na synchronizacji . ReactJS bierze pod uwagę wiele zmiennych w scenariuszu, w którym zmieniasz stan, aby zdecydować, kiedystate
faktycznie należy zaktualizować i ponownie wyrenderować komponent.Prostym przykładem, aby to zademonstrować, jest to, że jeśli zadzwonisz
setState
jako reakcja na akcję użytkownika, tostate
prawdopodobnie zostanie zaktualizowany natychmiast (chociaż znowu nie możesz na to liczyć), więc użytkownik nie odczuje żadnego opóźnienia , ale jeśli zadzwoniszsetState
w reakcji na odpowiedź na wywołanie ajax lub inne zdarzenie, które nie jest wyzwalane przez użytkownika, stan może zostać zaktualizowany z niewielkim opóźnieniem, ponieważ użytkownik tak naprawdę nie odczuje tego opóźnienia i poprawi wydajność, czekając na zbiorczo wiele aktualizacji stanu i rzadziej ponownie oddawaj model DOM.źródło
Dobry artykuł tutaj https://github.com/vasanthk/react-bits/blob/master/patterns/27.passing-function-to-setState.md
lub przekaż callback
this.setState ({.....},callback)
https://medium.com/javascript-scene/setstate-gate-abc10a9b2d82 https://medium.freecodecamp.org/functional-setstate-is-the-future-of-react-374f30401b6b
źródło
Możesz użyć następującego zawijania, aby wykonać połączenie synchronizacyjne
źródło
Wyobraź sobie, że zwiększasz licznik w jakimś komponencie:
Istnieje procedura obsługi zliczania dołączona zarówno do składnika nadrzędnego, jak i podrzędnego. Odbywa się to celowo, abyśmy mogli dwukrotnie wykonać setState () w tym samym kontekście propagacji zdarzenia kliknięcia, ale z poziomu 2 różnych programów obsługi.
Jak możemy sobie wyobrazić, pojedyncze zdarzenie kliknięcia przycisku wyzwoli teraz oba te programy obsługi, ponieważ zdarzenie przechodzi z celu do najbardziej zewnętrznego kontenera podczas fazy propagacji.
Dlatego btnCountHandler () jest wykonywana jako pierwsza, oczekuje się, że zwiększy licznik do 1, a następnie wykonuje divCountHandler (), oczekując, że zwiększy licznik do 2.
Jednak liczba wzrasta tylko do 1, co można sprawdzić w narzędziach React Developer.
To dowodzi, że reagujemy
kolejkuje wszystkie wywołania setState
wraca do tej kolejki po wykonaniu ostatniej metody w kontekście (w tym przypadku divCountHandler)
łączy wszystkie mutacje obiektów zachodzące w wielu wywołaniach setState w tym samym kontekście (wszystkie wywołania metod w jednej fazie zdarzenia mają ten sam kontekst np.) w jedną składnię mutacji obiektu (scalanie ma sens, ponieważ dlatego możemy niezależnie aktualizować właściwości stanu w setState () na pierwszym miejscu)
i przekazuje go do jednej pojedynczej metody setState (), aby zapobiec ponownemu renderowaniu z powodu wielu wywołań setState () (jest to bardzo prymitywny opis przetwarzania wsadowego).
Wynikowy kod uruchomiony przez React:
Aby zatrzymać to zachowanie, zamiast przekazywania obiektów jako argumentów do metody setState, przekazywane są wywołania zwrotne.
Gdy ostatnia metoda zakończy wykonywanie i gdy reakcja powróci do przetworzenia kolejki setState, po prostu wywołuje wywołanie zwrotne dla każdego ustawionego w kolejce setState, przekazując poprzedni stan komponentu.
W ten sposób reakcja zapewnia, że ostatnie wywołanie zwrotne w kolejce zaktualizuje stan, w którym wszystkie poprzednie odpowiedniki położyły w ręce.
źródło
Tak, metoda setState () jest asynchroniczna.
Z linku: https://reactjs.org/docs/react-component.html#setstate
Ponieważ myślą
Z linku: https://github.com/facebook/react/issues/11527#issuecomment-360199710
Asynchroniczna funkcja setState () bardzo utrudnia życie początkującym, a nawet niestety doświadczyli:
- nieoczekiwanych problemów z renderowaniem: opóźnione renderowanie lub brak renderowania (w oparciu o logikę programu)
- przekazywanie parametrów to ważna sprawa
wśród innych problemów.
Poniższy przykład pomógł:
Mam nadzieję, że to pomoże.
źródło