L'API haut-niveau de React
L’objet React
est le point d’entrée de la bibliothèque React. Si vous chargez React depuis une balise <script>
, ces API de haut-niveau sont disponibles depuis l’objet global React
. Si vous utilisez npm avec la syntaxe ES6, vous pouvez écrire : import React from 'react'
. Si vous utilisez npm avec la syntaxe ES5, vous pouvez écrire : var React = require('react')
.
Aperçu
Composants
Les composants React vous permettent de découper une interface utilisateur (UI, pour User Interface, NdT) en blocs indépendants et réutilisables, ce qui vous permet de concevoir chaque partie en isolation. Un composant React peut être défini en étendant les classes React.Component
ou React.PureComponent
.
Si vous n’utilisez pas les classes ES6, vous pouvez utiliser le module create-react-class
à la place. Lisez React sans ES6 pour plus de détails.
Un composant React peut aussi être défini via une fonction que l’on pourra choisir d’enrober avec React.memo
:
Créer des éléments React
Nous vous recommandons d’utiliser JSX pour définir à quoi ressemblera votre UI. Tous les éléments JSX ne sont que du sucre syntaxique qui cache des appels à React.createElement()
. Si vous utilisez JSX, vous ne devriez pas avoir besoin d’appeler les méthodes suivantes :
Lisez React sans JSX pour plus de détails.
Transformer des éléments
React
propose plusieurs API pour manipuler les éléments :
Fragments
React
fournit également un composant particulier pour réaliser le rendu de plusieurs éléments sans avoir à les envelopper avec un autre.
Refs
Suspense
Suspense permet aux composants « d’attendre » quelque chose avant de s’afficher. Pour le moment, Suspense ne prend en charge qu’un seul cas d’usage : le chargement dynamique de composants avec React.lazy
. À l’avenir, il permettra de gérer d’autres cas d’usages tels que le chargement de données distantes.
Hooks
Les Hooks sont une nouveauté de React 16.8. Ils vous permettent d’utiliser les états et d’autres fonctionnalités de React sans avoir à écrire de classes. Les Hooks disposent de leur propre documentation et leur API est détaillée à part :
Référence de l’API
React.Component
React.Component
est la classe de base utilisée pour créer des composants React avec la syntaxe des classes ES6 :
class Greeting extends React.Component {
render() {
return <h1>Bonjour {this.props.name}</h1>;
}
}
Rendez-vous sur la page de référence de l’API React.Component
pour voir la liste complète des méthodes et propriétés de la classe de base React.Component
.
React.PureComponent
React.PureComponent
est similaire à React.Component
. La seule différence est que React.Component
n’implémente pas la méthode shouldComponentUpdate()
, alors que React.PureComponent
l’implémente en réalisant une comparaison de surface de l’état et des propriétés.
Si la fonction render()
d’un de vos composants React produit un rendu identique pour le même état et les mêmes propriétés, le faire étendre React.PureComponent
devrait améliorer les performances dans certains cas.
Remarque
La méthode
shouldComponentUpdate()
deReact.PureComponent
réalise une simple comparaison de surface. Avec des données complexes, elle peut produire des faux négatifs si la structure de données subit des changements profonds. Ne créez des composants avecPureComponent
que si vous avez des états et des props simples, et le cas échéant utilisezforceUpdate()
si vous savez que vos données ont changé en profondeur. Vous pouvez aussi envisager d’utiliser des objets immuables pour simplifier la comparaison rapide de données imbriquées.De plus, la méthode
shouldComponentUpdate()
deReact.PureComponent
ignore la mise à jour des propriétés de tout l’arbre des composants enfants. Assurez-vous donc que tous les composants enfants sont également « purs ».
React.memo
const MyComponent = React.memo(function MyComponent(props) {
/* Faire le rendu en utilisant les props */
});
React.memo
est un composant d’ordre supérieur.
Si vous avez un composant qui affiche toujours le même résultat pour un même jeu de propriétés, vous pouvez l’enrober avec React.memo
, ce qui mémoïsera le résultat et devrait augmenter les performances dans certains cas. Cela signifie que React sautera le rafraîchissement du composant en réutilisant son dernier rendu en date.
React.memo
ne se préoccupe que des modifications de props. Si votre fonction composant enrobée par React.memo
utilise un Hook useState
ou useContext
dans son implémentation, des changements d’état local ou de contexte entraîneront tout de même un nouveau rendu.
Par défaut, seule une comparaison de surface des props sera faite. Si vous voulez gérer cette comparaison vous-même, vous pouvez fournir une fonction de comparaison personnalisée en deuxième argument.
function MyComponent(props) {
/* Faire le rendu en utilisant les props */
}
function areEqual(prevProps, nextProps) {
/*
Renvoie `true` si passer l'objet nextProps à la fonction de rendu
produira le même résultat que de lui passer l'objet prevProps.
Renvoie `false` dans le cas contraire.
*/
}
export default React.memo(MyComponent, areEqual);
Cette méthode n’est qu’un outil d’optimisation des performances. Ne vous y fiez pas pour « empêcher » un rendu car cela peut causer des bugs.
Remarque
Contrairement à la méthode
shouldComponentUpdate()
des composants créés à l’aide de classes, la fonctionareEqual
renvoietrue
si les props sont égales etfalse
dans le cas contraire. C’est donc l’inverse deshouldComponentUpdate
.
createElement()
React.createElement(
type,
[props],
[...children]
)
Cette méthode crée et renvoie un nouvel élément React du type indiqué. L’argument type
peut être au choix : une chaîne contenant un nom de balise (tel que 'div'
ou 'span'
), un type de composant React (une classe ou une fonction), ou encore un fragment React.
Tout code écrit avec JSX sera converti de manière à utiliser React.createElement()
. Normalement vous ne devriez pas appeler React.createElement()
si vous utilisez JSX. Lisez React sans JSX pour en savoir plus.
cloneElement()
React.cloneElement(
element,
[props],
[...children]
)
Cette méthode clone et renvoie un nouvel élément en utilisant element
comme point de départ. L’élément obtenu aura les props de l’élément originel augmentées par une fusion de surface des nouvelles props. Les nouveaux éléments enfants (children
) remplaceront les anciens. Les key
et ref
issues de l’élément originel seront préservées.
React.cloneElement()
est quasiment équivalent à :
<element.type {...element.props} {...props}>{children}</element.type>
Cependant elle préserve les ref
. Concrètement, ça signifie que si vous avez un enfant avec une ref
associée, vous ne la volerez pas accidentellement à votre ancêtre. Vous aurez la même ref
associée au nouvel élément.
Cette API a été introduite pour remplacer la méthode dépréciée React.addons.cloneWithProps()
.
createFactory()
React.createFactory(type)
Cette méthode renvoie une fonction qui produit des éléments React d’un type donné. Comme pour React.createElement()
, l’argument type
peut être au choix : une chaîne contenant un nom de balise (tel que 'div'
ou 'span'
), un type de composant React (une classe ou une fonction), ou encore un type de fragment React.
Cette fonction d’aide est historique et nous vous encourageons plutôt à utiliser JSX ou directement React.createElement()
.
Normalement vous ne devriez pas appeler React.createFactory()
si vous utilisez JSX. Lisez React sans JSX pour en savoir plus.
isValidElement()
React.isValidElement(object)
Cette méthode vérifie qu’un objet est bien un élément React. Elle renvoie true
ou false
.
React.Children
React.Children
fournit des utilitaires pour interagir avec la structure de données opaque de this.props.children
.
React.Children.map
React.Children.map(children, function[(thisArg)])
Cette méthode exécute une fonction sur chacun des enfants directs contenus dans children
avec le this
en vigueur transmis dans l’argument thisArg
. Si children
est un tableau, il sera parcouru et la fonction sera appelée sur chacun des enfants du tableau. Si children
est null
ou undefined
, la méthode renverra null
ou undefined
plutôt qu’un tableau.
Remarque
Si
children
est unFragment
il sera traité comme un unique enfant et ne sera pas parcouru.
React.Children.forEach
React.Children.forEach(children, function[(thisArg)])
Même chose que React.Children.map()
mais sans renvoyer de tableau.
React.Children.count
React.Children.count(children)
Cette méthode renvoie le nombre total de composants présents dans children
, ce total étant égal au nombre de fois qu’une fonction de rappel passée à map
ou forEach
serait exécutée.
React.Children.only
React.Children.only(children)
Cette méthode vérifie que children
n’a qu’un seul enfant (un élément React) et le renvoie. Si ce n’est pas le cas elle lèvera une erreur.
Remarque
React.Children.only()
n’accepte pas la valeur de retour deReact.Children.map()
car il s’agit d’un tableau et non d’un élément React.
React.Children.toArray
React.Children.toArray(children)
Cette méthode renvoie la structure de donnée opaque de children
sous la forme d’un tableau linéarisé ou chaque enfant est doté d’une key
. C’est utile si vous voulez manipuler une collection d’enfants dans votre méthode de rendu, en particulier si vous voulez réorganiser ou découper this.props.children
avant de le passer à d’autres éléments.
Remarque
React.Children.toArray()
change leskey
pour préserver la sémantique des tableaux imbriqués pendant la linéarisation des enfants. Pour cela,toArray
préfixe chaquekey
dans le tableau qui sera renvoyé de manière a ce que lakey
de chaque élément soit associée au tableau originel qui les contient.
React.Fragment
Le composant React.Fragment
vous permet de renvoyer plusieurs éléments depuis une méthode render()
sans avoir à créer un élément DOM supplémentaire :
render() {
return (
<React.Fragment>
Du texte.
<h2>Un en-tête</h2>
</React.Fragment>
);
}
Vous pouvez également l’utiliser via la syntaxe raccourcie <></>
. Pour plus d’information, lisez React v16.2.0: Improved Support for Fragments (en anglais).
React.createRef
React.createRef
crée une ref
qui peut être associée à des éléments React via l’attribut ref
.
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.inputRef = React.createRef(); }
render() {
return <input type="text" ref={this.inputRef} />; }
componentDidMount() {
this.inputRef.current.focus(); }
}
React.forwardRef
React.forwardRef
crée un composant React qui transfère la valeur de l’attribut ref qu’il reçoit à un autre composant plus bas dans l’arbre. Cette technique est assez inhabituelle mais elle est particulièrement utile dans deux cas :
- Transférer une référence à un composant DOM
- Transférer une référence au sein d’un composant d’ordre supérieur
React.forwardRef
prend une fonction de rendu comme argument. React appellera cette fonction avec deux arguments props
et ref
. Cette fonction devrait renvoyer un nœud React.
const FancyButton = React.forwardRef((props, ref) => ( <button ref={ref} className="FancyButton"> {props.children}
</button>
));
// You can now get a ref directly to the DOM button:
const ref = React.createRef();
<FancyButton ref={ref}>Click me!</FancyButton>;
Dans l’exemple ci-avant, la fonction de rendu passée à React.forwardRef
recevra comme deuxième argument la ref
initialement fournie à l’élément <FancyButton ref={ref}>
. Cette fonction va alors transférer la ref
à l’élément <button ref={ref}>
.
En conséquence, après que React aura attaché la ref, ref.current
pointera directement vers l’instance de l’élément DOM de <button>
.
Pour en savoir plus, lisez Transférer les refs
React.lazy
React.lazy()
vous permet de définir un composant qui sera chargé dynamiquement. Cela aide à réduire la taille du fichier initial en reportant à plus tard le chargement des composants inutiles lors du rendu initial.
Vous pouvez apprendre comment l’utiliser en lisant la documentation sur la découpe du code. Vous voudrez peut-être aussi jeter un œil à cet article, qui explique comment l’utiliser en détail.
// Ce composant est chargé dynamiquement
const SomeComponent = React.lazy(() => import('./SomeComponent'));
Notez bien que l’affichage d’un composant lazy
a besoin d’un composant <React.Suspense>
plus haut dans l’arbre de rendu. C’est de cette manière que vous pouvez spécifier un indicateur de chargement.
Remarque
Utiliser
React.lazy
avec unimport()
dynamique requiert une prise en charge des Promises par l’environnement JS. Vous aurez donc besoin d’un polyfill pour IE11 et inférieurs.
React.Suspense
React.Suspense
vous permet de définir un indicateur de chargement pour le cas où certains composants plus bas dans l’arbre de rendu ne seraient pas encore prêts à être affichés. Pour le moment le seul cas d’usage pris en charge par <React.Suspense>
, c’est le chargement différé de composants via React.lazy
:
// Ce composant est chargé dynamiquement
const OtherComponent = React.lazy(() => import('./OtherComponent'));
function MyComponent() {
return (
// Affiche <Spinner> jusqu'à ce que <OtherComponent> soit chargé
<React.Suspense fallback={<Spinner />}>
<div>
<OtherComponent />
</div>
</React.Suspense>
);
}
Tout ça est détaillé dans notre guide sur la découpe du code. Remarquez que les composants lazy
peuvent être profondément enfouis dans l’arbre des descendants de Suspense
—ils n’ont pas besoin d’être enveloppés individuellement. La bonne pratique consiste à placer un <Suspense>
aux endroits où vous souhaitez voir un indicateur de chargement, et à utiliser lazy()
partout ou vous voulez découper votre code.
Bien que ce ne soit pas le cas pour le moment, nous prévoyons d’étendre les capacités de Suspense
pour qu’il puisse gérer d’autre scénarios tel que le chargement de données. Vous pourrez en savoir plus en jetant un coup d’œil à notre feuille de route.
Remarque
React.lazy()
et<React.Suspense>
ne sont pas encore pris en charge parReactDOMServer
. C’est une limitation connue qui devrait être résolue à l’avenir.