← Web Dev
⚛️

React & Next.js

Intermédiaire
🧠Comprendre en lisant n'est pas savoir écrire.🧠Un module est fini quand tu peux le reproduire fenêtre fermée.🧠Écris le problème en français avant d'écrire du code.🧠Une question impossible cache trois questions faciles.🧠Retape le code à la main. Puis referme et réécris-le.🧠Essaie d'abord, cherche ensuite.🧠Cherche « comment on écrit ça », jamais « qu'est-ce que je dois faire ».🧠Pour comprendre du code, casse-le.⌨️Une fonction qui plante sur un cas limite n'est pas finie.⌨️Si un bloc a un nom clair, il mérite d'être une fonction.⌨️Savoir lire une erreur vaut plus que connaître dix méthodes.⌨️Diagnostiquer, c'est éliminer dans l'ordre — pas essayer au hasard.⌨️Une optimisation sans mesure avant/après est une croyance.🔍Regarde le fichier avant de le charger.🔍Une performance anormalement bonne est une hypothèse à réfuter.🔍Cette valeur existe-t-elle à l'instant où je dois prédire ?🔍fit sur le train, transform partout.🔍Un chiffre qu'on ne sait pas raconter est un chiffre qu'on n'a pas compris.🔍Un graphique sans question n'a rien à dire.🤖Un score d'entraînement parfait n'est jamais une bonne nouvelle.🤖Le jeu de test ne se regarde qu'une fois.🤖Plus tu essaies de configurations, plus ton meilleur score est optimiste.🤖Un seuil de décision est un arbitrage économique, pas un réglage technique.🤖Commence toujours par une baseline. Note son score.🤖Le meilleur modèle n'est pas le plus précis, c'est celui qu'on peut maintenir.🚀Un modèle en production n'est pas un livrable, c'est un système vivant.🚀Un secret publié est un secret compromis.🚀Pour chaque permission : que se passe-t-il si cette machine est compromise ?🚀Un post-mortem qui cherche un coupable ne produit aucune amélioration.🚀« Nous n'utilisons pas cette variable » n'est pas une garantie d'équité.🚀Rends l'arbitrage explicite et chiffré. Ne le tranche pas en silence.🚀Un résultat qu'on ne sait pas reproduire est une anecdote.

🎯 Objectifs d'apprentissage

À l'issue de ce module, tu seras capable de :

  • 01Construire une interface avec des composants React composables
  • 02Distinguer Server et Client Components et choisir le bon
  • 03Gérer l'état serveur et le cache correctement
  • 04Optimiser les Core Web Vitals d'une application Next.js

Prérequis

Modules JavaScript et TypeScript

React : composants, props et état

65 min

React décompose l'UI en composants réutilisables. Chaque composant = une fonction qui retourne du JSX.

Composant fonctionnel de base

// Un composant = une fonction qui retourne du JSX
function ModuleCard({ icon, title, description, level }) {
  return (
    <div className="card p-6 hover:border-accent/50 transition-colors">
      <span className="text-3xl">{icon}</span>
      <h3 className="font-bold text-white mt-2">{title}</h3>
      <p className="text-sm text-slate-400">{description}</p>
      <span className="text-xs text-emerald-400">{level}</span>
    </div>
  );
}

// Utilisation
<ModuleCard icon="🐍" title="Python" description="Les bases" level="Débutant" />

useState — état local

import { useState } from "react";

function QuizQuestion({ question, options, answer }) {
  const [selected, setSelected] = useState(null);
  const [showResult, setShowResult] = useState(false);

  return (
    <div>
      <p>{question}</p>
      {options.map((opt, i) => (
        <button
          key={i}
          onClick={() => setSelected(i)}
          className={selected === i ? "bg-accent" : "bg-ink-800"}
        >
          {opt}
        </button>
      ))}
      <button onClick={() => setShowResult(true)}>Valider</button>
      {showResult && (
        <p>{selected === answer ? "✅ Correct !" : "❌ Incorrect"}</p>
      )}
    </div>
  );
}

useEffect — effets de bord

import { useEffect, useState } from "react";

function Dashboard() {
  const [progress, setProgress] = useState(null);

  useEffect(() => {
    // Exécuté après le rendu
    const saved = JSON.parse(localStorage.getItem("progress") || "{}");
    setProgress(saved);
  }, []); // [] = exécuté une seule fois au montage

  if (!progress) return <p>Chargement...</p>;
  return <p>XP : {progress.xp}</p>;
}

Ressource : react.dev — https://react.dev (tutoriel officiel interactif)

✍️ Exercices de la leçon

2 exercices

Fais-les dans l'ordre, dans un vrai fichier .py — pas dans ta tête. Ne déplie la correction qu'après avoir écrit quelque chose, même faux.

🔧

Exercice AUn composant de quiz avec état

Application directe · Tu appliques ce que tu viens de lire.

Écris un composant QuestionQuiz qui reçoit en props une question, un tableau d'options et l'index de la bonne réponse.

  1. 1.au clic sur une option, elle se sélectionne visuellement
  2. 2.un bouton « Valider » révèle la bonne et la mauvaise réponse, et désactive les options
  3. 3.après validation, un message et un bouton « Suivante »
  4. 4.le bouton « Valider » est désactivé tant qu'aucune option n'est choisie
  5. 5.le composant se réinitialise correctement quand la question change

Le point 5 est celui qui piège tout le monde : passe à la question suivante et regarde si la sélection précédente reste affichée.

🎯

Exercice BLe composant qui ne se met pas à jour

Page blanche · Aucun squelette : à toi de choisir la méthode.

Page blanche. Diagnostic.

Ce composant ne réaffiche rien quand on ajoute une tâche. Le tableau est bien modifié — on le voit dans un console.log — mais l'écran ne bouge pas.

function ListeTaches() {
  const [taches, setTaches] = useState([{ id: 1, texte: "Faire les exercices", faite: false }]);

  const ajouter = (texte) => {
    taches.push({ id: Date.now(), texte, faite: false });
    setTaches(taches);
    console.log(taches);          // le tableau contient bien la nouvelle tâche
  };

  const basculer = (id) => {
    const t = taches.find((x) => x.id === id);
    t.faite = !t.faite;
    setTaches(taches);
  };

  return <ul>{taches.map((t) => <li key={t.id}>{t.texte}</li>)}</ul>;
}
  1. 1.explique précisément pourquoi React ne réaffiche pas
  2. 2.corrige les deux fonctions
  3. 3.explique ce que React compare exactement pour décider de réafficher
  4. 4.donne la règle générale, applicable aussi aux objets et aux objets imbriqués
  5. 5.montre le même bug appliqué à un objet plutôt qu'à un tableau

Le `console.log` qui montre la bonne valeur est ce qui rend le bug si déroutant. La donnée est correcte, l'affichage non.

🤖

Question sur cette leçon ? Clique sur 💬 Demander au tuteur en bas à droite.