Aller au contenu principal

État et événements avec React

Notions théoriques

Qu'est-ce que l'état (state) ?

L'état est la mémoire d'un composant React. Quand l'état change, React re-rend automatiquement le composant avec les nouvelles valeurs.

En Svelte, on utilise $state(). En React, on utilise le hook useState :

import { useState } from 'react'

function Compteur() {
const [compteur, setCompteur] = useState(0)

return (
<div>
<p>{compteur}</p>
<button onClick={() => setCompteur(compteur + 1)}>+1</button>
</div>
)
}

Décortiquer useState

const [compteur, setCompteur] = useState(0)
// ↑ ↑ ↑
// valeur fonction de valeur
// actuelle mise à jour initiale
  • compteur — la valeur actuelle (lecture seule, ne pas modifier directement)
  • setCompteur — la fonction pour mettre à jour l'état
  • useState(0) — l'état initial est 0
Ne JAMAIS modifier l'état directement
// ❌ INTERDIT — React ne détectera pas le changement
compteur = compteur + 1

// ✅ CORRECT — React re-rend le composant
setCompteur(compteur + 1)

Les événements en React

En React, les événements s'écrivent en camelCase avec un on majuscule :

Événement DOMReact
onclickonClick
oninputonInput ou onChange
onsubmitonSubmit
onmouseenteronMouseEnter
function Bouton() {
function gererClic() {
alert('Cliqué !')
}

return <button onClick={gererClic}>Cliquer</button>
}

Les champs de formulaire : onChange

Pour lier un <input> à l'état, React utilise value et onChange :

import { useState } from 'react'

function Formulaire() {
const [prenom, setPrenom] = useState('')

return (
<div>
<input
type="text"
value={prenom}
onChange={e => setPrenom(e.target.value)}
placeholder="Votre prénom"
/>
<p>Bonjour, {prenom} !</p>
</div>
)
}
Comparaison Svelte / React pour les inputs
SvelteReact
Lier un inputbind:value={variable}value={etat} onChange={e => setEtat(e.target.value)}
Variable réactivelet x = $state(val)const [x, setX] = useState(val)

Le rendu conditionnel

En React, on utilise des expressions JavaScript dans le JSX :

Opérateur ternaire :

{estConnecte ? <p>Bienvenue !</p> : <p>Veuillez vous connecter.</p>}

Opérateur && (afficher seulement si vrai) :

{estConnecte && <p>Bienvenue !</p>}

Les listes avec .map()

Pour afficher une liste, on utilise .map() qui retourne un tableau de JSX :

const fruits = ['Pomme', 'Banane', 'Orange']

return (
<ul>
{fruits.map((fruit, index) => (
<li key={index}>{fruit}</li>
))}
</ul>
)
L'attribut key est obligatoire

React a besoin de key pour identifier chaque élément de la liste lors des mises à jour. Sans key, React affiche un avertissement et les performances sont dégradées. Utilisez un identifiant unique (id, valeur) plutôt que l'index quand c'est possible.


Exemple pratique

Un composant de liste de courses complet :

import { useState } from 'react'

function ListeCourses() {
const [articles, setArticles] = useState(['Pommes', 'Lait'])
const [nouvelArticle, setNouvelArticle] = useState('')

function ajouterArticle() {
if (nouvelArticle.trim()) {
setArticles([...articles, nouvelArticle.trim()])
setNouvelArticle('')
}
}

return (
<div>
<h1>Liste de courses ({articles.length})</h1>
<input
value={nouvelArticle}
onChange={e => setNouvelArticle(e.target.value)}
placeholder="Ajouter un article..."
/>
<button onClick={ajouterArticle}>Ajouter</button>
<ul>
{articles.map((article, index) => (
<li key={index}>{article}</li>
))}
</ul>
</div>
)
}

export default ListeCourses
Tableau réactif en React

Comme en Svelte, pour ajouter un élément à un tableau en React, on remplace le tableau : setArticles([...articles, nouvelArticle]). On ne doit jamais appeler .push() directement sur le tableau d'état.


Test de mémorisation/compréhension


Quelle syntaxe déclare un état React initialisé à 0 ?


Comment met-on à jour l'état `compteur` en React ?


Comment s'écrit l'événement de clic en React ?


Quel attribut React est obligatoire pour les éléments d'une liste `.map()` ?


Quelle syntaxe React lie un input à l'état `texte` ?


Quel import est nécessaire pour utiliser useState ?



TP pour réfléchir et résoudre des problèmes

Dans ce TP, vous allez créer une application de compteur avec React, puis une liste d'éléments interactive.

Étape 1 — Créer le projet

npm create vite@latest tp-react-state --template react
cd tp-react-state
npm install
npm run dev

Bonne pratique - Importer uniquement ce dont on a besoin

React exporte de nombreux hooks. Importez uniquement ceux que vous utilisez avec les accolades : import { useState, useEffect } from 'react'. N'importez pas React en entier sauf si nécessaire.

Étape 2 — Créer un compteur avec useState

Remplacez src/App.jsx par un compteur avec boutons + et - :


Bonne pratique - Nommer la fonction setter avec 'set'

La convention React est de nommer la fonction de mise à jour set + nom de la variable en PascalCase : setCompteur, setPrenom, setArticles. Cette convention rend le code immédiatement compréhensible par tout développeur React.

Étape 3 — Affichage conditionnel

Ajoutez un message qui change selon la valeur du compteur :


Bonne pratique - Ternaire pour les conditions simples

En JSX, le rendu conditionnel s'exprime avec l'opérateur ternaire ? : ou l'opérateur &&. Évitez les if/else à l'intérieur du JSX : extrayez la logique dans une variable avant le return si la condition devient complexe.

Étape 4 — Liste d'éléments avec ajout et suppression

Ajoutez une liste interactive dans App.jsx :


Bonne pratique - Immutabilité de l'état

En React, ne modifiez jamais directement le tableau d'état (articles.push(...), articles.splice(...)). Créez toujours un nouveau tableau avec filter, map, ou le spread operator [...articles, ...]. React compare les références pour détecter les changements : si le tableau est le même objet en mémoire, React ne re-rend pas.

📌 Une solution