JSX (JavaScript XML) est une extension de syntaxe qui permet d'écrire du « HTML » directement dans du JavaScript. Ce n'est ni une string, ni du vrai HTML — c'est transformé en appels React.createElement() par Babel.
// Ce JSX :
const element = <h1>Bonjour !</h1>;
// Est transformé en :
const element = React.createElement('h1', null, 'Bonjour !');
Un composant doit retourner un seul élément parent :
// ❌ ERREUR : deux éléments racines
return (
<h1>Titre</h1>
<p>Paragraphe</p>
);
// ✅ OK : un conteneur parent
return (
<div>
<h1>Titre</h1>
<p>Paragraphe</p>
</div>
);
<>...</>Si on ne veut pas de <div> inutile dans le DOM, on utilise un Fragment :
// Fragment court
return (
<>
<h1>Titre</h1>
<p>Paragraphe</p>
</>
);
// Fragment explicite (utile si on veut une key)
return (
<React.Fragment key={id}>
<h1>Titre</h1>
<p>Paragraphe</p>
</React.Fragment>
);
{ } = expressions JavaScriptPour injecter du JS dans le JSX, on utilise des accolades :
const nom = "Alice";
const age = 30;
return (
<div>
<p>Nom : {nom}</p>
<p>Âge : {age}</p>
<p>Année de naissance : {2026 - age}</p>
<p>Majeur : {age >= 18 ? 'Oui' : 'Non'}</p>
<p>Date : {new Date().toLocaleDateString('fr-FR')}</p>
</div>
);
En JSX, les attributs HTML deviennent du camelCase :
| HTML | JSX | Raison |
|---|---|---|
class | className | class est un mot réservé en JS |
for | htmlFor | for est un mot réservé en JS |
onclick | onClick | Convention camelCase |
tabindex | tabIndex | Convention camelCase |
readonly | readOnly | Convention camelCase |
L'attribut style prend un objet JavaScript, pas une string :
// ❌ HTML classique (ne marche pas en JSX)
<p style="color: red; font-size: 20px">Texte</p>
// ✅ JSX : objet avec camelCase
<p style={{ color: 'red', fontSize: '20px' }}>Texte</p>
// ✅ Avec une variable
const monStyle = {
color: 'blue',
backgroundColor: '#f0f0f0',
padding: '10px',
borderRadius: '8px'
};
<p style={monStyle}>Texte stylé</p>
{{ }} ? La première paire { } c'est « je passe du JS ». La seconde { } c'est l'objet JS lui-même.
return (
<div>
{/* Ceci est un commentaire JSX */}
<p>Texte</p>
{/*
Commentaire
multi-lignes
*/}
</div>
);
En JSX, toutes les balises sans enfant doivent être fermées avec /> :
<img src="photo.jpg" alt="Photo" />
<input type="text" />
<br />
<hr />
<MonComposant />
function Carte() {
const utilisateur = {
nom: "Bob",
avatar: "https://i.pravatar.cc/100",
actif: true
};
const competences = ['React', 'CSS', 'JavaScript'];
return (
<div style={{ border: '1px solid #ccc', padding: '1rem', borderRadius: '8px' }}>
<img src={utilisateur.avatar} alt={utilisateur.nom} />
<h3>{utilisateur.nom}</h3>
<p>Statut : {utilisateur.actif ? '🟢 En ligne' : '🔴 Hors ligne'}</p>
<p>Compétences : {competences.join(', ')}</p>
</div>
);
}
▼ Différentes fonctionnalités JSX en action
<Fragment>.{ } pour injecter des expressions JS.className, onClick…).style = objet JS avec propriétés camelCase.<img />.{/* ... */}.