Middle
Quelles sont les règles pour écrire des hooks dans React?
sobes.tech IA
Réponse de l'IA
- Appeler les hooks uniquement au niveau supérieur des composants fonctionnels ou à l'intérieur d'autres hooks personnalisés. Il est interdit d'appeler des hooks dans des boucles, des conditions ou des fonctions imbriquées.
- Appeler les hooks uniquement à l'intérieur des composants fonctionnels React. Il est interdit de les appeler dans des fonctions JavaScript normales ou dans des composants de classe.
- L'utilisation de
useCallbackpour la mémorisation des fonctions etuseMemopour la mémorisation des calculs aide à optimiser les performances. - Utiliser
useEffectpour les effets secondaires (chargement de données, abonnements, etc.), en spécifiant un tableau de dépendances pour contrôler l'exécution de l'effet. - Respecter l'ordre d'appel des hooks à chaque rendu du composant. React se fie à cet ordre pour lier correctement l'état et les effets.
- Utiliser des dépendances stables dans les tableaux de dépendances de
useEffect,useCallback,useMemo. Ne pas passer d'objets ou de fonctions créés à chaque rendu sans nécessité. - Créer des hooks personnalisés pour réutiliser la logique d'état entre les composants. Les noms des hooks personnalisés doivent commencer par
use.
// Exemple correct : appel des hooks au niveau supérieur
function MyComponent() {
const [count, setCount] = useState(0); // Au niveau supérieur
useEffect(() => { // Au niveau supérieur
document.title = `Vous avez cliqué ${count} fois`;
}, [count]); // Tableau de dépendances
const handleClick = useCallback(() => { // Au niveau supérieur
setCount(c => c + 1);
}, []); // Fonction mémoïsée
return (
<div>
<p>Vous avez cliqué {count} fois</p>
<button onClick={handleClick}>
Clique-moi
</button>
</div>
);
}
// Exemple incorrect : appel d'un hook dans une condition
// function MyComponentWithBadHook() {
// if (someCondition) {
// const [count, setCount] = useState(0); // INcorrect: appel dans une condition
// }
// // ...
// }
// Exemple incorrect : appel d'un hook dans une boucle
// function MyComponentWithAnotherBadHook() {
// for (let i = 0; i < 5; i++) {
// const [value, setValue] = useState(i); // INcorrect: appel dans une boucle
// }
// // ...
// }