Edycja: Wraz z wprowadzeniem Hooks
można zaimplementować rodzaj zachowania w cyklu życia, a także stan w komponentach funkcjonalnych. Obecnie
Hooki to nowa propozycja funkcji, która pozwala używać stanu i innych funkcji Reacta bez pisania klasy. Zostały wydane w React jako część wersji 16.8.0
useEffect
hook może służyć do replikacji zachowania cyklu życia i useState
może służyć do przechowywania stanu w komponencie funkcji.
Podstawowa składnia:
useEffect(callbackFunction, [dependentProps]) => cleanupFunction
Możesz zaimplementować swój przypadek użycia w hookach, takich jak
const grid = (props) => {
console.log(props);
let {skuRules} = props;
useEffect(() => {
if(!props.fetched) {
props.fetchRules();
}
console.log('mount it!');
}, []); // passing an empty array as second argument triggers the callback in useEffect only after the initial render thus replicating `componentDidMount` lifecycle behaviour
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>
)
}
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 zachowanie componentWillUnmount
:
Np .: componentWillUnmount
useEffect(() => {
window.addEventListener('unhandledRejection', handler);
return () => {
window.removeEventListener('unhandledRejection', handler);
}
}, [])
Aby useEffect
uzależnić od określonych zdarzeń, możesz podać tablicę wartości do sprawdzenia zmian:
Np .: componentDidUpdate
componentDidUpdate(prevProps, prevState) {
const { counter } = this.props;
if (this.props.counter !== prevState.counter) {
// some action here
}
}
Odpowiednik haków
useEffect(() => {
// action here
}, [props.counter]); // checks for changes in the values in this array
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ź API Here
.
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.
class Grid extends React.Component {
constructor(props) {
super(props)
}
componentDidMount () {
if(!this.props.fetched) {
this.props.fetchRules();
}
console.log('mount it!');
}
render() {
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>
)
}
}
Komponenty funkcyjne są przydatne, gdy chcesz renderować tylko komponent bez potrzeby stosowania dodatkowej logiki.