Module 3Gérer l'état avec Redux
Chapitre 18 sur 18
Préparer les contrôles et l'EFM
Trois examens blancs corrigés (contrôles 1, 2, 3 et EFM) et la fiche mémo du module.
- ≈ 110 min
- 2 leçons
- 5 exercices
- TP
Module 3Gérer l'état avec Redux
Chapitre 18 sur 18
Trois examens blancs corrigés (contrôles 1, 2, 3 et EFM) et la fiche mémo du module.
Objectifs
Avec ce chapitre, tu sauras…
Leçon 1
La méthode
Leçon 2
| Notion | À retenir |
|---|---|
| ES6 | class/extends/super, export default / export {}, `${x}`, c ? a : b, { a, b } = obj, [...t], map / filter / find / reduce, fonctions fléchées, fonctions pures |
| SPA | une page, rendu client, Ajax ; rapide, UX, cache ; mais historique, SEO, XSS |
| Projet | npx create-react-app nom / npm start (aujourd'hui npm create vite@latest / npm run dev) ; div#root ← createRoot(...).render(<App />) |
| JSX | className, style={{ camelCase: "…" }}, {expression}, un seul parent / <>…</>, {/* */}, key dans map, Majuscule = composant |
| Composants | fonction (props) => JSX ; classe extends React.Component + render() + this.props |
1[2, 4, 6].map(n => n / 2) renvoie…
2[5, 12, 8].find(n => n > 20) renvoie…
3Quelle fonction est pure ?
4Une SPA est…
5Babel sert à…
6<div class="titre"> en JSX s'écrit…
7Pour afficher la variable nom dans le JSX, on écrit…
8Un composant classe doit avoir la méthode…
9props est…
10Le contenu placé entre <Carte> et </Carte> est dans…
11Dans une classe, on modifie l'état avec…
12La div où React affiche l'application a l'id…
| props / state | props : du parent, immuables, children ; state classe : this.state + this.setState() ; fonction : useState |
| Événements | onClick={f} ou {() => f(x)}, jamais {f()} ; e.preventDefault(), e.target.value / checked |
| Communication | parent → enfant : props ; enfant → parent : fonction callback en props |
| Cycle de vie | componentDidMount, componentDidUpdate, componentWillUnmount ⇔ useEffect(f, [] / [deps] / rien) + nettoyage |
| Style | inline, CSS importé (global), X.module.css (local), styled-components |
| Formulaires | contrôlé : value + onChange ; textarea value, select value, radio même name, checkbox checked |
| API | fetch (res.json()) ou axios (res.data) dans useEffect(…, []) ou componentDidMount ; async/await dans une fonction interne |
| Hooks | useState, useEffect, useRef, hooks perso useXxx ; au premier niveau seulement |
| Routage | npm install react-router-dom ; BrowserRouter / HashRouter ; Routes + Route path element ; Link ; :id + useParams ; path="*" ; useNavigate |
| Tests | Jest : describe, it, expect ; Enzyme : shallow, find, simulate, state ; aujourd'hui RTL : render, screen, fireEvent |
| Redux | store unique (getState, dispatch, subscribe) ; action { type, payload } ; reducer pur ; Provider ; connect ou useSelector / useDispatch ; combineReducers ; Immer produce |
| Asynchrone | middleware Redux Thunk : dispatch(fonction) → (dispatch, getState) ; REQUEST / SUCCESS / FAILURE ; DevTools |
| Redux Toolkit | createSlice (actions + reducer, Immer), configureStore, createAsyncThunk (pending / fulfilled / rejected) + extraReducers |
1onClick={supprimer(id)} provoque…
2Un enfant prévient son parent…
3La méthode de classe appelée après le premier rendu est…
4La meilleure key pour une liste de produits est…
5Un champ contrôlé a…
6Pour une case à cocher, on lit…
7axios met les données de la réponse dans…
8useEffect(f, [])…
9Un hook personnalisé…
10En React Router v6, on écrit…
11Le paramètre de /produits/:id se lit avec…
12Avec Enzyme, on simule un clic avec…
1Redux a…
2Un reducer…
3Une action a obligatoirement…
4{ ...state, total: 0 } …
5combineReducers({ a: ra, b: rb }) donne l'état…
6useSelector sert à…
7Avec Redux Thunk, une fonction thunk reçoit…
8Redux DevTools : le volet qui montre ce qui a changé est…
9Dans une slice Redux Toolkit, state.value++ est permis car…
10createAsyncThunk génère les actions…
11Le store Redux Toolkit se crée avec…
12Redux est déconseillé pour…
Avec Redux Toolkit, crée la gestion d'une bibliothèque :
livres : état { items: [], loading: false, error: "" }, reducers ajouterLivre({ titre, auteur }) (id avec nanoid), supprimerLivre(id), basculerEmprunt(id) (le champ emprunte passe de false à true et inversement) ;chargerLivres avec createAsyncThunk qui charge https://jsonplaceholder.typicode.com/posts?_limit=5 et transforme chaque post en livre { id, titre: post.title, auteur: "Auteur " + post.userId, emprunte: false } ;configureStore et le Provider ;Bibliotheque : un formulaire contrôlé d'ajout, la liste (le titre barré si le livre est emprunté), les boutons « Emprunter / Rendre » et « Supprimer », le nombre de livres disponibles (sélecteur dans selectors.js), le chargement automatique au montage, le message de chargement et l'erreur en rouge.Le jour du contrôle
key à chaque élément créé par mapsetX, setState, spread, filter)onClick={f} ou onClick={() => f(x)}e.preventDefault() dans onSubmituseState, useEffect, axios, Link…)Crée le composant classe Panier qui reçoit en props produits = [{ id, nom, prix }]. Son état contient quantites (un objet { id: quantité }, vide au départ). Chaque produit a un bouton « + » qui ajoute 1 à sa quantité (sans modifier l'ancien objet). En bas, le composant affiche le total (somme prix × quantité, avec reduce). Si le total dépasse 1000 DH, il affiche « Livraison gratuite ».
Crée une application avec React Router : la page / affiche la liste des utilisateurs de https://jsonplaceholder.typicode.com/users (chargés avec axios dans useEffect), avec un champ de recherche contrôlé qui filtre par nom ; chaque nom est un Link vers /users/:id, qui affiche le détail (email, téléphone, ville) chargé avec fetch. Les deux pages affichent « Chargement… » pendant la requête.