Programmation JavaScript/React.js

Introduction
[modifier | modifier le wikicode]React.js est un framework JavaScript développé par Facebook depuis 2013, qui privilégie la programmation déclarative à la programmation impérative [1] pour développer des applications monopages (SPA) performantes, car il ne modifie que les fragments de page nécessaires[2] en asynchrone.
React est utilisé dans de nombreuses applications à fort trafic, telles que Netflix, Yahoo, Airbnb, Sony, Atlassian, Facebook, Instagram ou encore WhatsApp.
De plus, le framework React Native permet d'utiliser la syntaxe React pour développer des applications mobiles.
Par ailleurs, il existe des outils pour l'utiliser avec le framework PHP Symfony en back-end, notamment :
- Via le framework Stimulus qui permet d'appeler des composants React depuis les templates Twig.
- Via la bibliothÚque API Platform qui permet de générer un client React à partir de son API PHP[3].
Installation
[modifier | modifier le wikicode]Pour créer une application React vide sous Linux :
sudo npm install --global npx
npx create-react-app ReactApp
cd ReactApp
npm start
Composants
[modifier | modifier le wikicode]React fonctionne Ă base de composants dans lesquels on injecte des "props" (properties)[4].
Le but est de dĂ©couper l'application en composants rĂ©utilisables. Il est recommandĂ© de les dĂ©clarer avec une majuscule, et ils peuvent ĂȘtre des fonctions, des fonctions flĂ©chĂ©es, ou des classes (depuis ES6). Exemple :
// Fonction
function HelloWorldFunction(props) {
return <b>HelloWorld!, {props.name}</b>;
}
// Fonction fléchée
const HelloWorldArrowFunction = () => {
return <b>HelloWorld!, {props.name}</b>;
};
// Classe
import React from 'react'
class HelloWorldClass extends React.Component {
render() {
return <b>HelloWorld!, {this.props.name}</b>;
}
}
Il y a donc deux façons de créer un composant :
- En créant une sous-classe de
React.Component
, gérant son état dans un attributstate
. Cette classe possÚde alors une méthode nomméerender
retournant ce qu'il faut afficher, incluant d'autres composants. Son Ă©tat doit alors ĂȘtre modifiĂ© par la mĂ©thodesetState
qui fusionne l'objet spécifié avec l'état courant et déclenche un nouvel affichage du composant si nécessaire. - En créant une fonction ayant les propriétés comme arguments, qui retourne ce qu'il faut afficher. Cette fonction utilise alors des hooks qui permettent de retrouver les états des précédents affichages ; ces états sont créés lors du premier affichage.
JSX
[modifier | modifier le wikicode]Cette syntaxe permet de mĂ©langer du code XML (HTML ou composants React) au JavaScript. Le JavaScript est intĂ©grĂ© lui-mĂȘme dans le XML entre des accolades pour l'interpolation, c'est-Ă -dire interprĂ©ter des variables, calculer une expression, appeler une fonction...
Cette syntaxe particuliÚre ne fait pas partie du JavaScript standard compris par les navigateurs et exige donc une compilation avant que l'application soit exécutée. Il faut l'installer avec :
yarn add @babel/preset-react --dev
La syntaxe HTML des JSX est légÚrement différente :
- Il faut utiliser l'attribut "className" au lieu de "class",
- Il faut utiliser l'attribut "htmlFor" au lieu de "for",
- L'attribut "style" doit ĂȘtre dĂ©fini comme un dictionnaire de rĂšgles de style, en retirant les tirets du nom des attributs tout en mettant la lettre suivante en majuscule.
Exemple :
return <div className="main-title" style={{ fontSize: '36pt', fontWeight: 'bold' }}>
Un exemple
</div>
Appels
[modifier | modifier le wikicode]Pour invoquer un composant, il faut l'importer et le mettre dans une balise XML, avec ses props comme attributs. Pour importer une fonction au lieu de tout un fichier, la mettre entre accolades.
Exemple :
import React from 'react'
import { render } from 'react-dom'
import HelloWorld from './HelloWorld'
const you = "me"
render(
<HelloWorld name={you}/>
document.querySelector('#app'),
)
Ătats
[modifier | modifier le wikicode]Les Ă©tats des composants peuvent ĂȘtre gĂ©rĂ©s par la bibliothĂšque Redux, ou depuis React 16.8 (en 2019) par des hooks[6] dont voici la liste[7] :
- useCallback
- useContext
- useDebugValue
- useEffect
- useImperativeHandle
- useLayoutEffect
- useMemo : mémorise un résultat pour gagner en performances en évitant de le recalculer ensuite.
- useReducer
- useRef
- useState
Cycle de vie
[modifier | modifier le wikicode]React.createClass
contient les fonctions.ReactDOM
les invoque[8]. ReactDOM.render() change l'affichage.
On peut le tester en ligne sur :
- https://codepen.io/gaearon/pen/gwoJZk?editors=0010.
- https://codesandbox.io/s/react-typescript-react-ts (qui supporte le TypeScript en plus).
Voici les méthodes magiques qui s'exécutent automatiquement selon l'étape du composant[9] :
- constructor : s'exécute à l'initialisation de la classe.
- componentWillMount() : s'exécute juste aprÚs le constructeur.
- componentDidMount() : s'exécute aprÚs "componentWillMount", quand le composant s'affiche.
- componentDidUpdate() : s'exécute quand le composant affiché se rafraichit, suite à une modification d'état.
Fragments
[modifier | modifier le wikicode]La valeur retournĂ©e pour l'affichage d'un composant ne peut pas contenir plusieurs balises HTML sĆurs, elles doivent ĂȘtre encapsulĂ©es dans une seule. Or, dans le cas des balises "li" ou "td", les encapsuler ajouterait un nĆud qui les sĂ©parerait de leur balise parente ("ul" ou "table").
Les fragments sont la solution Ă cela en permettant d'encapsuler plusieurs Ă©lĂ©ments[10]. Ils peuvent ĂȘtre reprĂ©sentĂ©s par des balises vides.
Exemple :
return <>
<span id="nom">Taille : </span>
<span id="valeur">{fileSize} octets</span>
</>
BibliothĂšques
[modifier | modifier le wikicode]Il existe beaucoup de bibliothĂšques logicielles utilisables en React[11].
Par exemple :
- Axios pour le client HTTP[12].
- Formik pour les formulaires HTML[13].
- Griddle pour afficher des tableaux[14].
- React Router pour le routing client[15]. Par exemple pour gérer les URL, on utilise sa classe Route.
- React Select pour des sélections HTML[16].
- Redux pour stocker des états.
Exemple d'installation pour les select HTML :
yarn add react-select
Références
[modifier | modifier le wikicode]- â https://facebook.github.io/react/
- â https://fr.reactjs.org/
- â https://api-platform.com/docs/client-generator/react/#generating-a-progressive-web-app
- â https://react.dev/learn/passing-props-to-a-component
- â https://fr.reactjs.org/docs/introducing-jsx.html
- â https://fr.reactjs.org/docs/hooks-intro.html
- â https://fr.reactjs.org/docs/hooks-reference.html
- â https://www.w3schools.com/react/
- â https://react.dev/reference/react/Component
- â https://fr.reactjs.org/docs/fragments.html
- â https://www.bytestechnolab.com/blog/20-top-react-ui-components-in-2022/
- â https://axios-http.com/fr/docs/intro
- â https://formik.org/
- â https://griddlegriddle.github.io/Griddle/
- â https://reactrouter.com/fr/main/start/overview
- â https://react-select.com