É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'étatuseState(0)— l'état initial est0
// ❌ 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 DOM | React |
|---|---|
onclick | onClick |
oninput | onInput ou onChange |
onsubmit | onSubmit |
onmouseenter | onMouseEnter |
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>
)
}
| Svelte | React | |
|---|---|---|
| Lier un input | bind:value={variable} | value={etat} onChange={e => setEtat(e.target.value)} |
| Variable réactive | let 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>
)
key est obligatoireReact 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
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
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
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.