React Tutorial Teil 14: Workshop zu klassenbasierten Komponenten, Komponentenstatus

In diesem Teil der Übersetzung des React-Schulungskurses empfehlen wir Ihnen, die praktische Aufgabe der Arbeit mit klassenbasierten Komponenten abzuschließen. Danach werden wir beginnen, ein so wichtiges Konzept von React wie den Zustand von Komponenten zu beherrschen.

Bild

Teil 1: Kursübersicht, Gründe für die Beliebtheit von React, ReactDOM und JSX
Teil 2: Funktionskomponenten
Teil 3: Komponentendateien, Projektstruktur
Teil 4: übergeordnete und untergeordnete Komponenten
Teil 5: Beginn der Arbeit an einer TODO-Anwendung, Grundlagen des Stylings
Teil 6: Über einige Funktionen des Kurses, JSX und JavaScript
Teil 7: Inline-Stile
Teil 8: Fortsetzung der Arbeit an der TODO-Anwendung, Vertrautheit mit den Eigenschaften von Komponenten
Teil 9: Komponenteneigenschaften
Teil 10: Workshop zum Arbeiten mit Komponenteneigenschaften und Styling
Teil 11: Dynamische Markup-Generierung und Map-Arrays-Methode
Teil 12: Workshop, dritte Phase der Arbeit an einer TODO-Anwendung
Teil 13: Klassenbasierte Komponenten
Teil 14: Workshop zu klassenbasierten Komponenten, Komponentenstatus
Teil 15: Komponentengesundheitsworkshops
Teil 16: Die vierte Phase der Arbeit an einer TODO-Anwendung, die Ereignisbehandlung
Teil 17: Fünfte Phase der Arbeit an einer TODO-Anwendung, Änderung des Status von Komponenten
Teil 18: Die sechste Phase der Arbeit an einer TODO-Anwendung
Teil 19: Methoden des Komponentenlebenszyklus
Teil 20: Die erste Lektion in bedingtem Rendern
Teil 21: Zweite Lektion und Workshop zum bedingten Rendern
Teil 22: Die siebte Phase der Arbeit an einer TODO-Anwendung, bei der Daten aus externen Quellen heruntergeladen werden
Teil 23: Erste Lektion zum Arbeiten mit Formularen
Teil 24: Lektion der zweiten Form
Teil 25: Workshop zum Arbeiten mit Formularen
Teil 26: Anwendungsarchitektur, Container- / Komponentenmuster
Teil 27: Kursprojekt

Lektion 25. Workshop. Klassenbasierte Komponenten


Original

»Job


Unten finden Sie den Code, der in die Datei index.js einer Standardanwendung von React index.js werden muss, die von create-react-app . Konvertieren Sie die in diesem Code enthaltenen Funktionskomponenten in klassenbasierte Komponenten und suchen und beheben Sie außerdem einen kleinen Fehler.

Der Code für die Datei 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")) 

▍Lösung


Schauen wir uns zunächst an, was die Anwendung in ihrer ursprünglichen Form ausgibt, indem Sie sie in einem Browser öffnen.


Browser-Quellseite

Sie können sehen, dass die oberste Zeile auf der Seite nicht richtig aussieht. Nach dem Komma nach Welcome sollte es offensichtlich so etwas wie einen Benutzernamen geben.

Wenn wir den Anwendungscode analysieren, stellt sich heraus, dass die Header Komponente diese Zeile anzeigt und erwartet, dass die beim Erstellen ihrer Instanz festgelegte Eigenschaft username wird. Eine Instanz dieser Komponente wird in der App Komponente erstellt. Nachdem wir dies herausgefunden haben, können wir genau den Fehler korrigieren, der in der Aufgabe erwähnt wurde.

Es ist zu beachten, dass Komponenten normalerweise in verschiedenen Dateien abgelegt werden. In diesem Fall haben wir sie jedoch alle in einer Datei beschrieben.

Wir wandeln die Funktionskomponente der App in eine Komponente um, die auf der Klasse basiert. Dazu reicht es aus, den Code in dieses Formular zu bringen:

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

