Aller au contenu principal

Afficher une question

Comment afficher une question dans la page (et pas seulement dans la console) ?

afficher_question_v3.png

Objectifs
  • Comprendre le fonctionnement du JSX dans React.
  • Utiliser useState pour afficher dynamiquement une question.
  • Apprendre à afficher une question et ses réponses dans une page Web.

Notions théoriques

1. Qu’est-ce que JSX ?

JSX est une extension de JavaScript qui permet d’écrire du HTML directement dans le code JavaScript. C’est ce que vous utilisez dans un composant React.

Exemple :

return <h1>Bienvenue sur le Quiz Cyber</h1>;

Ici, on retourne un élément HTML (<h1>) dans du JavaScript.

Avantages

JSX rend le code plus lisible et plus proche de ce qu’on voit à l’écran.

Pourquoi JSX est utile ?

  • Il permet de lier facilement les données et l’interface.
  • Il rend l’affichage dynamique : le contenu peut changer en fonction de l’état de l’application.

2. Qu’est-ce que useState ?

useState est un hook de React. Il permet de gérer une donnée qui peut changer dans le temps, comme :

  • une question actuelle,
  • un score,
  • une réponse sélectionnée.

Voici comment on l’utilise :

const [compteur, setCompteur] = useState(0);
  • compteur contient la valeur actuelle.
  • setCompteur est une fonction qui permet de modifier cette valeur.
  • useState(0) initialise la valeur à 0 (valeur de départ).

3. Afficher dynamiquement une question

On va utiliser useState pour stocker une question et ses réponses, puis les afficher dans la page.

Exemple :

const [question, setQuestion] = useState({
texte: "Qu’est-ce qu’un mot de passe fort ?",
reponses: ["123456", "azerty", "Une phrase longue avec des caractères spéciaux"]
});
astuce

Ici, question est un objet avec :

  • une propriété texte pour le texte de la question,
  • une propriété reponses qui est un tableau de réponses possibles.

Ensuite, dans le JSX :

<h2>{question.texte}</h2>
<ul>
{question.reponses.map((reponse, index) => (
<li key={index}>{reponse}</li>
))}
</ul>
info
  • {question.texte} affiche le texte de la question.
  • La méthode .map() permet de parcourir le tableau des réponses et d’afficher chaque réponse dans une liste.
  • key={index} est nécessaire pour que React puisse identifier chaque élément de la liste.

Quelques méthodes à connaître

MéthodeDescription
useState(valeurInitiale)Initialise une variable d’état
setX(nouvelleValeur)Met à jour la valeur de l’état
.map()Permet de transformer un tableau en une liste d’éléments
{} dans JSXPermet d’insérer du JavaScript dans du HTML
key={index}Permet à React d’identifier chaque élément de la liste

Test de mémorisation / compréhension


À quoi sert `useState` en React ?


Que signifie JSX ?


Quelle est la bonne syntaxe pour afficher une variable dans du JSX ?


Quelle méthode permet d’afficher chaque élément d’un tableau ?


Pourquoi faut-il ajouter une `key` dans une boucle `.map()` ?



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

Contexte

Vous avez déjà une fonction fetchQuestion() dans le fichier app/page.tsx qui récupère une question depuis Supabase :

"use client"

import { useEffect } from 'react';
import { supabase } from '../lib/supabaseClient';

export default function Home() {
useEffect(() => {
async function fetchQuestion() {
const { data, error } = await supabase
.from('question')
.select('*')
.limit(1);

if (error) console.error(error);
else console.log(data);
}

fetchQuestion();
}, []);

return <h1>Bienvenue sur CyberQuiz</h1>;
}

Objectif

On va maintenant afficher la question du Quiz, dans la page au lieu de l’afficher dans la console.


Étape 1 : Créer une nouvelle branche Git

git checkout -b affichage-question

Étape 2 : Ouvrir la page d'accueil

  1. Ouvrez votre projet dans Visual Studio Code.
  2. Ouvrez le fichier app/page.tsx.

00_page_acceuil.png


Étape 3 : Ajouter useState

Ajouter useState pour stocker la question

Dans le fichier app/page.tsx, commencez par ajouter useState à l’import de React :

