Leçon 2 / 15

Créer un composant fonctionnel

20 min React — composants et état Gratuit

Objectif : Afficher le titre et la structure initiale du tableau de bord dans un composant React.

Une page blanche ou un titre isolé ne suffit pas pour commencer un tableau de bord : il faut d’abord donner une structure visible à l’interface. Vous allez créer un composant React qui affiche l’en-tête et les zones principales prévues pour les dépenses, sans encore gérer de données ni d’interactions.

La leçon précédente a défini le type TypeScript d’une dépense. Vous n’en avez pas besoin pour ce premier rendu : l’objectif est de construire l’interface statique qui servira de base aux prochaines étapes.

Créer le composant de la page

Un composant fonctionnel est une fonction JavaScript ou TypeScript qui retourne une interface décrite en JSX. JSX ressemble à du HTML, mais il est écrit dans le fichier du composant et permet à React de produire les éléments affichés dans la page. Par convention, le nom d’un composant commence par une majuscule : utilisez ici App.

Créez src/App.tsx avec le composant ci-dessous. Il reprend les régions du tableau de bord définies par le projet, mais garde pour l’instant les zones de formulaire, de filtres, de récapitulatif et de liste sous forme de structure statique.

Texte
export default function App() {
  return (
    <div className="depenses-app">
      <header className="depenses-entete">
        <h1 className="depenses-entete__titre">
          Tableau de bord des dépenses
        </h1>
      </header>

      <main className="depenses-principale">
        <section className="depenses-saisie" aria-label="Saisir une dépense">
          <h2>Ajouter une dépense</h2>
          <p>Le formulaire de saisie sera ajouté dans une prochaine étape.</p>
        </section>

        <section
          className="depenses-recapitulatif"
          aria-label="Récapitulatif mensuel"
        >
          <h2>Total du mois</h2>
          <p className="depenses-recapitulatif__montant">Aucun total calculé</p>
        </section>

        <section className="depenses-filtres" aria-label="Filtres des dépenses">
          <p>Les filtres seront disponibles dans une prochaine étape.</p>
        </section>

        <section aria-label="Liste des dépenses">
          <h2>Dépenses</h2>
          <p className="depenses-message--vide">
            Aucune dépense pour cette période.
          </p>
        </section>
      </main>
    </div>
  );
}

Le corps de la fonction retourne un seul élément JSX racine, ici le conteneur div. Il contient des éléments imbriqués comme dans un document HTML. En JSX, vous écrivez className plutôt que class pour associer une classe CSS ; les noms de classes employés ici sont ceux du contrat du projet.

Rendre le composant dans la page

Pour que le navigateur affiche App, le point d’entrée React doit l’importer et le rendre dans l’élément HTML prévu à cet effet. Dans src/main.tsx, créez la racine React à partir de l’élément #root, puis transmettez-lui le composant.

Texte
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import App from "./App";
import "./style.css";

const elementRacine = document.getElementById("root");

if (!elementRacine) {
  throw new Error("L’élément #root est introuvable.");
}

createRoot(elementRacine).render(
  <StrictMode>
    <App />
  </StrictMode>,
);

L’élément ciblé par getElementById doit exister dans la page HTML. Voici une page complète minimale compatible avec ce point d’entrée ; enregistrez-la à la racine du projet sous index.html. Le navigateur charge ensuite le fichier TypeScript d’entrée, que l’outil de développement du projet transforme pour l’exécution.

HTML
<!doctype html>
<html lang="fr">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Tableau de bord des dépenses</title>
  </head>
  <body>
    <div id="root"></div>
    <script type="module" src="/src/main.tsx"></script>
  </body>
</html>
Aperçu du rendu
Chargement de l'aperçu…

Préparer la feuille de style

La structure s’affichera même sans règles CSS, mais la feuille du projet doit déclarer les variables de présentation autorisées. Dans src/style.css, ajoutez-les à la racine du document ; les styles pourront les utiliser au fil des prochaines leçons.

CSS
:root {
  --depenses-couleur-fond: #f6f7fb;
  --depenses-couleur-surface: #ffffff;
  --depenses-couleur-texte: #202638;
  --depenses-couleur-accent: #3157c8;
  --depenses-couleur-secondaire: #68718a;
  --depenses-espace: 1rem;
  --depenses-rayon: 0.75rem;
  --depenses-typographie: Arial, sans-serif;
}

body {
  margin: 0;
  background: var(--depenses-couleur-fond);
  color: var(--depenses-couleur-texte);
  font-family: var(--depenses-typographie);
}

.depenses-app {
  padding: var(--depenses-espace);
}

.depenses-entete,
.depenses-principale > section {
  margin-bottom: var(--depenses-espace);
  padding: var(--depenses-espace);
  border-radius: var(--depenses-rayon);
  background: var(--depenses-couleur-surface);
}

.depenses-entete__titre {
  color: var(--depenses-couleur-accent);
}

.depenses-message--vide {
  color: var(--depenses-couleur-secondaire);
}
Aperçu du rendu
Chargement de l'aperçu…

Aperçu appliqué au document HTML de cette leçon : la règle CSS est injectée dans la page pour voir son effet réel.

Lancez le serveur de développement et ouvrez la page dans le navigateur. Vous devez voir le titre « Tableau de bord des dépenses », les sections de saisie, de récapitulatif et de filtres, puis le message indiquant qu’il n’y a aucune dépense. Ces textes sont provisoires : les prochaines étapes transformeront progressivement les zones statiques en interface alimentée par les données.

À retenir

  • Un composant fonctionnel est une fonction nommée en majuscule qui retourne du JSX.
  • Le JSX décrit la structure à afficher et doit respecter une syntaxe d’éléments correctement imbriqués.
  • Utilisez `className` pour les classes CSS dans le JSX.
  • Le point d’entrée rend le composant dans l’élément `#root` de la page HTML.

Dans la prochaine leçon, vous transmettrez une dépense à un composant enfant à l’aide de props typées.

Envie d'aller plus loin ?

Les cours Enovatic sont gratuits et le resteront. Si vous cherchez un accompagnement encadré, nos formations professionnelles sont animées par les mêmes formateurs.