Jetzt steht das Schlüsselwort class vor dem Komponentennamen, gefolgt vom extends React.Component , nach dem der Hauptteil der Klasse in geschweiften Klammern beschrieben wird. Es sollte eine render() -Methode geben, die das zurückgibt, was wir von der Funktionskomponente zurückgegeben haben. Andere Komponenten werden auf die gleiche Weise verarbeitet. <Header username="vschool"/> auf die Konstruktion von <Header username="vschool"/> . Hier übergeben wir die Eigenschaft username mit dem Wert vschool Header Komponente, wodurch der Fehler in der ursprünglichen Anwendung vschool wird.

Wie Sie bereits wissen, erwartet die Header Komponente, dass die Eigenschaft username abgerufen wird, und in der Funktionskomponente wird auf diese Eigenschaft mit dem Konstrukt props.username (in diesem Fall ist props ein Argument für die Funktion, die die Komponente beschreibt). In klassenbasierten Komponenten sieht dasselbe wie this.props.username . Hier ist der neu gestaltete Header Komponentencode:

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

Die dritte Komponente, Greeting , unterscheidet sich geringfügig von den anderen. Tatsache ist, dass darin vor dem return einige Berechnungen durchgeführt werden. Bei der Konvertierung in eine Komponente basierend auf einer Klasse müssen diese Berechnungen vor dem Befehl return in die Methode render() eingefügt werden. Hier ist der Code für die neu gestaltete Greeting :

 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>       )   } } 

Beachten Sie, dass diese Komponente in der Deklaration dieser Komponente verwendet wurde: class Greeting extends Component . Dies geschieht häufig der Kürze halber, aber damit dies funktioniert, müssen wir den Importbefehl react verfeinern und ihn in die folgende Form bringen:

 import React, {Component} from "react" 

So sieht die Seite der recycelten Anwendung in einem Browser aus.


Überarbeitete Anwendungsseite im Browser

Tatsächlich sieht es genauso aus wie die Seite der ursprünglichen Anwendung, und der einzige merkliche Unterschied zwischen diesen Seiten besteht darin, dass der an die Header Komponente übergebene Benutzername jetzt in der ersten Zeile angezeigt wird.

Hier ist der vollständige Code für die verarbeitete Datei index.js :

 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")) 

Wenn die Umsetzung dieser praktischen Aufgabe Ihnen keine Schwierigkeiten bereitet hat - großartig. Wenn Sie mit Komponenten, die auf Klassen basieren, immer noch nicht ganz vertraut sind, nehmen Sie sich Zeit, um mit ihnen zu experimentieren. Beispielsweise können Sie klassenbasierte Komponenten wieder in funktionale Komponenten umwandeln und dann die inverse Transformation durchführen.

Lektion 26. Komponentenstatus


Original

Zustand ist ein unglaublich wichtiges Reaktionskonzept. Wenn die Komponente eigene Daten speichern und diese Daten verwalten muss (im Gegensatz zu der Situation, in der die übergeordnete Komponente Daten mithilfe des Eigenschaftsmechanismus an sie überträgt), verwenden Sie den Status der Komponente. Heute betrachten wir die grundlegenden Konzepte bezüglich des Zustands von Komponenten.

Ein Status sind nur die Daten, die die Komponente steuert. Dies bedeutet insbesondere, dass die Komponente diese Daten ändern kann. Gleichzeitig können die uns bereits bekannten Eigenschaften, die die Komponente von der übergeordneten Komponente erhält, von der empfangenden Komponente nicht geändert werden. Sie sind laut React- Dokumentation unveränderlich (unveränderlich). Wenn wir beispielsweise in einer auf einer Klasse basierenden Komponente versuchen, ein Konstrukt wie this.props.name = "NoName" , wird eine Fehlermeldung this.props.name = "NoName" .

Es sollte beachtet werden, dass, wenn eine Komponente mit state arbeiten muss, es sich um eine Komponente handeln sollte, die auf der Klasse basiert. Lassen Sie uns darüber sprechen, wie Sie die Komponente mit state ausstatten, indem Sie mit dem folgenden Codefragment beginnen, das den Inhalt der Datei App.js eines Standardprojekts enthält, das von 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 

