setState() umieszcza w kolejce zmiany stanu składnika i informuje Reacta, że ten składnik i jego elementy potomne muszą zostać ponownie wyrenderowane ze zaktualizowanym stanem.
setState jest asynchroniczna i właściwie nie zwraca obietnicy. Więc w przypadkach, gdy chcemy zaktualizować lub wywołać funkcję, funkcję tę można nazwać callback w funkcji setState jako drugi argument. Na przykład w powyższym przypadku wywołałeś funkcję jako wywołanie zwrotne setState.
setState(
{ name: "Michael" },
() => console.log(this.state)
);
Powyższy kod działa dobrze dla komponentu klasy, ale w przypadku komponentu funkcjonalnego nie możemy użyć metody setState, a to możemy wykorzystać hook efektu użycia, aby osiągnąć ten sam wynik.
Oczywistą metodą, która przychodzi na myśl, jest to, że ypu może używać z useEffect, jak poniżej:
const [state, setState] = useState({ name: "Michael" })
useEffect(() => {
console.log(state)
}, [state])
Ale uruchomiłoby się to również przy pierwszym renderowaniu, więc możemy zmienić kod w następujący sposób, w którym możemy sprawdzić pierwsze zdarzenie renderowania i uniknąć renderowania stanu. Dlatego wdrożenie można przeprowadzić w następujący sposób:
Możemy tutaj użyć haka użytkownika, aby zidentyfikować pierwszy render.
Hook useRef pozwala nam tworzyć zmienne zmienne w komponentach funkcjonalnych. Przydaje się do uzyskiwania dostępu do węzłów DOM / elementów React i do przechowywania zmiennych zmiennych bez wyzwalania ponownego renderowania.
const [state, setState] = useState({ name: "Michael" });
const firstTimeRender = useRef(true);
useEffect(() => {
if (!firstTimeRender.current) {
console.log(state);
}
}, [state])
useEffect(() => {
firstTimeRender.current = false
}, [])