Aller au contenu

Programmation JavaScript/React.js

Un livre de Wikilivres.
Logo de React.

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 :

Pour crĂ©er une application React vide sous Linux :

sudo npm install --global npx
npx create-react-app ReactApp
cd ReactApp
npm start

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 attribut state. Cette classe possĂšde alors une mĂ©thode nommĂ©e render retournant ce qu'il faut afficher, incluant d'autres composants. Son Ă©tat doit alors ĂȘtre modifiĂ© par la mĂ©thode setState 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.
 La syntaxe permettant d'inclure ainsi du code HTML dans le JavaScript sans guillemet est appelĂ©e JSX.

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

Logo

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>

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.

 On retrouve les accolades en dehors des imports pour interprĂ©ter les variables en JSX[5].

Exemple :

import React from 'react'
import { render } from 'react-dom'
import HelloWorld from './HelloWorld'

const you = "me"
render(
  <HelloWorld name={you}/>
  document.querySelector('#app'),
)

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
  • React.createClass contient les fonctions.
  • ReactDOM les invoque[8]. ReactDOM.render() change l'affichage.

On peut le tester en ligne sur :

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.

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]