So sieht die Anwendungsseite in einem Browser aus.


Anwendungsseite im Browser

Um eine Komponente mit state auszustatten, müssen Sie zunächst einen Klassenkonstruktor erstellen. Es sieht aus wie eine constructor() -Klassenmethode. Danach sieht der Komponentencode folgendermaßen aus:

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

Dies ist eine spezielle in JavaScript integrierte Methode, mit der Objekte basierend auf Klassen erstellt und initialisiert werden können. Wenn Sie beim Erstellen eines Objekts etwas initialisieren müssen, werden die entsprechenden Operationen genau in der Methode constructor() .

Das erste, was Sie im Konstruktorcode tun müssen, ist, den Konstruktor der übergeordneten Klasse aufzurufen. Dies erfolgt mit der Funktion super() . Im Konstruktor der übergeordneten Klasse können bestimmte Initialisierungsoperationen ausgeführt werden, deren Ergebnisse für unser Objekt nützlich sind. So sieht unser Klassenkonstruktor jetzt aus:

 constructor() {   super() } 

Um die Komponente mit state auszustatten, müssen wir im Konstruktor die class -Eigenschaft zur Klasseninstanz hinzufügen. Diese Eigenschaft ist ein Objekt:

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

Hier haben wir es mit einem leeren Objekt initialisiert. Mit dem Konstrukt this.state können Sie mit dem Status im Komponentencode this.state . Fügen Sie dem Status eine neue Eigenschaft hinzu:

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

Lassen Sie uns nun darüber nachdenken, wie Sie das verwenden, was im Code im Status gespeichert ist. Denken Sie daran, dass die Komponente die Frage anzeigt. Is state important to know? . Der Staat speichert die Antwort auf diese Frage. Um diese Antwort nach der Frage hinzuzufügen, müssen Sie dasselbe tun, wie wir es normalerweise tun, indem Sie dem JSX-Code JavaScript-Konstrukte hinzufügen. {this.state.answer} nämlich das Konstrukt {this.state.answer} am Ende der Zeile hinzu. Infolgedessen sieht der vollständige Komponentencode folgendermaßen aus:

 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>       )   } } 

Und so sieht die Anwendungsseite im Browser aus.


Anwendungsseite im Browser

An dieser Stelle möchte ich darauf hinweisen, dass der Status, den die Komponente während der Initialisierung erhält, während des Betriebs der Komponente geändert werden kann. Darüber hinaus können Komponenten mithilfe des Mechanismus zum Arbeiten mit bereits bekannten Eigenschaften den Status an untergeordnete Komponenten übergeben. Wenn wir in unserem Fall beispielsweise davon ausgehen, dass es eine bestimmte Komponente von ChildComponent , können Daten aus dem Status folgendermaßen an sie übertragen werden:

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

Wir werden zwar nicht im Detail darüber sprechen, wie die im Status der Komponente gespeicherten Daten geändert werden können. Wir stellen nur fest, dass beim Aufrufen der setState() -Methode, mit der dieses Problem gelöst wird, nicht nur der Status der Komponente geändert wird, sondern auch die setState() , die über den Eigenschaftsmechanismus an die untergeordneten Komponenten übertragen werden, aktualisiert werden. Wenn Sie den Status ändern, ändern sich außerdem die Daten aus dem auf der Anwendungsseite angezeigten Status automatisch.

Zusammenfassung


Heute hatten Sie die Möglichkeit, mit klassenbasierten Komponenten zu arbeiten. Darüber hinaus begann hier Ihre Einführung in das Konzept des Komponentenstatus. Das nächste Mal finden Sie praktische Aufgaben für die Arbeit mit dem Staat.

Liebe Leser! Wenn Sie React in der Praxis verwenden, teilen Sie uns bitte mit, wie Sie den Status von Komponenten verwalten. Verwenden Sie Standard-React-Tools oder etwas anderes?

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


All Articles