Zamiast pisać moje komponenty wewnątrz klasy, chciałbym zamiast tego użyć składni funkcji.
Jak mogę nadpisać componentDidMount
, componentWillMount
wewnątrz elementów funkcyjnych?
Czy to w ogóle możliwe?
const grid = (props) => {
console.log(props);
let {skuRules} = props;
const componentDidMount = () => {
if(!props.fetched) {
props.fetchRules();
}
console.log('mount it!');
};
return(
<Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
<Box title="Sku Promotion">
<ActionButtons buttons={actionButtons} />
<SkuRuleGrid
data={skuRules.payload}
fetch={props.fetchSkuRules}
/>
</Box>
</Content>
)
}
Odpowiedzi:
Edycja: Wraz z wprowadzeniem
Hooks
można zaimplementować rodzaj zachowania w cyklu życia, a także stan w komponentach funkcjonalnych. ObecnieuseEffect
hook może służyć do replikacji zachowania cyklu życia iuseState
może służyć do przechowywania stanu w komponencie funkcji.Podstawowa składnia:
Możesz zaimplementować swój przypadek użycia w hookach, takich jak
useEffect
może również zwrócić funkcję, która zostanie uruchomiona, gdy komponent zostanie odmontowany. Można to wykorzystać do wypisania się z subskrypcji słuchaczy, replikując zachowaniecomponentWillUnmount
:Np .: componentWillUnmount
Aby
useEffect
uzależnić od określonych zdarzeń, możesz podać tablicę wartości do sprawdzenia zmian:Np .: componentDidUpdate
Odpowiednik haków
Jeśli włączysz tę tablicę, pamiętaj, aby uwzględnić wszystkie wartości z zakresu komponentu, które zmieniają się w czasie (właściwości, stan), w przeciwnym razie możesz odwołać się do wartości z poprzednich renderów.
Istnieją pewne subtelności w używaniu
useEffect
; sprawdź APIHere
.Przed wersją 16.7.0
Właściwością komponentów funkcji jest to, że nie mają dostępu do funkcji cyklu życia Reacts ani
this
słowa kluczowego. Musisz przedłużyćReact.Component
klasę, jeśli chcesz korzystać z funkcji cyklu życia.Komponenty funkcyjne są przydatne, gdy chcesz renderować tylko komponent bez potrzeby stosowania dodatkowej logiki.
źródło
useEffect(() => { // action here }, [props.counter])
jest uruchamiany przy pierwszym renderowaniu, podczas gdy składnik componentDidUpdate nie.passing an empty array as second argument triggers the callback in useEffect only after the initial render
brzmi to jak brudny, hakerski sposób na budowanie rzeczy: / miejmy nadzieję, że zespół reagujący wymyśli coś lepszego w przyszłych wydaniach.Możesz użyć cyklu życia w czystej postaci, aby dodać funkcje cyklu życia do komponentów funkcjonalnych.
Przykład:
źródło
Grid
? Nie widzę tego w żadnym miejscu we fragmencie kodu? Jeśli i ty chciałbyś użyć do tego reduxu, czy ujdzie ci to na suchoexport default lifecycle(methods)(connect({},{})(ComponentName))
?Rozwiązanie pierwsze: Możesz użyć nowego interfejsu API React HOOKS . Obecnie w React v16.8.0
Hooki pozwalają ci używać więcej funkcji Reacta bez klas. Hooki zapewniają bardziej bezpośrednie API dla koncepcji Reacta, które już znasz: właściwości, stanu, kontekstu, odnośników i cyklu życia . Hooki rozwiązują wszystkie problemy rozwiązane przez Recompose.
Uwaga od autora
recompose
(acdlite, 25 października 2018):Rozwiązanie drugie:
Jeśli używasz wersji
recompose
React , która nie obsługuje haków, nie martw się, zamiast tego użyj (Pas narzędziowy React dla komponentów funkcyjnych i komponentów wyższego rzędu). Możesz użyćrecompose
do dołączenialifecycle hooks, state, handlers etc
do komponentu funkcji.Oto komponent bez renderowania, który dołącza metody cyklu życia za pośrednictwem HOC cyklu życia (z rekompozycji).
źródło
Możesz tworzyć własne metody cyklu życia.
Funkcje użytkowe
Stosowanie
źródło
Zgodnie z dokumentacją:
zobacz dokumentację React
źródło
Jeśli potrzebujesz użyć React LifeCycle, musisz użyć Class.
Próba:
źródło
Możesz skorzystać z modułu create-react-class. Oficjalna dokumentacja
Oczywiście musisz go najpierw zainstalować
Oto działający przykład
źródło
jeśli używasz reakcji 16.8, możesz użyć hooków reakcji ... Haczyki reakcji to funkcje, które pozwalają na „podpięcie się” do stanu reakcji i funkcji cyklu życia z komponentów funkcji ... docs
źródło