useEffect React hak będzie działać w funkcji przekazany na każdej zmianie. Można to zoptymalizować, aby zadzwonił tylko wtedy, gdy zmienią się pożądane właściwości.
Co zrobić, jeśli chcę wywołać funkcję inicjowania componentDidMount
i nie wywoływać jej ponownie w przypadku zmian? Powiedzmy, że chcę załadować jednostkę, ale funkcja ładowania nie potrzebuje żadnych danych z komponentu. Jak możemy to zrobić za pomocą useEffect
haka?
class MyComponent extends React.PureComponent {
componentDidMount() {
loadDataOnlyOnce();
}
render() { ... }
}
W przypadku haków może to wyglądać tak:
function MyComponent() {
useEffect(() => {
loadDataOnlyOnce(); // this will fire on every change :(
}, [...???]);
return (...);
}
javascript
reactjs
react-hooks
Dávid Molnár
źródło
źródło
TL; DR
useEffect(yourCallback, [])
- wyzwoli oddzwonienie dopiero po pierwszym renderowaniu.Szczegółowe wyjaśnienie
useEffect
działa domyślnie po każdym renderowaniu komponentu (powodując w ten sposób efekt).Podczas składania
useEffect
w swoim komponencie mówisz React, że chcesz uruchomić wywołanie zwrotne jako efekt. React uruchomi efekt po renderowaniu i po wykonaniu aktualizacji DOM.Jeśli przekażesz tylko wywołanie zwrotne - wywołanie zwrotne będzie uruchamiane po każdym renderowaniu.
Jeśli przekaże drugi argument (tablicę), React uruchomi wywołanie zwrotne po pierwszym renderowaniu i za każdym razem, gdy zmieni się jeden z elementów tablicy. na przykład podczas umieszczania
useEffect(() => console.log('hello'), [someVar, someOtherVar])
- wywołanie zwrotne będzie uruchamiane po pierwszym renderowaniu i po każdym renderowaniu tegosomeVar
someOtherVar
został zmieniony lub zmieniony.Po przekazaniu drugiego argumentu pustej tablicy, React porówna po każdym renderowaniu tablicy i zobaczy, że nic się nie zmieniło, w ten sposób wywołując wywołanie zwrotne dopiero po pierwszym renderowaniu.
źródło
useMountEffect hook
Uruchamianie funkcji tylko raz po zamontowaniu komponentu jest tak powszechnym wzorcem, że uzasadnia swój własny haczyk, który ukrywa szczegóły implementacji.
Użyj go w dowolnym komponencie funkcjonalnym.
Informacje o haku useMountEffect
Podczas używania
useEffect
z drugim argumentem tablicy React uruchomi wywołanie zwrotne po zamontowaniu (początkowym renderowaniu) i po zmianie wartości w tablicy. Ponieważ mijamy pustą tablicę, będzie ona działać dopiero po zamontowaniu.źródło
useMount
gdy funkcja efektu potrzebuje czegoś z rekwizytów, ale nigdy nie musi działać ponownie, nawet jeśli ta wartość zmieni się bez ostrzeżenia o linijce:useEffect(()=>console.log(props.val),[])
będzie brakowało ostrzeżenia o zależności, aleuseMount(()=>console.log(props.val))
nie spowoduje ostrzeżenia, ale „zadziała”. Nie jestem jednak pewien, czy wystąpi problem z trybem współbieżnym.Przekaż pustą tablicę jako drugi argument do
useEffect
. To skutecznie mówi React, cytując dokumenty :Oto fragment, który możesz uruchomić, aby pokazać, że działa:
źródło
Lubię definiować
mount
funkcję, tak samo traktuje EsLintuseMount
i uważam, że jest to bardziej zrozumiałe.źródło
Sztuka polega na tym, że useEffect wymaga drugiego parametru.
Drugi parametr to tablica zmiennych, które komponent sprawdzi, aby upewnić się, że zmienił się przed ponownym renderowaniem. Możesz umieścić dowolne fragmenty rekwizytów i podać tutaj stan, który chcesz sprawdzić.
Lub nie wkładaj nic:
To zapewni, że useEffect działa tylko raz.
Uwaga z dokumentów:
Jeśli korzystasz z tej optymalizacji, upewnij się, że tablica zawiera wszystkie wartości z zakresu komponentu (takie jak rekwizyty i stan), które zmieniają się w czasie i są używane przez efekt. W przeciwnym razie kod będzie odwoływał się do nieaktualnych wartości z poprzednich renderowań.
źródło