);
}
```
## Règles pour les Custom Hooks
1. **Nom commence par `use`** : obligatoire pour que React applique les règles des hooks
2. **Peut appeler d'autres hooks** : useState, useEffect, useCallback, autres custom hooks
3. **Retourne ce dont le composant a besoin** : valeurs, fonctions, objets
4. **Chaque appel est indépendant** : deux composants utilisant le même hook ont des états séparés
## Organisation des fichiers
```
src/
hooks/
useLocalStorage.js
useFetch.js
useDebounce.js
useToggle.js
useForm.js
index.js // export tous les hooks
```
```javascript
// hooks/index.js
export { useLocalStorage } from './useLocalStorage';
export { useFetch } from './useFetch';
export { useDebounce } from './useDebounce';
export { useToggle } from './useToggle';
export { useForm } from './useForm';
```
## Exercices
### Exercice 1 : useWindowSize
Créer un hook qui retourne les dimensions de la fenêtre et se met à jour au redimensionnement.
**Solution :**
```javascript
function useWindowSize() {
const [size, setSize] = useState({
width: window.innerWidth,
height: window.innerHeight
});
useEffect(() => {
const handleResize = () => {
setSize({
width: window.innerWidth,
height: window.innerHeight
});
};
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}, []);
return size;
}
// Utilisation
function ResponsiveComponent() {
const { width, height } = useWindowSize();
return (
Fenêtre : {width} x {height}
{width < 768 &&
Mode mobile
}
);
}
```
### Exercice 2 : usePrevious
Créer un hook qui retourne la valeur précédente d'une variable.
**Solution :**
```javascript
function usePrevious(value) {
const ref = useRef();
useEffect(() => {
ref.current = value;
}, [value]);
return ref.current;
}
// Utilisation
function Counter() {
const [count, setCount] = useState(0);
const previousCount = usePrevious(count);
return (
Actuel : {count}
Précédent : {previousCount}
);
}
```
## Points clés à retenir
1. **Custom hook = fonction commençant par `use`**
2. **Encapsule la logique réutilisable** entre composants
3. **Chaque appel a son propre état** indépendant
4. **Peut appeler d'autres hooks** (useState, useEffect, etc.)
5. **Simplifie les composants** en extrayant la logique
[[:15_training:module4-react-avance:usecallback-usememo|← Chapitre précédent]] | [[:15_training:module4-react-avance:start|Retour au module]] | [[:15_training:module4-react-avance:redux|Chapitre suivant : Redux →]]