Cours React Complet ⚛️
Les 12 chapitres essentiels — composants, hooks, état, effets et patterns modernes
🏠 Hub Programmation
⚡ JavaScript
🔷 TypeScript
🎨 HTML & CSS
☁️ AWS Cloud Practitioner
Introduction et JSX
export default App;
React est une bibliothèque UI (pas un framework). Elle ne gère que le rendu de l'interface — vous choisissez le routing, le state management et le reste. Créée par Meta (Facebook), c'est la librairie frontend la plus utilisée au monde.
npm create vite@latest mon-app — –template react
cd mon-app
npm install
npm run dev
# Avec Next.js (framework full-stack)
npx create-next-app@latest mon-app
# Structure Vite :
# mon-app/
# ├── index.html
# ├── package.json
# ├── vite.config.js
# └── src/
# ├── main.jsx (point d'entrée)
# ├── App.jsx (composant racine)
# └── App.css
Règles JSX : className au lieu de class, htmlFor au lieu de for, toutes les balises doivent être fermées (
), un seul élément racine (utiliser <>…> — Fragment — si besoin). Les permettent d'insérer n'importe quelle expression JavaScript.
Composants
function Header()
// Arrow function (même chose)
const Footer = () =>
;
// Composition — imbriquer des composants
function App()
Règle d'or : un composant = une responsabilité. Si un composant fait trop de choses, découpez-le. Les composants React sont comme des fonctions : petits, réutilisables, composables.
Props
function UserCard()
// Utiliser le composant
// children — contenu entre les balises
function Card()
N'importe quel contenu ici
Les props sont en lecture seule. Un composant ne doit JAMAIS modifier ses props. C'est le flux de données unidirectionnel de React : parent → enfant. Si l'enfant doit modifier une valeur, le parent passe une fonction callback.
État (useState)
function Counter()
// ⚠️ Utiliser la fonction de mise à jour pour les états dépendants
setCount(prev => prev + 1); // ✅ Basé sur la valeur précédente
setCount(count + 1); // ⚠️ Peut être stale
// État avec objet — TOUJOURS créer un nouvel objet
const [user, setUser] = useState();
setUser(); // ✅ Spread + modification
// user.age = 26; ❌ NE JAMAIS muter directement
// État avec tableau
const [items, setItems] = useState([]);
setItems([…items, newItem]); // Ajouter
setItems(items.filter(i => i.id !== id)); // Supprimer
setItems(items.map(i =>
i.id === id ? : i
)); // Modifier un élément
React re-rend un composant quand son état change. C'est le mécanisme central : vous ne manipulez jamais le DOM — vous changez l'état, React met à jour le DOM automatiquement. L'état est immuable : toujours créer un nouvel objet/tableau.
Événements et rendu conditionnel
// ⚠️ Passer une RÉFÉRENCE, pas un appel
// Passer un argument
Listes et clés
La key doit être unique et stable. Utilisez un id de la base de données, jamais l'index du tableau (sauf si la liste ne change jamais). React utilise les clés pour savoir quel élément a changé, été ajouté ou supprimé.
useEffect et cycle de vie
function UserProfile()
useEffect(() => ); // Pas de tableau de dépendances
// 2. Au montage uniquement (componentDidMount)
useEffect(() => , []); // Tableau vide = une seule fois
// 3. Quand une dépendance change
useEffect(() => , [count]); // Re-exécute quand count change
// Cleanup (componentWillUnmount)
useEffect(() => , []);
Le tableau de dépendances contrôle quand l'effet se réexécute. Listez toutes les variables utilisées dans l'effet. Le linter ESLint (react-hooks/exhaustive-deps) vous avertit si vous en oubliez.
Hooks avancés
// useRef — référence persistante (ne provoque PAS de re-rendu)
function TextInput()
// useMemo — mémoriser un calcul coûteux
function ExpensiveList()
// useCallback — mémoriser une fonction
function Parent() {
const [count, setCount] = useState(0);
const handleClick = useCallback(() => {
setCount(c => c + 1);
}, []); // Même référence entre les rendus
return
}
N'optimisez pas prématurément. useMemo et useCallback ajoutent de la complexité. Utilisez-les uniquement quand il y a un problème de performance mesurable, pas « au cas où ».
function reducer(state, action)
function Counter()
Formulaires
Composant contrôlé : React est la « source de vérité » — la valeur de l'input est contrôlée par l'état React (value= + onChange). C'est le pattern standard. Pour les cas simples, les librairies comme React Hook Form simplifient la gestion.
Context et état global
// 1. Créer le contexte
const ThemeContext = createContext(« light »);
// 2. Provider — fournir la valeur
function App()
// 3. Consumer — utiliser la valeur (n'importe où dans l'arbre)
function ThemeToggle()
Context pour les données globales : thème, langue, utilisateur connecté, préférences. Pour l'état complexe avec beaucoup de logique, considérez Zustand (simple) ou Redux Toolkit (plus structuré) comme alternatives.
React Router et navigation
import from « react-router-dom »;
function App()
// Paramètres dynamiques
function UserPage()
Patterns et bonnes pratiques
function useFetch(url)
// Utilisation — logique réutilisable
function UserList()
| Besoin | Librairie |
|---|---|
| Framework full-stack | Next.js (SSR, App Router) |
| État global | Zustand (simple) / Redux Toolkit |
| Data fetching | TanStack Query (React Query) |
| Formulaires | React Hook Form + Zod |
| Routing | React Router v6 / Next.js App Router |
| Styling | Tailwind CSS / CSS Modules |
| UI Components | shadcn/ui / Radix / Headless UI |
| Animations | Framer Motion |
| Tests | Vitest + Testing Library |
✅ À FAIRE
• Composants petits (< 100 lignes)
• Custom hooks pour la logique réutilisable
• key unique et stable sur les listes
• État au plus bas dans l'arbre
• Nommer les composants en PascalCase
• prev => dans setState dépendant
• Cleanup dans useEffect
• TypeScript pour les gros projets
• Lazy loading (React.lazy)
❌ À ÉVITER
• Muter l'état directement
• useEffect sans dépendances
• Index comme key (listes dynamiques)
• Prop drilling (> 3 niveaux)
• useEffect pour tout (penser d'abord au rendu)
• useMemo/useCallback partout
• État dérivé dans useState
• Composants > 200 lignes
• Ignorer les erreurs de hooks
function MyComponent() {
const [count, setCount] = useState(0); // ✅
useEffect(() => , []); // ✅
}
// ❌ JAMAIS dans une condition ou boucle
if (condition)
// ❌ JAMAIS dans une fonction normale
function helper()
🏠 Hub Programmation
⚡ Cours JavaScript
🔷 Cours TypeScript
🎨 Cours HTML & CSS
☁️ AWS Cloud Practitioner
