React

Cette fiche rassemble les notions essentielles de React, organisées par thÚmes.
Elle couvre les bases (JSX, composants, state/props), les principaux hooks, les bonnes pratiques d’architecture, l’écosystĂšme courant (React Router, gestion d’état, requĂȘtes API), ainsi que des techniques d’optimisation.

🚀 Bases

  • JSX : C’est une syntaxe proche du HTML qui est transformĂ©e en React.createElement() par Babel.
    Exemple : <h1>Hello</h1> devient React.createElement("h1", null, "Hello").

  • Composants : On peut crĂ©er des composants soit en fonction (modernes) soit en classe (anciens).
    Exemple fonction : function Button() { return <button>OK</button>; }.

  • Props / State : Les props sont passĂ©es depuis le parent, le state est interne au composant (via useState).
    Exemple : <User name="Alice" /> (prop) et const [count, setCount] = useState(0) (state).

  • Rendu conditionnel : On affiche diffĂ©remment selon une condition avec ? : ou &&.
    Exemple : {isLoggedIn ? <p>Bienvenue</p> : <p>Connectez-vous</p>}.

  • Listes et keys : Chaque Ă©lĂ©ment d’une liste doit avoir une key unique et stable pour aider React au rendu.
    Exemple : {users.map(u => <li key={u.id}>{u.name}</li>)}.


🎣 Hooks principaux

  • useState : Sert Ă  gĂ©rer un Ă©tat local qui dĂ©clenche un re-render quand il change.
    Exemple : const [count, setCount] = useState(0);.

  • useEffect : Permet de gĂ©rer des effets de bord (API, timers), avec dĂ©pendances et nettoyage.
    Exemple :

  useEffect(() => {
    const timer = setInterval(() => console.log("tick"), 1000);
    return () => clearInterval(timer);
  }, []);
  • useRef : Stocke une valeur persistante sans re-render et donne accĂšs au DOM.
    Exemple : const inputRef = useRef(); <input ref={inputRef} />.

  • useContext : Sert Ă  partager un Ă©tat global sans props drilling.
    Exemple :

  const ThemeContext = createContext("light");
  const App = () => <ThemeContext.Provider value="dark"><Child /></ThemeContext.Provider>;
  • useReducer : Alternative Ă  useState pour un Ă©tat complexe.
    Exemple : const [state, dispatch] = useReducer(reducer, initialState);.
  • useMemo : MĂ©morise un calcul coĂ»teux.
    Exemple : const value = useMemo(() => expensiveCalc(data), [data]);.
  • useCallback : MĂ©morise une fonction pour Ă©viter de la recrĂ©er.
    Exemple : const handleClick = useCallback(() => doSomething(), []);.

📐 Organisation & bonnes pratiques

  • Lifting state up : Remonter l’état dans le parent pour le partager entre enfants.
    Exemple : un App gĂšre count et le passe Ă  deux composants enfants.

  • Composants contrĂŽlĂ©s vs non contrĂŽlĂ©s : Les contrĂŽlĂ©s utilisent value + onChange, les non contrĂŽlĂ©s s’appuient sur le DOM (ref).
    Exemple contrÎlé : <input value={text} onChange={e => setText(e.target.value)} />.

  • Éviter le props drilling : Utiliser Context, Redux ou Zustand pour passer des donnĂ©es globales.
    Exemple : partager un thĂšme avec useContext au lieu de propager via 10 composants.

  • DĂ©couper les composants : Favorise la rĂ©utilisabilitĂ© et la lisibilitĂ©.
    Exemple : au lieu d’un Ă©norme formulaire, crĂ©er <InputField />, <SubmitButton />, etc.


🌍 Écosystùme React

  • React Router : Sert Ă  gĂ©rer la navigation entre pages.
    Exemple : <Route path="/about" element={<About />} />.

  • Redux / Zustand / Recoil : GĂšrent des Ă©tats complexes et partagĂ©s Ă  grande Ă©chelle.
    Exemple Redux : dispatch({ type: "ADD_TODO", payload: todo }).

  • Fetch API, Axios, React Query : Pour rĂ©cupĂ©rer et gĂ©rer les donnĂ©es distantes.
    Exemple : useEffect(() => { fetch("/api").then(r => r.json()).then(setData); }, []);.


⚡ Performance & optimisation

  • Virtual DOM et rĂ©conciliation : React compare deux arbres virtuels pour n’actualiser que les changements.
    Exemple : si un seul <li> change, React ne réaffiche pas toute la liste.

  • React.memo : EmpĂȘche un re-render si les props n’ont pas changĂ©.
    Exemple : export default React.memo(MyComponent);.

  • useMemo / useCallback : Optimisent les calculs et fonctions Ă©vitant leur recrĂ©ation inutile.
    Exemple : const sorted = useMemo(() => data.sort(), [data]);.

  • Lazy loading : Charger un composant uniquement quand nĂ©cessaire avec React.lazy + Suspense.
    Exemple :

  const About = React.lazy(() => import("./About"));
  <Suspense fallback={<p>Loading...</p>}><About /></Suspense>

❓ Questions classiques

  • 👉 DiffĂ©rence entre state et props ?
    Props = données externes immuables, State = données internes modifiables.

  • 👉 Comment fonctionne le Virtual DOM ?
    C’est une copie en mĂ©moire du DOM rĂ©el, comparĂ©e Ă  chaque rendu pour appliquer uniquement les changements nĂ©cessaires.

  • 👉 À quoi sert useEffect et comment Ă©viter les boucles infinies ?
    Il gÚre les effets de bord ; on évite les boucles en mettant correctement le tableau de dépendances.

  • 👉 DiffĂ©rence composant contrĂŽlĂ© / non contrĂŽlĂ© ?
    ContrÎlé = React gÚre la valeur (value), Non contrÎlé = le DOM gÚre la valeur (ref).

  • 👉 Comment optimiser les performances React ?
    Avec React.memo, useMemo, useCallback, lazy loading, et éviter les re-rendus inutiles.

  • 👉 Qu’est-ce que le lifting state up ?
    Partager un état entre plusieurs composants en le remontant au parent commun.

  • 👉 Avantages/inconvĂ©nients Redux vs Context ?
    Redux : puissant pour de gros projets (middlewares, devtools) mais plus complexe ; Context : simple pour des cas légers mais moins adapté aux gros états.