Tutoriel React Partie 14: Atelier sur les composants basés sur les classes, état des composants

Dans cette partie de la traduction du cours de formation React, nous vous suggérons de terminer la tâche pratique de travailler avec des composants basés sur la classe. Après cela, nous commencerons à maîtriser un concept aussi important de React que l'état des composants.

image

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 composants
Partie 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 cours

Leçon 25. Atelier. Composants basés sur la classe


Original

▍Emploi


Vous trouverez ci-dessous le code qui doit être placé dans le fichier index.js d'une application React standard créée par create-react-app . Convertissez les composants fonctionnels que vous trouverez dans ce code en composants basés sur les classes et, en outre, recherchez et corrigez une petite erreur.

Le code du fichier index.js :

 import React from "react" import ReactDOM from "react-dom" // #1 function App() {   return (       <div>           <Header />           <Greeting />       </div>   ) } // #2 function Header(props) {   return (       <header>           <p>Welcome, {props.username}!</p>       </header>   ) } // #3 function Greeting() {   const date = new Date()   const hours = date.getHours()   let timeOfDay     if (hours < 12) {       timeOfDay = "morning"   } else if (hours >= 12 && hours < 17) {       timeOfDay = "afternoon"   } else {       timeOfDay = "night"   }   return (       <h1>Good {timeOfDay} to you, sir or madam!</h1>   ) } ReactDOM.render(<App />, document.getElementById("root")) 

▍Solution


Tout d'abord, regardons ce que l'application donne dans sa forme originale en l'ouvrant dans un navigateur.


Page source du navigateur

Vous pouvez voir que la ligne supérieure qui apparaît sur la page ne semble pas correcte. Après la virgule suivant Welcome, il devrait évidemment y avoir quelque chose comme un nom d'utilisateur.

Si nous analysons le code de l'application, il s'avère que le composant Header - Header affiche cette ligne, en attendant d'obtenir la propriété de username définie lors de la création de son instance. Une instance de ce composant est créée dans le composant App . Après avoir découvert cela, nous serons en mesure de corriger l'erreur même qui a été mentionnée dans la mission.

Il convient de noter que les composants sont généralement placés dans des fichiers différents, mais dans ce cas, nous les avons tous décrits dans un seul fichier.

Nous procédons à la transformation du composant fonctionnel de l' App en un composant basé sur la classe. Pour ce faire, il suffit d'amener son code sous cette forme:

 class App extends React.Component {   render() {       return (           <div>               <Header username="vschool"/>               <Greeting />           </div>       )   } } 

Maintenant, le mot class clé class vient avant le nom du composant, suivi de la extends React.Component , après quoi le corps de la classe est décrit entre crochets. Il devrait y avoir une méthode render() retournant ce que nous avons retourné du composant fonctionnel. Les autres composants sont traités de la même manière. Faites attention à la construction de <Header username="vschool"/> . Ici, nous transmettons la propriété username avec la valeur de vschool composant Header , corrigeant ainsi l'erreur qui se trouve dans l'application d'origine.

Comme vous le savez déjà, le composant Header s'attend à obtenir la propriété username et, dans le composant fonctionnel, cette propriété est accessible à l'aide de la construction props.username ( props dans ce cas est un argument de la fonction qui décrit le composant). Dans les composants basés sur les classes, la même chose ressemble à this.props.username . Voici le code repensé du composant Header - Header :

 class Header extends React.Component {   render() {       return (           <header>               <p>Welcome, {this.props.username}!</p>           </header>       )   } } 

Le troisième élément, Greeting , est légèrement différent des autres. Le fait est que, avant la commande de return , certains calculs sont effectués. Lors de sa conversion en composant basé sur une classe, ces calculs doivent être placés dans la méthode render() avant la commande return. Voici le code du composant Greeting repensé:

 class Greeting extends Component {   render() {       const date = new Date()       const hours = date.getHours()       let timeOfDay             if (hours < 12) {           timeOfDay = "morning"       } else if (hours >= 12 && hours < 17) {           timeOfDay = "afternoon"       } else {           timeOfDay = "night"       }       return (           <h1>Good {timeOfDay} to you, sir or madam!</h1>       )   } } 

Notez que ce composant a été utilisé dans la déclaration de ce composant: class Greeting extends Component . Ceci est souvent fait dans un souci de brièveté, mais pour que cela fonctionne, nous devons affiner la commande d'importation react , en l'amenant à cette forme:

 import React, {Component} from "react" 

Voici à quoi ressemble la page d'application recyclée dans un navigateur.


Page d'application repensée dans le navigateur

En fait, cela ressemble à la page de l'application d'origine, et la seule différence notable entre ces pages est que le nom d'utilisateur transmis au composant Header - Header est maintenant affiché dans la première ligne.

Voici le code complet du fichier index.js traité:

 import React, {Component} from "react" import ReactDOM from "react-dom" // #1 class App extends React.Component {   render() {       return (           <div>               <Header username="vschool"/>               <Greeting />           </div>       )   } } // #2 class Header extends React.Component {   render() {       return (           <header>               <p>Welcome, {this.props.username}!</p>           </header>       )   } } // #3 class Greeting extends Component {   render() {       const date = new Date()       const hours = date.getHours()       let timeOfDay             if (hours < 12) {           timeOfDay = "morning"       } else if (hours >= 12 && hours < 17) {           timeOfDay = "afternoon"       } else {           timeOfDay = "night"       }       return (           <h1>Good {timeOfDay} to you, sir or madam!</h1>       )   } } ReactDOM.render(<App />, document.getElementById("root")) 

