Edit: Avec l'introduction de, Hooks
il est possible d'implémenter un type de comportement de cycle de vie ainsi que l'état dans les composants fonctionnels. Actuellement
Les hooks sont une nouvelle proposition de fonctionnalité qui vous permet d'utiliser l'état et d'autres fonctionnalités React sans écrire de classe. Ils sont publiés dans React dans le cadre de la v16.8.0
useEffect
hook peut être utilisé pour répliquer le comportement du cycle de vie et useState
peut être utilisé pour stocker l'état dans un composant de fonction.
Syntaxe de base:
useEffect(callbackFunction, [dependentProps]) => cleanupFunction
Vous pouvez implémenter votre cas d'utilisation dans des crochets comme
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
peut également renvoyer une fonction qui sera exécutée lorsque le composant sera démonté. Cela peut être utilisé pour se désabonner des écouteurs, reproduisant le comportement de componentWillUnmount
:
Par exemple: componentWillUnmount
useEffect(() => {
window.addEventListener('unhandledRejection', handler);
return () => {
window.removeEventListener('unhandledRejection', handler);
}
}, [])
Pour rendre useEffect
conditionnel à des événements spécifiques, vous pouvez lui fournir un tableau de valeurs pour vérifier les modifications:
Par exemple: componentDidUpdate
componentDidUpdate(prevProps, prevState) {
const { counter } = this.props;
if (this.props.counter !== prevState.counter) {
// some action here
}
}
Crochets équivalents
useEffect(() => {
// action here
}, [props.counter]); // checks for changes in the values in this array
Si vous incluez ce tableau, assurez-vous d'inclure toutes les valeurs de la portée du composant qui changent au fil du temps (accessoires, état), sinon vous risquez de finir par référencer les valeurs des rendus précédents.
Il y a quelques subtilités à utiliser useEffect
; consultez l'API Here
.
Avant la v16.7.0
La propriété des composants de fonction est qu'ils n'ont pas accès aux fonctions de cycle de vie Reacts ou au this
mot - clé. Vous devez étendre la React.Component
classe si vous souhaitez utiliser la fonction de cycle de vie.
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>
)
}
}
Les composants de fonction sont utiles lorsque vous souhaitez uniquement rendre votre composant sans avoir besoin de logique supplémentaire.