Modifica: con l'introduzione di Hooks
è possibile implementare un tipo di comportamento del ciclo di vita così come lo stato nei componenti funzionali. Attualmente
Gli hook sono una nuova proposta di funzionalità che ti consente di utilizzare state e altre funzionalità di React senza scrivere una classe. Sono rilasciati in React come parte della v16.8.0
useEffect
hook può essere utilizzato per replicare il comportamento del ciclo di vita e useState
può essere utilizzato per memorizzare lo stato in un componente funzione.
Sintassi di base:
useEffect(callbackFunction, [dependentProps]) => cleanupFunction
Puoi implementare il tuo caso d'uso in hook come
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
può anche restituire una funzione che verrà eseguita quando il componente viene smontato. Questo può essere utilizzato per annullare l'iscrizione agli ascoltatori, replicando il comportamento dicomponentWillUnmount
:
Ad esempio: componentWillUnmount
useEffect(() => {
window.addEventListener('unhandledRejection', handler);
return () => {
window.removeEventListener('unhandledRejection', handler);
}
}, [])
Per rendere useEffect
condizionale a eventi specifici, puoi fornire un array di valori per verificare le modifiche:
Ad esempio: componentDidUpdate
componentDidUpdate(prevProps, prevState) {
const { counter } = this.props;
if (this.props.counter !== prevState.counter) {
// some action here
}
}
Equivalente di ganci
useEffect(() => {
// action here
}, [props.counter]); // checks for changes in the values in this array
Se includi questo array, assicurati di includere tutti i valori dell'ambito del componente che cambiano nel tempo (props, state), altrimenti potresti finire per fare riferimento a valori di rendering precedenti.
Ci sono alcune sottigliezze nell'utilizzo useEffect
; controlla l'API Here
.
Prima della v16.7.0
La proprietà dei componenti funzione è che non hanno accesso alle funzioni del ciclo di vita di Reacts o alla this
parola chiave. È necessario estendere la React.Component
classe se si desidera utilizzare la funzione del ciclo di vita.
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>
)
}
}
I componenti funzione sono utili quando si desidera eseguire il rendering del componente senza la necessità di logica aggiuntiva.