En termes techniques, le hook useCallback
est un moyen par lequel ReactJS mémorise la version d'une fonction définie et maintient la même instance de cette fonction dans différents cycles de rendu de l'application.
useCallback
En comparaison avec les fonctions traditionnelles qui sont re-créées à chaque rendu, useCallback
mémorise une instance de la fonction et la réutilise si le tableau de dépendances ne change pas entre les rendus. Pour comprendre cela, prenons un exemple :
import React, { useState, useCallback } from 'react';
function MonComposant() {
const [compteur, setCompteur] = useState(0);
// Sans useCallback
const incrementer = () => setCompteur(c => c + 1);
// Avec useCallback
const incrementerMemo = useCallback(
() => setCompteur(c => c + 1),
[],
);
return (
<button onClick={incrementerMemo}>Cliquez moi</button>
);
}
Dans cet exemple, incrementer
sera re-créé à chaque rendu. Cependant, incrementerMemo
sera mémorisé et le même sera utilisé pour tous les rendus suivants sauf si les dépendances changent.
useCallback
L'utilisation de useCallback
est particulièrement bénéfique lorsqu'on passe des fonctions callback à des composants enfant optimisés. Sans useCallback
, si le composant parent se rend à nouveau, une nouvelle fonction est passée au composant enfant, le forçant à se rendre à nouveau même si les props n'ont pas changé. Avec useCallback
, une même instance de la fonction est passée, empêchant les rendus inutiles et améliorant les performances de l'application.
Il est à noter que l'utilisation de useCallback
n'est pas toujours nécessaire. En fait, l'utilisation excessive de useCallback
peut même nuire aux performances car le processus de mémorisation lui-même coûte en temps de calcul. Il est donc recommandé de n'utiliser useCallback
que lorsque vous remarquez des problèmes de performances ou dans des scénarios spécifiques où des fonctions callback sont transmises à des composants enfant qui sont optimisés pour éviter les rendus inutiles.
En résumé, le hook useCallback
de React est utilisé pour mémoriser une instance de fonction entre les rendus, permettant d'améliorer les performances lorsque les fonctions callback sont passées à des composants enfants optimisés. Cependant, il doit être utilisé judicieusement pour éviter une surcharge en matière de performances.