React

Créez des UIs interactives avec des composants - bibliothèque JavaScript déclarative, efficace et flexible

TL;DR

En une ligne: React est une bibliothèque JavaScript pour créer des UIs avec des composants - les briques Lego du développement web.

Forces principales:

  • Basé sur les composants - construisez une fois, réutilisez partout
  • Virtual DOM - mises à jour rapides sans toucher le vrai DOM
  • Hooks - gestion élégante de l’état et du cycle de vie
  • Écosystème massif - React Native, Next.js et des milliers de bibliothèques

Core Concepts

Concept 1: Components

Tout dans React est un composant. Un composant est simplement une fonction qui retourne du JSX (syntaxe HTML-like en JavaScript).

function Welcome({ name }) {
  return <h1>Bonjour, {name}!</h1>;
}

// Utilisez-le comme du HTML
<Welcome name="Alice" />

Concept 2: State & Props

Props = données passées du parent à l’enfant (lecture seule) State = données gérées à l’intérieur d’un composant (peut changer)

function Counter() {
  const [count, setCount] = useState(0);  // State
  return <button onClick={() => setCount(count + 1)}>{count}</button>;
}

Concept 3: One-way Data Flow

Les données circulent vers le bas du parent à l’enfant via les props. L’enfant ne peut pas modifier directement les données du parent - il appelle des fonctions callback à la place.

Quick Start

Create Project

# Avec Vite (recommandé)
npm create vite@latest my-app -- --template react
cd my-app
npm install
npm run dev

Project Structure

my-app/
├── src/
│   ├── App.jsx       # Composant racine
│   ├── main.jsx      # Point d'entrée
│   └── index.css
├── index.html
├── package.json
└── vite.config.js

Minimal Example

// src/App.jsx
import { useState } from 'react';

function App() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <h1>Bonjour React!</h1>
      <button onClick={() => setCount(count + 1)}>
        Compteur: {count}
      </button>
    </div>
  );
}

export default App;

Run

npm run dev
# Ouvrez http://localhost:5173

Gotchas

Component names must be capitalized

// ❌ Faux - traité comme une balise HTML
function myButton() { return <button>Hi</button> }

// ✅ Correct
function MyButton() { return <button>Hi</button> }

Don’t call handlers, pass them

// ❌ Faux - s'exécute immédiatement au rendu
<button onClick={handleClick()}>

// ✅ Correct - passe la référence
<button onClick={handleClick}>

// ✅ Avec des arguments
<button onClick={() => handleClick(id)}>

State updates are async

const [count, setCount] = useState(0);

function handleClick() {
  setCount(count + 1);
  console.log(count);  // Encore 0! L'état se met à jour au prochain rendu
}

// Utilisez la forme fonction pour plusieurs mises à jour
setCount(c => c + 1);
setCount(c => c + 1);  // Ajoute maintenant correctement 2

State is immutable

// ❌ Faux - mutation de l'état
user.name = 'Nouveau Nom';
setUser(user);  // React ne re-rendra pas!

// ✅ Correct - nouvel objet
setUser({ ...user, name: 'Nouveau Nom' });

// Pour les tableaux
setItems([...items, newItem]);  // Ajouter
setItems(items.filter(i => i.id !== id));  // Supprimer

When to Use

Idéal pour:

  • Applications monopages (SPAs)
  • UIs interactives complexes
  • Équipes qui veulent réutiliser des composants
  • Projets nécessitant un support d’écosystème fort

Pas idéal pour:

  • Sites statiques simples (utilisez Astro, Hugo)
  • Sites critiques pour le SEO sans configuration SSR (utilisez plutôt Next.js)
  • Très petits projets (le JS vanilla pourrait suffire)

Comparaison:

FonctionnalitéReactVueAngular
Courbe d’apprentissageMoyenneFacileRaide
Taille40KB30KB150KB+
StyleBibliothèqueFrameworkFramework complet
FlexibilitéHauteMoyenneOpinionné

Next Steps

Cheatsheet

ModèleCode
Componentfunction Name() { return <div>...</div> }
Propsfunction Card({ title }) { ... }
Stateconst [val, setVal] = useState(initial)
EffectuseEffect(() => { ... }, [deps])
Refconst ref = useRef(null)
Contextconst val = useContext(MyContext)
Conditionnel{show && <Component />}
Liste{items.map(i => <Item key={i.id} />)}
EventonClick={fn} / onChange={fn}