Si la mise en œuvre de cette tâche pratique ne vous a posé aucun problème - tant mieux. Si vous n'êtes toujours pas à l'aise avec les composants basés sur les classes, prenez le temps de les expérimenter. Par exemple, vous pouvez refaire des composants basés sur des classes en composants fonctionnels, puis effectuer la transformation inverse.

Leçon 26. État des composants


Original

L'État est un concept React incroyablement important. Si le composant doit stocker ses propres données et gérer ces données (contrairement à la situation où le composant parent lui transfère des données à l'aide du mécanisme de propriété), utilisez l'état du composant. Aujourd'hui, nous examinons les concepts de base concernant l'état des composants.

Un état n'est que les données contrôlées par le composant. En particulier, cela signifie que le composant peut modifier ces données. En même temps, les propriétés qui nous sont déjà familières, obtenues par le composant à partir du composant parent, ne peuvent pas être modifiées par le composant récepteur. Selon la documentation React, ils sont immuables (immuables). Par exemple, si nous essayons, dans un composant basé sur une classe, d'utiliser une construction comme this.props.name = "NoName" , nous rencontrerons un message d'erreur.

Il convient de noter que si un composant doit fonctionner avec l'état, il doit s'agir d'un composant basé sur la classe. Parlons de la façon d'équiper le composant avec l'état en commençant par le fragment de code suivant, qui est le contenu du fichier App.js d'un projet standard créé par create-react-app :

 import React from "react" class App extends React.Component {   render() {       return (           <div>               <h1>Is state important to know?</h1>           </div>       )   } } export default App 

Voici à quoi ressemble la page d'application dans un navigateur.


Page d'application dans le navigateur

Afin d'équiper un composant avec un état, vous devez d'abord créer un constructeur de classe. Cela ressemble à une méthode de classe constructor() . Après cela, le code du composant ressemblera à ceci:

 class App extends React.Component {   constructor() {         }     render() {       return (           <div>               <h1>Is state important to know?</h1>           </div>       )   } } Constructor() 

Il s'agit d'une méthode spéciale intégrée à JavaScript conçue pour créer et initialiser des objets basés sur des classes. En fait, si vous devez initialiser quelque chose lors de la création d'un objet, les opérations correspondantes sont effectuées exactement dans la méthode constructor() .

La première chose à faire dans le code constructeur est d'appeler le constructeur de la classe parent. Cela se fait en utilisant la fonction super() . Dans le constructeur de la classe parente, certaines opérations d'initialisation peuvent être effectuées, dont les résultats seront utiles à notre objet. Voici à quoi ressemblera notre constructeur de classe:

 constructor() {   super() } 

Maintenant, afin d'équiper le composant avec state, nous devons, dans le constructeur, ajouter la propriété state à l'instance de classe. Cette propriété est un objet:

 constructor() {   super()   this.state = {} } 

Ici, nous l'avons initialisé avec un objet vide. Vous pouvez travailler avec state dans le code du composant à l'aide de la construction this.state . Ajoutez une nouvelle propriété à l'état:

 constructor() {   super()   this.state = {       answer: "Yes"   } } 

Voyons maintenant comment utiliser ce qui est stocké dans l'état dans le code. Rappelez-vous que le composant affiche la question Is state important to know? . L'État stocke la réponse à cette question. Pour ajouter cette réponse après la question, vous devez faire la même chose que nous faisons habituellement en ajoutant des constructions JavaScript au code JSX. À savoir, ajoutez la construction {this.state.answer} à la fin de la ligne. Par conséquent, le code de composant complet ressemblera à ceci:

 class App extends React.Component {   constructor() {       super()       this.state = {           answer: "Yes"       }   }     render() {       return (           <div>               <h1>Is state important to know? {this.state.answer}</h1>           </div>       )   } } 

Et voici à quoi ressemblera la page d'application dans le navigateur.


Page d'application dans le navigateur

Ici, je voudrais noter que l'état que le composant reçoit lors de l'initialisation peut être modifié pendant le fonctionnement du composant. De plus, les composants peuvent transmettre l'état aux composants descendants à l'aide du mécanisme de travail avec des propriétés que vous connaissez déjà. Par exemple, dans notre cas, si nous supposons qu'il existe un certain composant de ChildComponent , les données de l'état peuvent lui être transférées comme ceci:

 <ChildComponent answer={this.state.answer}/> 

Bien que nous ne parlerons pas en détail de la façon de modifier les données stockées dans l'état du composant. Nous notons seulement que lorsque vous appelez la méthode setState() , qui est utilisée pour résoudre ce problème, non seulement l'état du composant sera modifié, mais également les données d'état transmises via le mécanisme de propriété à ses composants enfants seront mises à jour. De plus, la modification de l'état entraînera la modification automatique des données de l'état affiché sur la page de l'application.

Résumé


Aujourd'hui, vous avez eu l'occasion de travailler avec des composants basés sur des classes. De plus, votre introduction au concept de statut de composant a commencé ici. La prochaine fois, vous trouverez des tâches pratiques pour travailler avec l'État.

Chers lecteurs! Si vous utilisez React dans la pratique, veuillez nous expliquer comment vous gérez l'état des composants. Utilisez-vous des outils React standard ou autre chose?

Source: https://habr.com/ru/post/fr438986/


All Articles