📝 Exercices — R11 Performance React
10 exercices sur les techniques d'optimisation React.
React.memo + useCallback
Créez un composant Parent avec deux boutons (BoutonAction) enveloppés dans React.memo. Utilisez useCallback pour les handlers afin que les boutons ne se re-rendent pas quand un état non lié change.
useMemo — calcul coûteux
Créez FibCalculateur avec un slider pour N et un bouton "Re-render". Le calcul de Fibonacci doit utiliser useMemo pour n'être recalculé que quand N change — pas quand le bouton re-render est cliqué.
Code splitting — React.lazy + Suspense
Utilisez React.lazy(() => import('./Page')) pour charger des composants à la demande. Enveloppez-les dans <Suspense fallback={...}>. Le composant lazy n'est chargé qu'au moment où il est affiché.
Lazy loading d'images
Créez un composant LazyImage qui n'affiche l'image que quand elle entre dans le viewport, en utilisant IntersectionObserver. Alternative : utiliser l'attribut natif loading="lazy".
React.Profiler — mesurer les renders
Enveloppez un composant dans <Profiler id="..." onRender={callback}>. La fonction onRender reçoit id, phase, actualDuration, baseDuration. Logguez ces valeurs dans la console.
Styles inline stables
Démontrez le problème des styles inline (style={{ color: 'red' }} crée un nouvel objet à chaque render). Montrez la solution : définir le style hors du composant comme constante, ou utiliser useMemo si le style est dynamique.
Clés stables dans les listes
Créez une liste d'items avec des clés stables (id unique, pas l'index). Enveloppez chaque item dans React.memo. Testez l'ajout/suppression — seuls les items modifiés doivent se re-rendre.
Virtualisation de liste
Implémentez une liste virtualisée : pour 10 000 items, n'affichez que ceux visibles dans le viewport. Utilisez scrollTop, itemHeight et slice pour calculer quels items afficher.
Combinaison des optimisations
Créez une liste filtrée optimisée combinant : useReducer (état), useMemo (filtrage), useCallback (handlers), et React.memo (items). Toutes ces techniques ensemble.
Application complète optimisée
Créez une application qui combine toutes les techniques : React.memo, useMemo, useCallback, lazy/Suspense pour les composants lourds, et useReducer pour l'état complexe.