Aujourd'hui, dans la traduction de la prochaine partie du didacticiel React, nous parlerons du rendu conditionnel.

→
Partie 1: aperçu du cours, raisons de la popularité de React, ReactDOM et JSX→
Partie 2: composants fonctionnels→
Partie 3: fichiers composants, structure du projet→
Partie 4: composants parent et enfant→
Partie 5: début des travaux sur une application TODO, les bases du style→
Partie 6: sur certaines fonctionnalités du cours, JSX et JavaScript→
Partie 7: styles en ligne→
Partie 8: poursuite des travaux sur l'application TODO, familiarité avec les propriétés des composants→
Partie 9: propriétés des composants→
Partie 10: Atelier sur l'utilisation des propriétés et du style des composants→
Partie 11: génération de balisage dynamique et méthode des tableaux de cartes→
Partie 12: atelier, troisième étape de travail sur une application TODO→
Partie 13: composants basés sur les classes→
Partie 14: atelier sur les composants basés sur les classes, état des composants→
Partie 15: ateliers santé composante→
Partie 16: quatrième étape de travail sur une application TODO, gestion d'événements→
Partie 17: cinquième étape de travail sur une application TODO, modifiant l'état des composants→
Partie 18: la sixième étape de travail sur une application TODO→
Partie 19: méthodes du cycle de vie des composantsPartie 20: la première leçon de rendu conditionnel→
Partie 21: deuxième leçon et atelier sur le rendu conditionnel→
Partie 22: la septième étape des travaux sur une application TODO, téléchargement de données depuis des sources externes→
Partie 23: première leçon sur l'utilisation des formulaires→
Partie 24: Deuxième leçon sur les formulaires→
Partie 25: Atelier sur l'utilisation des formulaires→
Partie 26: architecture d'application, modèle de conteneur / composant→
Partie 27: projet de coursLeçon 36. Rendu conditionnel, partie 1
→
OriginalLes technologies de rendu conditionnel sont utilisées dans les cas où quelque chose doit être affiché sur une page conformément à une certaine condition. Dans cette leçon, nous allons voir comment afficher un message spécial (il peut très bien être représenté par quelque chose comme un écran de chargement) pendant que l'application se prépare à fonctionner, à charger des données et, une fois prête, à remplacer ce message est pour autre chose.
Aujourd'hui, nous allons expérimenter avec une application créée à l'aide des outils
App.js
-
App.js
-app, dans le fichier
App.js
qui contient le code suivant:
import React, {Component} from "react" import Conditional from "./Conditional" class App extends Component { constructor() { super() this.state = { isLoading: true } } componentDidMount() { setTimeout(() => { this.setState({ isLoading: false }) }, 1500) } render() { return ( <div> <Conditional isLoading={this.state.isLoading}/> </div> ) } } export default App
En outre, dans le même dossier où se trouve le fichier
App.js
, il existe un fichier de composant
Conditional.js
avec le contenu suivant:
import React from "react" function Conditional(props) { return ( ) } export default Conditional
A ce stade des travaux, cette application ne fonctionnera pas encore, dans le processus d'analyse du matériel nous allons la corriger.
L'un des défis auxquels sont confrontés les développeurs de React est qu'ils doivent apprendre de nombreux outils pouvant être utilisés de différentes manières. Un programmeur n'est pas nécessairement limité à une seule façon d'utiliser un certain outil. Cela est influencé par le fait que le développement de React est extrêmement proche du développement en JavaScript simple.
Par conséquent, nous avons la possibilité d'utiliser différentes approches pour résoudre les mêmes problèmes, de sorte que les mêmes outils peuvent être utilisés de différentes manières. Le rendu conditionnel est la zone de React dans laquelle les idées ci-dessus se manifestent particulièrement fortement. En fait, avant de commencer, je voudrais noter que, bien que nous analyserons plusieurs approches de l'application de cette technologie, les véritables options pour son utilisation ne se limitent pas à elles.
Parlons du code avec lequel nous allons maintenant expérimenter. Nous, dans le fichier
App.js
, avons un composant basé sur la classe. Son constructeur a initialisé un état contenant la propriété
isLoading
définie sur
true
. Une telle conception est souvent utilisée dans les cas où, pour mettre un composant en état de fonctionnement, il est nécessaire, par exemple, d'exécuter des requêtes vers une certaine API, et pendant que le composant attend que les données arrivent et les analyse, quelque chose doit être affiché à l'écran. Cela peut prendre de 3 à 4 secondes pour terminer l'appel d'API, et vous ne voulez pas que l'utilisateur qui regarde l'écran pense que votre application a planté. Par conséquent, l'état possède une propriété qui indique si l'application effectue actuellement certaines actions de service. Et le rendu conditionnel sera utilisé pour afficher quelque chose qui indique à l'utilisateur que l'application charge actuellement quelque chose en arrière-plan.
Le code du composant
App
a une méthode
componentDidMount()
, dont nous parlerons très bientôt. En attendant, faites attention à la méthode
render()
. Ici, nous affichons le composant
Condition
, qui est importé dans le code situé en haut du fichier
App.js
Le composant
isLoading
transmis à ce composant, qui est la valeur actuelle de la propriété
isLoading
partir de l'état du composant
App
. Le code du composant
Conditional
ne renvoie rien qui puisse être affiché à l'écran, nous traiterons ce composant un peu plus tard. En attendant, revenons à la méthode
componentDidMount()
du code du composant
App
.
Rappelons que la méthode
componentDidMount()
nous permet d'exécuter du code immédiatement après l'affichage du composant, dans notre cas c'est le composant
App
. Dans le code de cette méthode, nous simulons un appel à une certaine API. Ici, nous réglons la minuterie sur une seconde et demie. Une fois ce temps écoulé, le code de la fonction passé à
setTimeout()
sera lancé. Dans cette fonction, en supposant que son appel symbolise la fin du chargement des données à partir de l'API, un changement d'état est effectué. À savoir, sa propriété
isLoading
est définie sur
false
. Cela indique que le téléchargement des données est terminé et qu'après cela, l'application peut fonctionner normalement. Dans les classes futures, nous parlerons de l'utilisation de la fonction
fetch()
pour charger des données, pour l'instant nous nous limiterons à la simulation ci-dessus de ce processus.
Soit dit en passant, il conviendra ici de soulever à nouveau le sujet des méthodes de cycle de vie des composants. Le fait est que dès que la propriété d'état
isLoading
passe de
true
à
false
, le composant
Conditional
reçoit une nouvelle valeur de propriété. Tout d'abord, la première fois que le composant est affiché, il reçoit, dans la propriété
isLoading
,
true
, puis, après le changement d'état, il reçoit la même propriété avec la nouvelle valeur. En fait, lorsque l'état change, la méthode
render()
est à nouveau appelée, par conséquent, le composant
Conditional
sera également affiché à nouveau. Rappelons que le
Conditional
est un composant fonctionnel ordinaire, c'est-à-dire que sa restitution signifie l'appel répété de la fonction à laquelle il est présenté. Mais ce que nous retournons de cette fonction lorsque nous restituons le composant peut différer de ce qui a été retourné précédemment. La raison de ce changement est le changement de ce que nous transmettons au composant.
Ainsi, le composant
Conditional
accepte la propriété
isLoading
. Avant de commencer à travailler sur le code, nous vérifierons si ces mécanismes qui existent déjà dans celui-ci fonctionnent. Pour ce faire, nous retournerons du balisage du composant et afficherons la valeur
props.isLoading
dans la console. Après cela, le code du composant ressemblera à ceci:
import React from "react" function Conditional(props) { console.log(props.isLoading) return ( <h1>Temp</h1> ) } export default Conditional
La page d'application après cela ressemblera à celle illustrée dans la figure suivante.
Page d'application dans le navigateurVeuillez noter que
true
s'affiche dans la console immédiatement après le chargement de l'application et
false
- après 1,5 seconde. Cela est dû au fonctionnement du mécanisme ci-dessus dans la méthode
componentDidMount()
du composant
App
.
Parlons maintenant du rendu conditionnel. Son essence réside dans le fait que nous affichons quelque chose à l'écran uniquement si une certaine condition est remplie. Dans ce cas, au lieu d'afficher la chaîne
Temp
sur la page, nous, dans le composant
Conditional
, pouvons vérifier la valeur de
props.isLoading
, et s'il est
true
, afficher le texte
Loading...
sur la page. Si cette valeur est
false
, ce qui indique la fin du téléchargement, vous pouvez renvoyer un autre texte du composant. Dans le code, cela ressemblera à ceci:
import React from "react" function Conditional(props) { if(props.isLoading === true) { return ( <h1>Loading...</h1> ) } else { return ( <h1>Some cool stuff about conditional rendering</h1> ) } } export default Conditional
Essayez d'exécuter ce code dans votre maison, actualisez la page et regardez comment, lorsque la page se charge, un texte s'affiche et après un certain temps - un autre.
Compte tenu des fonctionnalités JavaScript, nous pouvons simplifier le code ci-dessus comme ceci:
import React from "react" function Conditional(props) { if(props.isLoading === true) { return ( <h1>Loading...</h1> ) } return ( <h1>Some cool stuff about conditional rendering</h1> ) } export default Conditional
Si la condition vérifiée dans le bloc
if
est vraie, alors l'
return
dans ce bloc fonctionnera, après quoi la fonction se terminera. Si la condition est fausse, l'expression de
return
de ce bloc n'est pas satisfaite et la fonction renvoie ce qui est spécifié dans la deuxième
return
de
return
de la fonction.
Voyons maintenant comment résoudre les problèmes de rendu conditionnel à l'aide de l'
opérateur ternaire . Cette construction existe en JavaScript depuis très longtemps. Il est souvent utilisé dans React pour résoudre les tâches de rendu conditionnel. Voici à quoi ça ressemble:
? 1 : 2
La valeur de l'expression 1 est retournée si la condition est vraie, la valeur de l'expression 2 est retournée si la condition est fausse.
Dans notre cas, à l'aide de l'opérateur ternaire, le code du composant
Conditional
peut être réécrit comme suit:
import React from "react" function Conditional(props) { return ( props.isLoading === true ? <h1>Loading...</h1> : <h1>Some cool stuff about conditional rendering</h1> ) } export default Conditional
Cette conception, bien qu'elle fonctionne, semble inhabituelle. Le fait est que les composants renvoient généralement des conceptions plus complexes. Par conséquent, enveloppez le tout dans un élément
<div>
:
import React from "react" function Conditional(props) { return ( <div> props.isLoading === true ? <h1>Loading...</h1> : <h1>Some cool stuff about conditional rendering</h1> </div> ) } export default Conditional
Un tel code fonctionne également, bien qu'il ne soit plus comme il se doit. Tout ce qui est enfermé dans le
<div>l;
. Afin de résoudre ce problème, nous rappelons que les constructions JS utilisées dans le balisage renvoyé par les composants doivent être placées entre accolades et réécrire le code en conséquence:
import React from "react" function Conditional(props) { return ( <div> {props.isLoading === true ? <h1>Loading...</h1> : <h1>Some cool stuff about conditional rendering</h1>} </div> ) } export default Conditional
Maintenant, tout fonctionne comme il se doit.
Il convient de noter que dans le composant réel, le balisage renvoyé par eux serait plus compliqué. Ici, par exemple, dans la partie supérieure de ce que le composant affiche, une barre de navigation peut être présente, dans la partie inférieure un «pied de page» de la page peut être fourni, etc. Cela peut ressembler à ceci:
import React from "react" function Conditional(props) { return ( <div> <h1>Navbar</h1> {props.isLoading === true ? <h1>Loading...</h1> : <h1>Some cool stuff about conditional rendering</h1>} <h1>Footer</h1> </div> ) } export default Conditional
De plus, la présence dans le balisage renvoyé par le composant d'éléments supplémentaires n'interfère pas avec les mécanismes de rendu conditionnel. De plus, ces éléments seront affichés à la fois lorsque
props.isLoading
est
true
et lorsque cette propriété est
false
.
Une autre amélioration qui peut être apportée à ce code est basée sur le fait que, puisque
props.isLoading
est une propriété booléenne qui prend la valeur
true
ou
false
, elle peut être utilisée directement sans utiliser l'opérateur de comparaison strict avec
true
. Le résultat est le suivant:
import React from "react" function Conditional(props) { return ( <div> <h1>Navbar</h1> {props.isLoading ? <h1>Loading...</h1> : <h1>Some cool stuff about conditional rendering</h1>} <h1>Footer</h1> </div> ) } export default Conditional
Nous sommes maintenant arrivés à un exemple concret de l'utilisation de la technologie de rendu conditionnel, mais les mêmes résultats peuvent être obtenus de plusieurs façons. Par exemple, généralement dans des composants comme le nôtre, les panneaux de navigation et les pieds de page ne sont pas affichés. Ces éléments de page sont généralement affichés soit par le composant
App
lui-même, soit par des composants spéciaux affichés par le composant
App
.
De plus, il convient de noter qu'ici, toute la logique du rendu conditionnel se trouve à l'intérieur de la méthode
render()
du composant fonctionnel, qui a été effectuée uniquement pour démontrer le code compact assemblé en un seul endroit. Mais, probablement, le composant
App
devrait être responsable du rendu conditionnel, et un composant similaire à notre composant
Conditional
devrait simplement afficher ce qui lui a été transmis. Si le composant
App
est responsable de déterminer si quelque chose se charge à un certain moment et lorsque cette opération est terminée, il devrait probablement être responsable de déterminer ce qui doit être affiché sur la page. Autrement dit, dans notre cas, le code pourrait être réorganisé en vérifiant la propriété
isLoading
dans la méthode
render()
du composant
App
et en affichant le texte comme
Loading...
au cas où le téléchargement ne serait pas terminé, ou en affichant un composant similaire au composant
Conditional
dans Si le téléchargement est terminé. Dans le même temps, le composant
Conditional
peut très bien ne pas accepter les propriétés de l'
App
, affichant uniquement ce qu'il doit produire dans tous les cas.
Voici à quoi ressemble le code du composant App, converti en fonction de ces considérations:
import React, {Component} from "react" import Conditional from "./Conditional" class App extends Component { constructor() { super() this.state = { isLoading: true } } componentDidMount() { setTimeout(() => { this.setState({ isLoading: false }) }, 1500) } render() { return ( <div> {this.state.isLoading ? <h1>Loading...</h1> : <Conditional />} </div> ) } } export default App
Et voici le code mis à jour du composant
Conditional
, dans lequel il n'y a maintenant aucune vérification des conditions:
import React from "react" function Conditional(props) { return <h1>Some cool stuff about conditional rendering</h1> } export default Conditional
Ici, nous avons cependant supprimé la barre de navigation et le "sous-sol", mais ce n'est pas important dans ce cas.
Résumé
Dans cette leçon, votre première introduction aux technologies de rendu conditionnel a eu lieu. La prochaine fois, nous continuerons de traiter avec eux. En particulier, vous aurez une deuxième leçon sur le rendu conditionnel et des travaux pratiques sur ce sujet.
Chers lecteurs! Si vous développez des applications React, nous vous demandons de nous indiquer comment vous effectuez le rendu conditionnel.
