React
Junior
Quiz-React-Junior
React-Hooks
Usestate
Useeffect
Usecontext
Useref
Custom-Hooks
Context-Api
React-Router
Questions-Entretien-React-Junior
Qcm-React-Junior
Front-End
📝
Entretien React Junior : Hooks, Context et Router
20 questions React niveau junior : useState, useEffect, useContext, useRef, custom hooks, Context API et React Router. Pour réussir un entretien React junior.
Banque de révision : les 20 questions corrigées
Voici l'intégralité des 20 questions de « Entretien React Junior : Hooks, Context et Router », chacune avec sa bonne réponse et son explication. Le quiz interactif ci-dessus en tire une sélection aléatoire à chaque tentative — utilisez cette liste complète pour réviser.
Explication :
useCallback retourne une version mémorisée de la fonction qui ne change que si ses dépendances changent. Utile pour éviter des rendus inutiles des composants enfants qui reçoivent cette fonction en prop (avec React.memo).
À utiliser avec parcimonie : réservez useCallback pour les fonctions passées à des composants enfants optimisés avec React.memo.
Explication :
L'API Context de React (
createContext, Provider, useContext) permet de partager des données globalement sans passer manuellement les props à chaque niveau (évite le prop drilling).
Pour des mises à jour fréquentes, Context peut causer des re-rendus non souhaités. Combinez-le avec useReducer ou utilisez une solution comme Zustand pour de meilleures performances.
Explication :
useMemo mémorise le résultat d'une fonction (une valeur). useCallback mémorise la fonction elle-même. useCallback(fn, deps) équivaut à useMemo(() => fn, deps).
Pensez "Memo = Memory value" et "Callback = Callback function".
Explication :
React.memo est un HOC (Higher-Order Component) qui enveloppe un composant et ne le re-rend que si ses props ont changé. Il effectue une comparaison superficielle (shallow) des props.
Pour les props complexes (objets, tableaux), passez une fonction de comparaison personnalisée en 2e argument de React.memo.
Explication :
useReducer(reducer, initialState) est utile quand la logique d'état est complexe (multiples sous-valeurs) ou dépend de l'état précédent. Le reducer est une fonction (state, action) => newState.
useReducer + useContext forment une alternative légère à Redux pour la gestion d'état global.
Explication :
useRef retourne un objet mutable { current: valeur } qui persiste pendant toute la durée de vie du composant. Cas d'usage : accès au DOM (ref={inputRef}), stockage de timers/IDs, mémorisation de la valeur précédente.
Modifier
ref.current ne déclenche pas de re-rendu, contrairement à setState.
Explication :
Le pattern Render Props consiste à passer une fonction en prop à un composant, qui appelle cette fonction pour savoir quoi afficher. Cela permet de partager du code entre composants.
<Composant render={(data) => <Affichage data={data} />} />.
Ce pattern est devenu moins courant avec l'arrivée des hooks, mais il reste utile dans certains cas de bibliothèques.
Explication :
Le state local est interne à un composant (useState, useReducer). Le state global est accessible par plusieurs composants, souvent via Context API, Redux, Zustand, etc. Le choix dépend de la portée des données.
Commencez toujours par du state local, n'élevez l'état que lorsque plusieurs composants en ont besoin.
Explication :
La virtualisation ne rend que les éléments visibles dans le viewport, ce qui réduit considérablement le nombre de nœuds DOM. Des bibliothèques comme
react-window ou react-virtuoso implémentent cette technique.
Combinez la virtualisation avec React.memo sur les éléments de la liste pour une performance optimale.
Explication :
Pour éviter les fuites mémoire ou les mises à jour sur un composant démonté, on utilise soit une variable booléenne
let cancelled = false que l'on vérifie avant setState, soit AbortController pour annuler la requête HTTP.
Avec AbortController :
useEffect(() => { const controller = new AbortController(); fetch(url, { signal: controller.signal }); return () => controller.abort() }, []).
Explication :
React.lazy() permet d'importer dynamiquement un composant (code splitting). Il doit être wrappé dans un composant <Suspense> qui affiche un fallback pendant le chargement.
Le lazy loading est particulièrement efficace sur les routes d'une SPA : chaque page est chargée uniquement quand l'utilisateur y navigue.
Explication :
Un reducer est une fonction pure
(state, action) => newState. Il décrit comment l'état évolue en réponse à des actions. Il ne doit pas modifier l'état existant mais retourner un nouvel objet (immutabilité).
C'est le même principe que Redux ou Array.prototype.reduce() : chaque action "réduit" l'état actuel vers un nouvel état.
Explication :
Une "stale closure" se produit quand un useEffect capture une valeur obsolète. La règle est d'inclure toutes les variables utilisées dans l'effet dans le tableau de dépendances. Le plugin ESLint
react-hooks/exhaustive-deps aide à les détecter.
Pour accéder à la dernière valeur sans dépendance, utilisez
useRef : const latestValue = useRef(value); latestValue.current = value.
Explication :
Le prop drilling consiste à passer des props à travers des composants intermédiaires qui n'en ont pas besoin, juste pour les transmettre plus bas. Solutions : Context API, Redux, Zustand, ou restructuration des composants (composition).
Avant d'utiliser Context, demandez-vous si la composition (faire passer les enfants directement) ne résout pas le problème plus simplement.
Explication :
Pour des formulaires complexes avec validation, React Hook Form (performant, léger) ou Formik (plus ancien, complet) simplifient la gestion : état, validation, erreurs, soumission. React Hook Form utilise des refs pour de meilleures performances.
React Hook Form s'intègre bien avec Zod ou Yup pour la validation de schémas.
Explication :
Un HOC est une fonction
(Composant) => NouveauComposant. Il encapsule un composant pour lui ajouter des fonctionnalités (authentification, logging, données). Exemple typique : withAuth(MonComposant).
Avec l'arrivée des hooks, de nombreux cas d'usage des HOC sont remplacés par des hooks personnalisés, plus simples et évitant l'imbrication excessive.
Explication :
Avec les hooks : un
useEffect avec [] s'exécute au montage (didMount), avec dépendances au montage et mise à jour (didUpdate), et sa fonction de retour (cleanup) au démontage (willUnmount) ou avant la prochaine exécution.
Un même useEffect peut gérer plusieurs phases : pensez à la cleanup pour les souscriptions et timers.
Explication :
Un hook personnalisé est une fonction qui extrait de la logique réutilisable et utilise des hooks React internes (useState, useEffect...). Par convention, son nom commence par
use (ex: useFetch, useLocalStorage).
Les hooks personnalisés permettent de partager de la logique avec état, pas de l'UI. Pour le partage d'UI, utilisez des composants.
Explication :
Le "lifting state up" consiste à déplacer l'état partagé dans le composant parent commun le plus proche. Le parent passe les données via props et les callbacks de mise à jour via props également.
C'est la solution avant de recourir à Context ou Redux. Ne remontez que ce qui est nécessaire.
Explication :
Le
<React.StrictMode> est un wrapper de développement qui double intentionnellement certains rendus et effets pour mettre en évidence des problèmes potentiels (effets sans cleanup, code non idempotent). Il ne fait rien en production.
Ne vous inquiétez pas si votre console.log s'exécute deux fois en dev : c'est Strict Mode qui vérifie la pureté de vos composants.