Un chronomètre avec useEffect
Mesurer la durée de la partie avec un hook personnalisé, et ne jamais laisser une minuterie tourner dans le vide.
Objectifs de la séance
- comprendre ce qu'est un effet et quand
useEffects'exécute ; - utiliser le tableau de dépendances ;
- écrire la fonction de nettoyage (
clearInterval) pour ne jamais laisser une minuterie active ; - éviter la valeur périmée grâce à la mise à jour fonctionnelle ;
- créer un hook personnalisé
useChronometreet une fonction pureformaterDuree.
Petite vérification
Avant de commencer, vérifiez si vous savez...
- exécuter
npm testet lire le nombre de tests réussis - citer les trois statuts possibles d'une partie dans
partieReducer.ts - citer la fonction de l'écran
src/app/index.tsxdans laquelle le hasard est utilisé pour recommencer une partie
📌 Réponse attendue
TP pour réfléchir et résoudre des problèmes
Votre mission : afficher, dans le badge de la partie, le temps écoulé (« 00:42 »), l'arrêter à la fin du quiz et l'afficher sur l'écran de résultat.
Étape 1 — Mettre le temps en forme
Créez src/logic/duree.ts. La fonction formaterDuree transforme un nombre de secondes en texte
« mm:ss » (par exemple 75 secondes donne 01:15).
Remarquez la première ligne de la fonction : une valeur invalide (négative, NaN...) est ramenée à 0
pour que l'écran n'affiche jamais « NaN:NaN ».
Une fonction qui met en forme une valeur doit accepter n'importe quelle entrée sans planter. Un chronomètre qui afficherait « NaN:NaN » ferait mauvaise impression, et le bug est évitable en une ligne.
Étape 2 — Tester la mise en forme
Créez tests/duree.test.ts.
Lancez npm test : tests 29 et pass 29.
Le fichier de test contient 0, 5, 75 et 600 secondes, mais aussi une valeur négative et NaN. Les cas
limites sont ceux où les bugs se cachent.
Étape 3 — Créer le hook : l'état du chronomètre
Créez le dossier src/hooks/ et le fichier useChronometre.ts. Un hook personnalisé est une fonction dont le
nom commence par use et qui appelle d'autres hooks. Le chronomètre mémorise d'abord un nombre de secondes.
Le paramètre enCours indique si le chronomètre doit tourner (true) ou être arrêté (false).
Le chronomètre n'a rien à voir avec les questions : le mettre dans un hook dédié allège l'écran et permet de
le réutiliser. L'écran n'a plus qu'à écrire useChronometre(...).