<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>React dynamique :: App Web</title><link>https://cegepmv.github.io/420-211/3-apps-dynamiques/index.html</link><description>Dans cette section, nous allons apprendre à développer des applications interactives et dynamiques avec React.
Jusque là, nous avons vu comment fonctionne React dans les coulisses, les spécificités de la syntaxe JSX, comment créer des pages Web statiques avec React et diviser notre page web en composants.
Ensuite, nous avons appris à créer des composants réutilisables, à l’aide de props, faire passer des données dans les composants pour garantir leur réutilisabilité, ce qui nous a permis d’utiliser des données statiques (avec des objets JS) pour générer des portions de nos pages Web (Cards, ListItems etc…).</description><generator>Hugo</generator><language>fr-fr</language><atom:link href="https://cegepmv.github.io/420-211/3-apps-dynamiques/index.xml" rel="self" type="application/rss+xml"/><item><title>Composants contrôlés</title><link>https://cegepmv.github.io/420-211/3-apps-dynamiques/5-composants-controles/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cegepmv.github.io/420-211/3-apps-dynamiques/5-composants-controles/index.html</guid><description>Lorsqu’on crée un formulaire en HTML, les champs &lt;input>, &lt;textarea>, ou &lt;select> gèrent généralement leur propre état (ce qu’on appelle des composants non contrôlés).
En React, la bonne pratique est d’utiliser des composants contrôlés :
Cela signifie que c’est React qui garde le contrôle sur la valeur du champ, grâce au state.
En quoi est-ce pertinent d’utiliser des composants contrôlés ? On peut synchroniser l’interface utilisateur (UI) avec des données internes. On peut valider, filtrer ou transformer les données au fur et à mesure que l’utilisateur tape. On garde le plein contrôle sur la logique du formulaire. Exemple simple Voici un champ de texte contrôlé par React :</description></item><item><title>Écouteurs d'évènements</title><link>https://cegepmv.github.io/420-211/3-apps-dynamiques/1-event-listeners/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cegepmv.github.io/420-211/3-apps-dynamiques/1-event-listeners/index.html</guid><description>En Javascript, on utilise des écouteurs d’évènenements (Event Listeners) pour permettre à l’utilisateur d’interagir avec notre application.
Dans une application Javascript “vanille”, il y a 2 façons d’ajouter des événements :
Avec la méthode .addEventListener() : &lt;button id="btn"> const btn = document.getElementById('btn'); function handleClick() { console.log("Le bouton a été cliqué"); } btn.addEventListener("click", handleClick); Avec onclick="fonction()" sur l’élément HTML qu’on veut écouter : &lt;button onclick="fonction()"> function fonction() { // Tâche à faire quand le bouton est cliqué console.log("Le bouton a été cliqué"); } Cette deuxième méthode ressemble beaucoup à celle qu’on utilise avec React. Par exemple. Si on veut faire en sorte que, lorsque nous cliquons sur un bouton, quelque chose est affiché dans la console, il suffit simplement d’ajouter un onClick={fonction} au bouton. Contrairement à la méthode précédente, vous remarquerez qu’on utilise un C majuscule :</description></item><item><title>useState()</title><link>https://cegepmv.github.io/420-211/3-apps-dynamiques/2-usestate/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cegepmv.github.io/420-211/3-apps-dynamiques/2-usestate/index.html</guid><description>Props vs State Props fait référence aux propriétés transmises à un composant pour qu’il fonctionne correctement, de la même manière qu’une fonction reçoit des paramètres. Un composant recevant des props n’est pas autorisé à les modifier (i.e. il sont immuables). function addTwoNumbers(a, b) { // NE FAITES PAS ÇA a = 42 return a + b } console.log(addTwoNumbers(1, 2)) function Navbar(props) { // NE FAITES PAS ÇA props.logoIcon = "some-other-icon.png" } &lt;Navbar logoIcon="spatula.png" /> State fait référence aux valeurs gérées par le composant, comme les variables déclarées à l’intérieur d’une fonction. Chaque fois que vous avez des valeurs changeantes qui doivent être sauvegardées/affichées, vous utiliserez probablement un state. Gestion de variables avec state Prenons un exemple pour comprendre l’utilité des states en React :</description></item><item><title>Formulaires</title><link>https://cegepmv.github.io/420-211/3-apps-dynamiques/3-formulaires/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cegepmv.github.io/420-211/3-apps-dynamiques/3-formulaires/index.html</guid><description>Un des outils permettant à une application dynamique de récupérer des données entrées par un utilisateur sont les formulaires. Ces données sont le plus souvent envoyées à un serveur (API) pour y être traitées.
Exemple de cas d’utilisation de formulaires :
Inscription à une application Connexion à un site Les bases ​ App.jsx index.css function App() { return ( &lt;section className="container"> &lt;h2>Inscription&lt;/h2> &lt;form className="form"> &lt;label htmlFor="email">Email :&lt;/label> &lt;input type="email" id="email" name="email" placeholder="john-doe@exemple.com" /> &lt;label htmlFor="password">Mot de passe :&lt;/label> &lt;input type="password" id="password" name="password" /> &lt;button className="submit-btn">Inscription&lt;/button> &lt;/form> &lt;/section> ) } export default App * { margin: 0; padding: 0; } body{ background-color: #2CA1CC; font-family: 'Roboto', sans-serif; } .container{ width: 400px; margin: auto; margin-top: 50px; padding-bottom: 30px; background-color: #fff; border-radius:5px; color: #1F1F1F; } .container h2 { padding: 20px; text-align: center; } .form { display: flex; flex-direction: column; margin: 10px 40px 0; } .form input { margin: 10px 0 20px; padding: 10px; width:90%; background-color: #EAEDF2; border: none; border-radius:3px; color:#A0A0A0; } .form textarea { resize: none; margin: 10px 0 20px; padding: 10px; width:90%; height: 15vh; background-color: #EAEDF2; border: none; border-radius:3px; color:#A0A0A0; } .form fieldset { display: flex; flex-direction: column; border: none; margin: 10px 0; } .form fieldset legend { margin-bottom: 5px; } .form fieldset input { width:fit-content; margin: 10px 10px 7px 2px; } .form fieldset label { width:fit-content; } .form .submit-btn { border:none; padding: 10px; border-radius:5px; color:#F7F6FF; cursor: pointer; width: 96%; margin-bottom:10px; margin-top: 20px; background-color: #19B8D6; height: 37px; } Toutes les entrées d’un formulaire doivent être à l’intérieur d’une balise &lt;form></description></item><item><title>Rendus conditionnels</title><link>https://cegepmv.github.io/420-211/3-apps-dynamiques/4-rendu-conditionnel/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cegepmv.github.io/420-211/3-apps-dynamiques/4-rendu-conditionnel/index.html</guid><description>Dans une application dynamique React, il est possible d’afficher du contenu sur la page en fonction de la valeur d’un state, en utilisant la technique du rendu conditionnel (conditionnal rendering).
Rendu conditionnel avec &amp;&amp; ​ App.jsx Joke.jsx jokesData.js import Joke from "./components/Joke" import jokesData from "/src/assets/jokesData" export default function App() { const jokeElements = jokesData.map(joke => { return ( &lt;Joke key={joke.id} setup={joke.question} punchline={joke.punchline} /> ) }) return ( &lt;div> {jokeElements} &lt;/div> ) } import {useState} from "react" export default function Joke(props) { const [isShown, setIsShown] = useState(false) function toggleShown() { setIsShown(prevShown => !prevShown) } return ( &lt;div> {props.setup &amp;&amp; &lt;h3>{props.setup}&lt;/h3>} {isShown &amp;&amp; &lt;p>{props.punchline}&lt;/p>} &lt;button onClick={toggleShown}>Show punchline&lt;/button> &lt;hr /> &lt;/div> ) } export default [ { id: 1, question: "Que demande un zéro à un huit ?", punchline: "T'as mis une ceinture ?" }, { id: 2, question: "Pourquoi les souris n'aiment pas jouer aux devinettes ?", punchline: "Parce qu'elles ont peur de donner leur langue au chat !" }, { id: 3, question: "Pourquoi est-ce que les éléphants ne peuvent pas utiliser d'ordinateurs ?", punchline: "Parce qu'ils ont peur de la souris !" }, { id: 4, question: "Quel est le légume le plus explosif ?", punchline: "La grenade !" }, { id: 5, question: "Quel est le comble pour un électricien ?", punchline: "D'avoir les idées noires !" }, { id: 6, question: "Quel est le comble pour un vélo ?", punchline: "C’est de perdre les pédales !" }, ] Exercice 1 Modifiez le composant App() ci-dessous pour afficher le &lt;h1> uniquement si le state unreadMessages n’est pas vide :</description></item></channel></rss>