11 — Lifting State Up

🔍 Le problème

Quand deux composants frères (siblings) doivent partager le même état, où placer le state ?

// ❌ Chaque enfant a son propre state — pas synchronisé
function Parent() {
    return (
        <>
            <EnfantA />   {/* son propre state */}
            <EnfantB />   {/* un autre state indépendant */}
        </>
    );
}

// ✅ Le state est "remonté" dans le parent
function Parent() {
    const [valeur, setValeur] = useState('');
    return (
        <>
            <EnfantA valeur={valeur} onChange={setValeur} />
            <EnfantB valeur={valeur} />
        </>
    );
}

📐 Le principe

Lifting State Up = remonter l'état au plus proche ancêtre commun des composants qui en ont besoin.

  1. Le parent détient le state.
  2. Il passe la valeur comme prop à ceux qui l'affichent.
  3. Il passe la fonction de mise à jour comme prop à ceux qui la modifient.
     Parent (détient le state)
     /          \
  EnfantA       EnfantB
  (modifie)     (lit)
  
  Props ↓       Props ↓
  onChange()    valeur

🔄 Le flux de données

// 1. Le parent détient le state
function Parent() {
    const [temperature, setTemperature] = useState(20);

    return (
        <>
            {/* 2. Passe un callback pour modifier */}
            <ControleTemp 
                temp={temperature} 
                onTempChange={setTemperature} 
            />
            
            {/* 3. L'autre enfant reçoit la valeur en lecture */}
            <AffichageTemp temp={temperature} />
        </>
    );
}

// L'enfant qui modifie
function ControleTemp({ temp, onTempChange }) {
    return (
        <input 
            type="range" 
            value={temp}
            onChange={(e) => onTempChange(Number(e.target.value))}
        />
    );
}

// L'enfant qui lit
function AffichageTemp({ temp }) {
    return <p>Température : {temp}°C</p>;
}

🧩 Quand faire du Lifting State Up ?

💡 Règle d'or : L'état doit être au niveau le plus bas possible tout en étant accessible par tous les composants qui en ont besoin.

⚠️ Inverse Data Flow

Les données descendent via les props, les modifications remontent via les callbacks :

// Props ↓ (données)
<Enfant valeur={state} />

// Callbacks ↑ (événements)
<Enfant onValeurChange={(newVal) => setState(newVal)} />

🚀 Démo interactive

▼ Convertisseur de température — état partagé

📝 Résumé

← 10 — Formulaires 12 — useRef →