Exercices - React Fondamentaux
Mettez en pratique ce que vous avez appris : composants, props, listes et rendu conditionnel !
Comment travailler efficacement
- Créez un projet Vite :
npm create vite@latest react-exercises -- --template react-ts - Testez régulièrement : Lancez
npm run devet vérifiez dans le navigateur - Utilisez React DevTools : Installez l'extension pour déboguer
- Essayez d'abord : Tentez de résoudre avant de regarder la solution
- Comprenez le code : L'objectif est de comprendre, pas de copier !
💡 Temps estimé : 1h30 pour les 4 exercices
Exercice 1 : Composant avec props
Exercice : Carte de profil utilisateur
Créez un composant ProfileCard qui affiche une carte de profil utilisateur.
Props attendues (avec TypeScript) :
name: string (requis)bio: string (requis)avatarUrl: string (requis)isOnline: boolean (optionnel, par défaut false)
Affichage :
- Image de profil (80x80px)
- Nom en titre
- Biographie
- Badge "🟢 En ligne" uniquement si
isOnlineest true
Utilisation :
<ProfileCard
name="Alice Dupont"
bio="Développeuse frontend"
avatarUrl="https://i.pravatar.cc/150?img=1"
isOnline={true}
/>Dans App.tsx : Créez 3 cartes de profil différentes
Rappel
Utilisez l'opérateur && pour afficher conditionnellement le badge :
{isOnline && <span>🟢 En ligne</span>}
Exercice 2 : Listes et keys
Exercice : Liste de produits avec filtrage
Créez un système d'affichage de produits avec filtrage par catégorie.
Données de test :
interface Product {
id: number;
name: string;
price: number;
category: 'electronics' | 'clothing' | 'books';
}
const products: Product[] = [
{ id: 1, name: 'Laptop', price: 999, category: 'electronics' },
{ id: 2, name: 'T-shirt', price: 29, category: 'clothing' },
{ id: 3, name: 'Smartphone', price: 699, category: 'electronics' },
{ id: 4, name: 'Roman', price: 15, category: 'books' },
{ id: 5, name: 'Casque audio', price: 149, category: 'electronics' }
];Composants à créer :
1. ProductCard
- Props :
product(objet Product) - Affiche : nom, prix, catégorie
2. ProductList
- Props :
products(tableau),category(string optionnel) - Filtre par catégorie si fournie
- Affiche "Aucun produit trouvé" si la liste filtrée est vide
- Utilise
.map()pour afficher les ProductCard - N'oubliez pas les keys !
Utilisation :
// Tous les produits
<ProductList products={products} />
// Uniquement l'électronique
<ProductList products={products} category="electronics" />
// Uniquement les vêtements
<ProductList products={products} category="clothing" />Points importants :
- ✅ Chaque
ProductCarddoit avoir unekeyunique (utilisezproduct.id) - ✅ Le filtrage doit fonctionner correctement
- ✅ Gérer le cas de liste vide
Astuce pour le filtrage
Utilisez l'opérateur ternaire pour filtrer conditionnellement :
const filteredProducts = category
? products.filter(p => p.category === category)
: products;
Puis utilisez .map() sur filteredProducts
Exercice 3 : Rendu conditionnel
Exercice : Dashboard avec états de chargement
Créez un dashboard qui gère 4 états différents : loading, error, empty, et success.
Données de test :
interface Stat {
id: number;
title: string;
value: number;
trend: string;
}
const mockData: Stat[] = [
{ id: 1, title: 'Ventes', value: 1234, trend: '+12%' },
{ id: 2, title: 'Utilisateurs', value: 567, trend: '+8%' },
{ id: 3, title: 'Revenus', value: 8910, trend: '-3%' }
];Composants à créer :
1. StatCard
- Props :
stat(objet Stat) - Affiche : titre, valeur, tendance
- Colore la tendance en vert si positive (+), rouge si négative (-)
2. Dashboard
- Props :
loading(boolean),error(string | null),data(Stat[] | null) - Gère 4 états avec des early returns :
États à gérer :
- Loading (
loading === true) → Affiche "⏳ Chargement des données..." - Error (
error !== null) → Affiche "❌ Erreur : [message]" + bouton "Réessayer" - Empty (
data === nulloudata.length === 0) → Affiche "📭 Aucune donnée disponible" - Success (sinon) → Affiche le titre + grille de StatCard
Tester les 4 états :
// État 1 : Loading
<Dashboard loading={true} error={null} data={null} />
// État 2 : Error
<Dashboard loading={false} error="Connexion impossible" data={null} />
// État 3 : Empty
<Dashboard loading={false} error={null} data={[]} />
// État 4 : Success
<Dashboard loading={false} error={null} data={mockData} />Pattern des early returns
Utilisez des if avec return pour simplifier la logique :
function Dashboard({ loading, error, data }) {
if (loading) return <LoadingView />;
if (error) return <ErrorView error={error} />;
if (!data || data.length === 0) return <EmptyView />;
// État success
return <SuccessView data={data} />;
}
Ce pattern évite les ternaires imbriqués et rend le code plus lisible !
Exercice 4 : Lecture et validation de code
Compétence essentielle
Savoir lire et valider du code React est crucial quand vous travaillez avec l'IA. Vous devez pouvoir détecter les erreurs, comprendre les bugs, et corriger les mauvaises pratiques.
Exercice : Trouver les bugs dans le code React
Lisez attentivement les 6 codes suivants. Chacun contient un bug ou une mauvaise pratique React.
Pour chaque code :
- Identifiez le problème
- Expliquez pourquoi c'est un bug
- Proposez la correction
Code 1 : Liste sans keys
const users = ['Alice', 'Bob', 'Charlie'];
return (
<ul>
{users.map(user => (
<li>{user}</li>
))}
</ul>
);Questions :
- Quelle erreur s'affiche dans la console ?
- Pourquoi React a-t-il besoin de keys ?
- Comment corriger ce code ?
Code 2 : Filtrage avec .map()
const users = [
{ name: 'Alice', age: 25 },
{ name: 'Bob', age: 17 },
{ name: 'Charlie', age: 30 }
];
const adults = users.map(user => {
if (user.age >= 18) return <div>{user.name}</div>;
});
return <div>{adults}</div>;Questions :
- Que contient exactement le tableau
adults? - Quel est le problème avec cette approche ?
- Quelle méthode devrait être utilisée avant
.map()?
Code 3 : Index comme key
const tasks = [
{ text: 'Apprendre React' },
{ text: 'Faire les exercices' },
{ text: 'Créer un projet' }
];
return (
<ul>
{tasks.map((task, index) => (
<li key={index}>{task.text}</li>
))}
</ul>
);Questions :
- Pourquoi utiliser l'index comme key est problématique ?
- Que se passe-t-il si on supprime le 2ème élément ?
- Quelle est la bonne solution ?
Code 4 : Oubli du return
const numbers = [1, 2, 3, 4, 5];
return (
<ul>
{numbers.map(n => {
<li>{n}</li>
})}
</ul>
);Questions :
- Qu'affiche ce code à l'écran ?
- Quelle est l'erreur ?
- Comment corriger (deux solutions) ?
Code 5 : Props non typées
function UserCard(props) {
return (
<div>
<h3>{props.name}</h3>
<p>{props.age} ans</p>
</div>
);
}
// Utilisation
<UserCard name="Alice" age="25" />Questions :
- Quel est le problème avec
age="25"? - Comment TypeScript peut-il nous aider ?
- Écrivez l'interface correcte pour les props
Code 6 : Condition avec 0
const count = 0;
return (
<div>
<h1>Messages</h1>
{count && <p>Vous avez {count} message(s)</p>}
</div>
);Questions :
- Qu'affiche ce code à l'écran quand
count === 0? - Pourquoi React affiche-t-il
0? - Comment corriger ce problème ?
Pourquoi cet exercice est important
Quand vous utilisez l'IA pour générer du code React :
- L'IA peut faire ces erreurs (keys manquantes, index, types incorrects)
- Vous devez pouvoir les détecter avant d'utiliser le code
- Comprendre le code est plus important que le copier-coller
- TypeScript aide mais ne détecte pas tout (comme les keys)
Cet exercice vous entraîne à lire, analyser et valider du code React généré.
Récapitulatif
Ce que vous avez pratiqué
Exercice 1 : Créer des composants avec props typées (TypeScript)
Exercice 2 : Afficher des listes avec .map(), gérer les keys, filtrer
Exercice 3 : Gérer plusieurs états avec rendu conditionnel (early returns)
Exercice 4 : Lire et valider du code React, détecter les bugs courants
Temps total : ~1h30
Prochaine étape : Le projet fil rouge (application d'apprentissage du japonais)
React Docs - Composants et Props
Guide officiel sur les composants et les props
DocumentationReact Docs - Rendu de listes
Tout sur .map(), keys et listes React
DocumentationReact Docs - Rendu conditionnel
Les différentes méthodes de rendu conditionnel
DocumentationReact DevTools
Extension Chrome/Firefox pour déboguer React