Les premiers pas
React.js est une bibliothèque JavaScript open source, développée et maintenue par Facebook, conçue pour créer des interfaces utilisateur dynamiques et interactives. Sa principale force réside dans son approche déclarative et son utilisation des composantes. Contrairement à d'autres bibliothèques ou cadres d'applications front-end, React.js se concentre uniquement sur la vue (le "V" dans le modèle MVC), permettant aux développeurs de construire des interfaces réactives et modulaires. Cette flexibilité a fait de React.js un choix populaire pour les applications Web modernes.
React simplifie le développement d'applications complexes grâce à son modèle basé sur des composantes réutilisables. Cela permet de diviser une interface utilisateur en petites parties indépendantes et gérables. En outre, React.js utilise un DOM virtuel (Virtual DOM), optimisant les performances en réduisant le nombre d'opérations coûteuses sur le DOM réel. Il offre également une intégration facile avec d'autres bibliothèques ou cadres d'applications, ce qui le rend adapté à une variété de projets, qu'il s'agisse de petites applications ou de systèmes complexes.
Les bases de React.js : Les composantes et JSX
Le coeur de React.js repose sur les composantes, étant des blocs de construction réutilisables. Une composante peut être une simple fonction JavaScript ou une classe retournant du code JSX. JSX (JavaScript XML) est une extension de syntaxe permettant de mélanger du HTML dans le code JavaScript.
Gestion de l'état avec React.js
Une autre caractéristique clef de React.js est sa capacité à gérer l'état d'une application. Chaque composante peut avoir un état interne (state) déterminant comment il se comporte ou ce qu'il affiche. Par exemple, un bouton changeant de couleur lorsqu'il est cliqué peut utiliser l'état pour conserver la couleur actuelle. Avec les crochets, comme useState, React.js rend la gestion de l'état plus intuitive et accessible dans les composantes fonctionnelles :
Créer votre première application React.js
Pour démarrer avec React, vous pouvez utiliser l'outil Create React App, configurant une base de projet prête à l'emploi. Après avoir installé Node.js, exécutez la commande suivante dans votre terminal :
| npx create-react-app mon-premier-projet |
Cela crée une structure de projet avec toutes les dépendances nécessaires. Une fois installé, naviguez dans le dossier du projet et lancez le serveur de développement :
|
cd mon-premier-projet npm start |
Vous verrez une application de base s'ouvrir dans votre navigateur. À partir de là, vous pouvez commencer à modifier le code dans le fichier src/App.js pour explorer et construire votre première interface avec React.js.
Créer et imbriquer des composantes
Les applications React.js sont constituées de composantes. Une composante est un élément de l'interface utilisateur (UI) possédant sa propre logique et sa propre apparence. Une composante peut être aussi petit qu'un bouton ou aussi grand qu'une page entière.
Les composantes React.js sont des fonctions JavaScript renvoyant un balise :
Maintenant que vous avez déclaré MyButton, vous pouvez l'imbriquer dans une autre composante :
Notez que <MyButton />; commence par une majuscule. C'est ainsi que vous savez qu'il s'agit d'une composante React.js. Les noms des composantes React doivent toujours commencer par une majuscule, tandis que les balises HTML doivent être en minuscules.
Les mots clefs export default spécifient la composante principale du fichier. Si vous n'êtes pas familier avec certains éléments de la syntaxe JavaScript, consulter la section JavaScript.
Écrire du balisage avec JSX
La syntaxe de balisage que vous avez vue ci-dessus s'appelle JSX. Elle est facultative, mais la plupart des projets React.js utilisent JSX pour sa commodité. Tous les outils que nous recommandons pour le développement local prennent en charge JSX dès la sortie de la boîte.
JSX est plus strict que HTML. Vous devez fermer les balises comme <br />. Votre composante ne peut pas non plus renvoyer plusieurs balises JSX. Vous devez les encapsuler dans un parent partagé, comme un <div>...</div> ou une enveloppe <>...</> vide :
Ajout de styles
Dans React, vous spécifiez une classe CSS avec className. Cela fonctionne de la même manière que l'attribut de classe HTML :
- <img className="avatar" />
Ensuite, vous écrivez les règles CSS pour cela dans un fichier CSS séparé :
- /* Dans votre CSS */
- .avatar {
- border-radius: 50%;
- }
React ne prescrit pas la manière d'ajouter des fichiers CSS. Dans le cas le plus simple, vous ajouterez une balise <link> à votre code HTML. Si vous utilisez un outil de création ou un cadre d'application, consultez sa documentation pour savoir comment ajouter un fichier CSS à votre projet.
Affichage des données
JSX vous permet d'insérer du balise dans JavaScript. Les accolades vous permettent de revenir en arrière dans JavaScript afin que vous puissiez intégrer une variable de votre code et l'afficher à l'utilisateur. Par exemple, cela affichera user.name :
- return (
- <h1>
- {user.name}
- </h1>
- );
Vous pouvez également «échapper vers JavaScript» à partir des attributs JSX, mais vous devez utiliser des accolades au lieu de guillemets. Par exemple, className="avatar" transmet la chaîne de caractères «avatar» comme classe CSS, mais src={user.imageUrl} lit la valeur de la variable user.imageUrl de JavaScript, puis transmet cette valeur comme attribut src :
En React.js, l'attribut style={{}} permet d'ajouter des styles directement à un élément HTML en ligne en utilisant une syntaxe JavaScript. Contrairement au style CSS traditionnel, où les règles de style sont écrites sous forme de chaînes de caractères ou dans des fichiers séparés, React.js utilise un objet JavaScript pour définir ces styles.
L'attribut style dans React attend un objet JavaScript. Cet objet contient des paires clef-valeur, où les clefs représentent les noms des propriétés CSS (en camelCase) et les valeurs définissent les styles correspondants.
Voici un exemple simple :
Rendu conditionnel
Dans React.js, il n'existe pas de syntaxe spéciale pour écrire des conditions. Au lieu de cela, vous utiliserez les mêmes techniques que celles que vous utilisez pour écrire du code JavaScript classique. Par exemple, vous pouvez utiliser une instruction if pour inclure JSX de manière conditionnelle :
Si vous préférez un code plus compact, vous pouvez utiliser l'opérateur conditionnel «?». Contrairement à if, il fonctionne dans JSX :
Lorsque vous n'avez pas besoin de la branche else, vous pouvez également utiliser une syntaxe logique && plus courte :
Toutes ces approches fonctionnent également pour spécifier des attributs de manière conditionnelle. Si vous n'êtes pas familier avec une partie de cette syntaxe JavaScript, vous pouvez commencer par toujours utiliser if...else.
Rendu des listes
Vous vous appuierez sur des fonctionnalités JavaScript comme la boucle for et la fonction array map() pour restituer des listes de composantes.
Par exemple, supposons que vous ayez un tableau de produits :
- const products = [
- { title: "Chou", id: 1 },
- { title: "Ail", id: 2 },
- { title: "Pomme", id: 3 },
- ];
À l'intérieur de votre composante, utilisez la fonction map() pour transformer un tableau de produits en un tableau d'éléments <li> :
Notez que <li> possède un attribut clef. Pour chaque élément d'une liste, vous devez transmettre une chaîne ou un numéro identifiant de manière unique cet élément parmi ses frères et soeurs. En général, une clef doit provenir de vos données, comme un ID de base de données. React.js utilise vos clefs pour savoir ce qui s'est passé si vous insérez, supprimez ou réorganisez ultérieurement les éléments.
Répondre aux événements
Vous pouvez répondre aux événements en déclarant des fonctions de gestion d'événements à l'intérieur de vos composantes :
Notez que onClick={handleClick} n'a pas de parenthèses à la fin ! N'appelez pas la fonction de gestion d'événements : il vous suffit de la transmettre. React appellera votre gestionnaire d'événements lorsque l'utilisateur cliquera sur le bouton.
Mise à jour de l'écran
Vous souhaiterez souvent que votre composante «mémorise» certaines informations et les affiche. Par exemple, vous souhaiterez peut-être compter le nombre de fois qu'un bouton est cliqué. Pour ce faire, ajoutez state à votre composante.
Tout d'abord, importez useState depuis React :
- import { useState } from "react";
Vous pouvez maintenant déclarer une variable d'état à l'intérieur de votre composante :
- function MyButton() {
- const [count, setCount] = useState(0);
- /* ... */
Vous obtiendrez deux choses à partir de useState : l'état actuel (count) et la fonction vous permettant de le mettre à jour (setCount). Vous pouvez leur donner n'importe quel nom, mais la convention est d'écrire [quelque chose, setSomething].
La première fois que le bouton s'affiche, count sera 0 car vous avez passé 0 à useState(). Lorsque vous souhaitez modifier l'état, appelez setCount() et transmettez-lui la nouvelle valeur. Cliquer sur ce bouton incrémentera le compteur :
React.js appellera à nouveau votre fonction de composante. Cette fois, le nombre sera de 1. Puis il sera de 2. Et ainsi de suite. Si vous restituez la même composante plusieurs fois, chacun obtiendra son propre état. Notez comment chaque bouton «se souvient» de son propre état de comptage et n'affecte pas les autres boutons.
Utilisation des crochets
Les fonctions commençant par use sont appelées crochets (ou Hook en anglais). useState est un crochet intégré fourni par React.js. Vous pouvez trouver d'autres crochets intégrés dans la référence API. Vous pouvez également écrire vos propres crochets en combinant ceux existants.
Les crochets sont plus restrictifs que les autres fonctions. Vous ne pouvez appeler des crochets qu'en haut de vos composantes (ou d'autres crochets). Si vous souhaitez utiliser useState dans une condition ou une boucle, extrayez une nouvelle composante et placez-le là.
Partage de données entre composantes
Dans l'exemple précédent, chaque MyButton avait son propre décompte indépendant, et lorsque chaque bouton était cliqué, seul le décompte du bouton cliqué changeait.
Cependant, vous aurez souvent besoin de composantes pour partager des données et toujours les mettre à jour ensemble.
Pour que les deux composantes MyButton affichent le même nombre et se mettent à jour ensemble, vous devez déplacer l'état des boutons individuels «vers le haut» vers la composante le plus proche les contenant tous.
Désormais, lorsque vous cliquez sur l'un des boutons, le nombre dans MyApp change, ce qui modifie les deux nombres dans MyButton. Voici comment vous pouvez exprimer cela dans le code.
Tout d'abord, déplacez l'état de MyButton vers MyApp :
Ensuite, transmettez l'état de MyApp à chaque MyButton, ainsi que le gestionnaire de clics partagé. Vous pouvez transmettre des informations à MyButton à l'aide des accolades JSX, comme vous l'avez fait précédemment avec des balises intégrées telles que <img> :
Les informations que vous transmettez ainsi sont appelées props. La composante MyApp contient désormais l'état count et le gestionnaire d'événements handleClick, et les transmet tous deux en tant qu'accessoires à chacun des boutons.
Enfin, modifiez MyButton pour lire les accessoires que vous avez transmis à partir de sa composante parent :
Lorsque vous cliquez sur le bouton, le gestionnaire onClick se déclenche. Le prop onClick de chaque bouton a été défini sur la fonction handleClick dans MyApp, donc le code à l'intérieur de celui-ci s'exécute. Ce code appelle setCount(count + 1), incrémentant la variable d'état count. La nouvelle valeur count est transmise en tant que prop à chaque bouton, donc ils affichent tous la nouvelle valeur. C'est ce qu'on appelle «remonter l'état». En déplaçant l'état vers le haut, vous l'avez partagé entre les composantes.