React est une bibliothèque JavaScript créée par Meta (Facebook). React permet notamment de lier les données (state/store) avec l’UI (le DOM).
Il est possible d’installer React de plusieurs façons :
- Via un CDN ou un node_modules (pour une installation progressive et modulaire).
- Via un CLI, comme Create react app ou vite (pour une installation clé en main, plus rapide, professionnelle et robuste).
$ npx create-react-app my-app
$ cd my-app
$ npm start
|-/node_modules
|-/public
|-/src
|-.gitignore
|-package-lock.json
|-package.json
|-README.md
node\_modules
: Ensemble de tous les modules et les modules requis pour l’application.public
: Dossier contenant des fichiers statiques non compilés. Il y a notamment le fichier index.html qui sera envoyé. Ce fichier contient unediv
qui a pour id root, et permet à React de cibler l’élément afin d’y injecter le code de notre app.src
: Dossier contenant toue la logique de notre application (le fichier JS racine, les composants, …).gitignore
: Fichier fourni contenant les éléments que nous ne souhaitons pas versionnés.package.json
etpackage-lock.json
: Fichiers nécessaires à la gestion des modules et leur installation.README.md
: Documentation réalisée par l’équipe de create-react-app.
Les composants permettent de créer du code réutilisable.
Voici l’exemple d’un composant fonctionnel.
// Books.js
export default function Books(props) {
return (
<>
<h2>{props.title}</h2>
<h3>{props.author}</h3>
<p>{props.resume}</p>
</>
)
}
Les éléments importants sont :
function Books
: Nous créeons une fonction qui porte le nom ShortStory (premiere lettre en majuscule par convention).export default
: Afin de pouvoir utiliser ce code dans une autre fichier (dans lequel nous allons l’importer), nous devons l’export. Le mot clé default indique que c’est la fonction exporté lorsque nous ne spécifions pas ce que nous voulons.return(...)
: Return permet de renvoyer notre composant sans quoi nous ne pourrions rien afficher.<>...</>
: Balise vide qui contient notre code et permet de l’encapsuler (il n’est pas possible de renvoyer à la racine des éléments adjacents).…
: Ce qu’il y a au sein de la balise vide constitue notre code. Le fait d’avoir du balisage HTML dans notre fichier JS est possible car il s’agit d’un extension syntaxique nommée JSX.
// App.js
import Books from "./components/Books";
export default function App() {
const [stories, setStories] = useState([
{
title: "Ulysse",
author: "James Joyce",
content: "L'action d'Ulysse se passe en un jour, à Dublin, en 1904.",
},
{
title: "A la recherche du temps perdu",
author: "Marcel Proust",
content: "À l’instant où il mit en bouche la madeleine, le narrateur fut pris d’une étrange sensation : les souvenirs de son enfance ressuscitèrent.",
},
{
title: "Les Raisins de la colère",
subtitle: "John Steinbeck",
content: "L’Amérique des années 30, en pleine dépression, à travers la famille Joad chassée de ses terres par la “Banque” et l’industrialisation des cultures.",
}
]);
return(
<>
<h1>📚 Short story App</h1>
stories.map(story => {
return(<Books title={story.title} author={story.author} resume={story.resume}/>);
})
</>
)
};
useState
: Hook permettant d’affecter une valeur à un élément du state (ensemble de l’état des données accessible au sein de l’application React). Le premier élément du tableaustories
constitue la variable contenant l’information.setStories
constitue la fonction permettant de mettre à jour la valeurstories
.- Pour appeler le composant
Book
, nous l’implémentons comme une balise HTML. Il contient des paramètres qui sont passés du composant parentApp
vers le composant enfantBooks
. Ces propriétés sont accessible via la variableprops
du composantBook
.
- Le nom de la variable de l’objet que nous importons doit-il être le même que celui de la variable du composant ?
Un propriété ou prop, permet d’envoyer des données aux composants utilisés. Par exemple, notre fichier App.js
envoie les données au composant enfant Book.js
.
// App.js (simplifié)
<App>
<Books title={story.title}/>
</App>
// Books.js (simplifié)
function Books(props) {
return (<h2>{props.title}</h2>)
}
// On accède à la valeur de title grâce à notre variable props, que l'on a créé dans App.js
Les hooks permettent d’utiliser certaines fonctionnalités, notamment le state sans avoir besoin de classes (obligatoire avant). Il existe plusieurs hooks natifs et vous pouvez écrire les votre.
Deux hooks sont particulièrement importants :
useState()
que nous avons déjà vu. Il permet déclarer une valeur au sein du state et de pouvoir la modifier avec la méthode appropriée (stories
etsetStories()
dans notre exemple) .useEffect(function, dependencies?)
permet de lancer une fonction lorsque le composant est appelé une première fois. Ensuite, lorsque les dépendances sont modifiées, le fonction est relancée.Il est important d’indiquer ou non des dépendances car il peut y avoir un effet de bord entrainant une boucle infinie.Généralement, vous utiliserez au débutuseEffect()
pour vos call API.
// App.js
import { useEffect, useState } from "react";
import Books from "./components/Books";
export default function App() {
const [stories, setStories] = useState([])
useEffect(() => {
// cette URL est un exemple. Elle ne fonctionne pas.
fetch("https://api.com/books")
.then(res => { return res.json() })
.then(data => { setStories(data)})
/* Ici les données ne sont pas chargées instantannéments, même si à l'échelle humaine elles peuvent le sembler.Le traiement JS est tel qu'au départ, stories vaut []. Il faut donc gérer ce cas avec des conditions.
*/
}, [] ) // Ici je mets un tableau vide car je ne veux pas que celle-ci entraine un nouveau rendu.
return(
<>
<h1>📚 Short story App</h1>
stories.map(story => {
return(<Books title={story.title} author={story?.author} resume={story.resume}/>);
})
</>
)
};
React Router est une solution développé par la communauté React, devenue une solution officielle.
$ npm install react-router-dom
// Dans votre fichier principal (par exemple `index.js` ou `App.js`)
import ReactDOM from "react-dom/router";
import {CreateBrowserRouter, RouterProvider} from "react-router-dom";
import Books from "./components/Books";
const router = createBrowserRouter([
{
path: "/books",
element: <Books/>
}
])
ReactDOM.createRoot(document.getElementById("root")).render(
<React.StrictMode>
<RouterProvider router={router} />
</React.StrictMode>
);
Documentation officielle :
- React doc officielle
- Create react app
- React router
- Dan Abramov
- Michael Jackson (le développeur pas le king of pop 🕺)
- Remix
- Next
- Remix X Shopify