Ce TP a pour objectif de mettre en pratique l'utilisation des Hooks React (useState, useEffect, useContext) ainsi que la création de Hooks personnalisés.
- Cloner le dépôt :
git clone https://github.com/pr-daaif/tp-react-hooks.git
cd tp-react-hooks- Créer votre propre dépôt sur Github et changer le remote :
# Supprimer le remote origine
git remote remove origin
# Ajouter votre nouveau remote
git remote add origin https://github.com/[votre-username]/tp-react-hooks.git
# Premier push
git push -u origin main- Installer les dépendances :
npm install- Lancer l'application :
npm startPour chaque exercice :
- Lisez attentivement l'énoncé
- Implémentez la solution
- Testez votre implémentation (pensez à faire des copies d'écran)
- Mettez à jour la section correspondante dans ce README avec :
- Une brève explication de votre solution
- Des captures d'écran montrant le fonctionnement
- Les difficultés rencontrées et comment vous les avez résolues
- Commitez vos changements avec un message descriptif
Votre réponse pour l'exercice 1 :
Pour implémenter la recherche en temps réel avec debounce :
- J'ai utilisé useState pour gérer l'état de la recherche
- J'ai créé un hook personnalisé useDebounce pour optimiser les performances
- J'ai implémenté useEffect pour déclencher la recherche uniquement après le debounce
// Exemple de code pour ProductSearch
const [searchTerm, setSearchTerm] = useState('');
const debouncedSearch = useDebounce(searchTerm, 300);
useEffect(() => {
// Effectuer la recherche
searchProducts(debouncedSearch);
}, [debouncedSearch]);[Screenshot de la recherche en action]
Votre réponse pour l'exercice 2 :
Pour gérer l'internationalisation :
- Création du LanguageContext avec React.createContext
- Implémentation du LanguageProvider avec les traductions
- Utilisation du hook useContext pour accéder aux traductions
// Exemple de LanguageContext
const LanguageContext = React.createContext({
language: 'fr',
setLanguage: () => {},
translations: {}
});[Screenshot du sélecteur de langue]
Votre réponse pour l'exercice 3 :
Création de deux hooks personnalisés :
- useDebounce :
const useDebounce = (value, delay) => {
const [debouncedValue, setDebouncedValue] = useState(value);
useEffect(() => {
const timer = setTimeout(() => setDebouncedValue(value), delay);
return () => clearTimeout(timer);
}, [value, delay]);
return debouncedValue;
};- useLocalStorage :
const useLocalStorage = (key, initialValue) => {
const [storedValue, setStoredValue] = useState(() => {
try {
const item = window.localStorage.getItem(key);
return item ? JSON.parse(item) : initialValue;
} catch (error) {
return initialValue;
}
});
return [storedValue, setStoredValue];
};[Screenshot démontrant l'utilisation des hooks]
Votre réponse pour l'exercice 4 :
Pour la gestion de la pagination et du chargement asynchrone :
- Implémentation d'un état de chargement
- Gestion de la pagination avec useState
- Utilisation de useEffect pour charger les données
const [loading, setLoading] = useState(false);
const [page, setPage] = useState(1);
const [products, setProducts] = useState([]);
useEffect(() => {
const loadProducts = async () => {
setLoading(true);
try {
const data = await fetchProducts(page);
setProducts(prev => [...prev, ...data]);
} finally {
setLoading(false);
}
};
loadProducts();
}, [page]);[Screenshot de la pagination en action]
- Ajoutez l'URL de votre dépôt Github dans Classroom et envoyer la réponse dès le démarage de votre projet.
- Les push doivent se faire au fûr et à mesure que vous avancez dans votre projet.
- Le README.md doit être à jour avec vos réponses et captures d'écran.
- Chaques exercice doit faire l'objet d'au moins un commit avec un message mentionnant le numéro de l'exercice.