import { useEffect, useState } from 'react';

Cela permet d'utiliser useState dans notre composant React. C’est une fonction spéciale (un hook) qui permet de stocker des données qui peuvent changer.

Voici à quoi doit ressembler le début du fichier app/page.tsx :

"use client"

import { useEffect, useState } from 'react';
import { supabase } from '../lib/supabaseClient';

...

Et dans le composant Home(), ajoute cette ligne juste avant useEffect :

const [question, setQuestion] = useState<any>(null);

Pour l’instant, on utilise any pour simplifier. Cela signifie "n’importe quel type de donnée". Voici à quoi doit ressembler le début du composant Home() :

export default function Home() {
const [question, setQuestion] = useState<any>(null);

...

00_page_question.png


Étape 4 : Enregistrer la question

Dans la fonction fetchQuestion(), on va enregistrer la question dans question au lieu de juste l’afficher dans la console.

Modifiez la fonction fetchQuestion() comme ceci :

    async function fetchQuestion() {
const { data, error } = await supabase
.from('question')
.select('*');

if (error) console.error(error);
else setQuestion(data[0]); // On stocke la première question dans l’état
}

01_page_question.png

info
  • On utilise setQuestion(data[0]) pour mettre à jour la variable question avec les données récupérées depuis Supabase.
  • On a retiré .limit(1) pour récupérer toutes les questions.
  • Notez que data est un tableau, donc pour avoir la première question, on utilise data[0].

Étape 5 : Afficher la question à l’écran

Dans le return, on va maintenant afficher dynamiquement la question si elle est chargée.

Modifiez le return comme ceci :

return (
<div>
<h1>Bienvenue sur CyberQuiz</h1>

{question ? (
<div>
<h2>{question.texte}</h2>
</div>
) : (
<p>Chargement de la question...</p>
)}

</div>
);
astuce

Les accolades {} permettent d’écrire du JavaScript dans du HTML (JSX). On affiche ici le texte de la question.

02_page_question.png


Étape 6 : Testez votre travail

  1. Lancez votre projet avec la commande :
npm run dev
  1. Allez dans votre navigateur à l’adresse :
    http://localhost:3000/

  2. Vous devez voir le texte de la question s’afficher.

03_page_question.png

Nous allons maintenant améliorer l’interface avec les composants de ShadCN/UI https://ui.shadcn.com/.


Étape 7 : Installer les dépendances

Installer les dépendances de ShadCN

Dans le terminal, exécutez la commande suivante pour installer ShadCN :

npx shadcn@latest init
  • Ok to proceed? (y) → Répondez à la question par y
  • Which color would you like to use as the base color? → Appuyez sur Entrée pour garder la couleur par défaut.

04_shadcn_init.png


Étape 8 : Installer un composant

Installer un composant ShadCN (Card)

Dans le terminal, tapez :

npx shadcn@latest add card

Cela va installer le composant Card, que nous allons utiliser pour afficher la question.

05_shadcn_init.png


Étape 9 : Utiliser un composant

Utiliser le composant Card pour afficher la question

Dans le fichier app/page.tsx, importez les composants nécessaires :

import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";

Puis modifiez la partie du return qui affiche la question :

{question ? (
<Card className="max-w-xl mx-auto mt-6">
<CardHeader>
<CardTitle>Question</CardTitle>
</CardHeader>
<CardContent>
<p>{question.texte}</p>
</CardContent>
</Card>
) : (
<p>Chargement de la question...</p>
)}

Étape 10 : Testez votre travail

  1. Lancez votre projet avec la commande :
npm run dev
  1. Allez dans votre navigateur à l’adresse :
    http://localhost:3000/

  2. Vous devez voir le texte de la question s’afficher.

afficher_question.png


Étape 11 : Mettre à jour le dépôt

Mettre à jour le dépôt sur GitHub

  1. Une fois que votre modification est terminée, pensez à commiter votre travail.

    git add .
    git commit -m "Ajout de l'affichage de la question"
  2. Puis, revenez sur main et fusionnez votre branche.

    Voici la commande pour revenir sur la branche main :

    git checkout main  

    Voici la commande pour fusionner la branche affichage-question dans la branche main :

    git merge affichage-question  
  3. Et enfin, pensez à enregistrer votre travail sur GitHub.

    Voici la commande pour "pousser" la branche main :

    git push  

Pour plus de détails sur l'utilisation de Git, consultez le tutoriel Git.


Une solution complète

Code complet de app/page.tsx

Améliorer l'affichage (bonus)

Améliorer le titre avec un composant ShadCN/UI

Maintenant que vous avez installé la bibliothèque ShadCN/UI, vous pouvez explorer ses composants pour améliorer l’interface de votre application.

Objectif

Afficher le titre "Bienvenue sur CyberQuiz" de façon plus esthétique, en utilisant un composant ShadCN de votre choix.


Étape 1 : Créer une nouvelle branche Git

git checkout -b affichage-ameliore

Étape 2 : Visiter le site de ShadCN

Rendez-vous sur la documentation officielle de ShadCN :

https://ui.shadcn.com/docs/components

Vous y trouverez une galerie complète de composants : alert, badge, button, card, dialog, tooltip, typography, etc.

site_shadcn.png


Étape 3 : Choisir un composant

Parmi les composants proposés, choisissez-en un qui pourrait servir à mettre en valeur le titre de votre page, par exemple :

  • Alert pour un encadré stylisé
  • Badge pour ajouter un petit label
  • Typography pour styliser le texte
  • Popover ou Tooltip pour ajouter une info-bulle
  • Sheet ou Dialog pour une introduction animée
  • Ou même Button, si vous voulez rendre le titre interactif

Étape 4 : Ajouter le composant

1. Installez le composant avec la commande :

npx shadcn@latest add nom-du-composant

Par exemple :

npx shadcn@latest add alert

05_shadcn_init.png

2. Importez le composant dans app/page.tsx :

import { Alert, AlertTitle, AlertDescription } from "@/components/ui/alert";

3. Remplacez le titre actuel par une version plus esthétique :

<Alert className="max-w-xl mx-auto mt-4">
<AlertTitle>Bienvenue sur CyberQuiz</AlertTitle>
<AlertDescription>
Préparez-vous à tester vos connaissances !
</AlertDescription>
</Alert>

06_shadcn_init.png

afficher_question_v2.png


Étape 5 : Personnalisez l'affichage

Vous pouvez :

  • Ajouter une icône
  • Changer les couleurs avec Tailwind CSS
  • Ajouter une animation ou un effet au chargement
  • Utiliser un composant différent pour un rendu original

Exemple de rendu

Voici un exemple de rendu avec le composant Alert :

<Alert className="bg-blue-50 border-blue-300 text-blue-800 max-w-xl mx-auto mt-6">
<AlertTitle className="text-xl font-semibold">Bienvenue sur CyberQuiz</AlertTitle>
<AlertDescription>
Un quiz pour tester vos connaissances en cybersécurité.
</AlertDescription>
</Alert>

afficher_question_v3.png


Étape 6 : Mettre à jour le dépôt

Mettre à jour le dépôt sur GitHub

  1. Une fois que votre modification est terminée, pensez à commiter votre travail.

    git add .
    git commit -m "Amélioration de l'affichage"
  2. Puis, revenez sur main et fusionnez votre branche.

    Voici la commande pour revenir sur la branche main :

    git checkout main  

    Voici la commande pour fusionner la branche affichage-ameliore dans la branche main :

    git merge affichage-ameliore  
  3. Et enfin, pensez à enregistrer votre travail sur GitHub.

    Voici la commande pour "pousser" la branche main :

    git push  

Pour plus de détails sur l'utilisation de Git, consultez le tutoriel Git.


Une solution complète bonus

Code complet de app/page.tsx

À vous de jouer

Explorez les composants, testez, combinez, amusez-vous avec l'interface !

L'objectif est de rendre votre application plus agréable à utiliser et plus professionnelle visuellement.

Vous pouvez choisir un autre composant, comme Tooltip, Badge ou Dialog, et l’adapter selon vos préférences.

N’hésitez pas à consulter la documentation https://ui.shadcn.com/docs/components pour découvrir toutes les possibilités offertes par ShadCN/UI !