React Tutorial Teil 21: Zweite Lektion und Workshop zum bedingten Rendern

In der Übersetzung des nĂ€chsten Teils des React-Schulungskurses machen wir Sie heute auf die zweite Lektion zum bedingten Rendern und einen Workshop zu diesem Thema aufmerksam.

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 37. Bedingtes Rendern, Teil 2


→ Original

Im heutigen Tutorial zum bedingten Rendern werden wir uns mit der Verwendung des logischen Operators && (And) && . Wir werden mit einem Standardprojekt experimentieren, das von create-react-app erstellt wurde und in App.js Datei App.js der folgende Code befindet:

 import React, {Component} from "react" class App extends Component {   constructor() {       super()       this.state = {           unreadMessages: [               "Call your mom!",               "New spam email available. All links are definitely safe to click."           ]       }   }   render() {       return (           <div>              <h2>You have {this.state.unreadMessages.length} unread messages!</h2>           </div>       )   } } export default App 

Jetzt sieht die Anwendung im Browser wie unten gezeigt aus.


Anwendungsseite im Browser

Möglicherweise haben Sie den Operator && in Konstruktionen wie true && false (was false ergibt). Damit der true Ausdruck als Ergebnis der Berechnung eines solchen Ausdrucks zurĂŒckgegeben wird, sollte er wie true && true aussehen. Bei der Verarbeitung solcher AusdrĂŒcke ermittelt JavaScript, ob die linke Seite wahr ist, und gibt in diesem Fall einfach das zurĂŒck, was sich auf der rechten Seite befindet. Wenn ein Ausdruck des Formulars false && false verarbeitet wird, wird false sofort zurĂŒckgegeben, ohne die rechte Seite des Ausdrucks zu ĂŒberprĂŒfen. Infolgedessen kann der Operator && beim bedingten Rendern verwendet werden. Damit können Sie entweder etwas zurĂŒckgeben, das auf dem Bildschirm angezeigt wird, oder nichts zurĂŒckgeben.

Lassen Sie uns den Code der Trainingsanwendung analysieren.

Der Status der App Komponente speichert ein Array von unreadMessages Zeichenfolgen. Jede Zeile in diesem Array reprÀsentiert eine ungelesene Nachricht. Auf der Seite wird die Anzahl der ungelesenen Nachrichten angezeigt, die anhand der LÀnge des Arrays ermittelt werden. Wenn dieses Array leer ist, dh kein einzelnes Element enthÀlt, zeigt die Anwendung an, was unten auf der Seite angezeigt wird.


Die Anwendung informiert uns, dass keine ungelesenen Nachrichten vorliegen

Um diesen Effekt zu erzielen, reicht es aus, das Array in die folgende Form zu bringen: unreadMessages: [] .

Wenn keine ungelesenen Nachrichten vorhanden sind, ist es durchaus möglich, ĂŒberhaupt keine Nachricht anzuzeigen. Wenn wir den ternĂ€ren Operator verwenden, ĂŒber den wir das letzte Mal gesprochen haben , um dieses Verhalten der Anwendung zu implementieren, kann die render() -Methode der App Komponente wie folgt umgeschrieben werden:

 render() {   return (       <div>           {               this.state.unreadMessages.length > 0 ?              <h2>You have {this.state.unreadMessages.length} unread messages!</h2> :               null           }       </div>   ) } 

Wenn das Array unreadMessages leer ist, wird auf der Seite nichts angezeigt. Der hier dargestellte Code kann jedoch mithilfe des Operators && vereinfacht werden. So wĂŒrde es aussehen:

 render() {   return (       <div>           {               this.state.unreadMessages.length > 0 &&              <h2>You have {this.state.unreadMessages.length} unread messages!</h2>           }       </div>   ) } 

Wenn sich etwas im Array befindet, wird die rechte Seite des Ausdrucks auf der Seite angezeigt. Wenn das Array leer ist, wird auf der Seite nichts angezeigt.

Dies bedeutet nicht, dass die Verwendung des Operators && beim bedingten Rendern unbedingt erforderlich ist, da der gleiche Effekt mit einem ternĂ€ren Operator erzielt werden kann, der null zurĂŒckgibt, wenn die getestete Bedingung falsch ist. Der hier vorgestellte Ansatz vereinfacht jedoch den Code und wird außerdem hĂ€ufig verwendet, sodass Sie ihn möglicherweise beim Lesen der Programme anderer Personen finden.

Lektion 38. Workshop. Bedingtes Rendern


→ Original

»Job


Hier ist der Code der App Funktionskomponente, der in der App.js Datei eines Standardprojekts gespeichert ist, das mit create-react-app erstellt wurde.

 import React from "react" function App() {   return (       <div>           Code goes here       </div>   ) } export default App 

Sie mĂŒssen Folgendes tun:

  1. Konvertieren Sie den Komponentencode, um ihn mit state auszustatten.
  2. Stellen Sie sicher, dass der Status der Komponente Informationen darĂŒber speichert, ob der Benutzer „angemeldet“ ist oder nicht (in dieser Übung bedeutet „Anmelden“ und „Abmelden“ des Systems nur das Ändern des entsprechenden im Status gespeicherten Werts).
  3. FĂŒgen Sie der Seite hinzu, dass die Komponente eine SchaltflĂ€che bildet, mit der sich der Benutzer an- und abmelden kann.

    1. Dies ist eine zusÀtzliche Aufgabe. Stellen Sie sicher, dass auf der SchaltflÀche ANMELDEN angezeigt wird, wenn der Benutzer nicht angemeldet ist. Wenn er angemeldet ist, wird LOG OUT .
  4. Logged in Sie auf der von der Komponente gebildeten Seite Logged in wenn der Benutzer angemeldet ist, und Logged out wenn er nicht Logged out .

Wenn Sie jetzt das GefĂŒhl haben, dass es fĂŒr Sie schwierig ist, diese Probleme zu lösen, lesen Sie die Tipps und machen Sie sich an die Arbeit.

▍Tipps


Um diese Aufgabe abzuschließen, mĂŒssen Sie sich an vieles erinnern, worĂŒber wir in frĂŒheren Kursen gesprochen haben. ZunĂ€chst muss eine Komponente, die einen Status haben kann, eine Komponente sein, die auf einer Klasse basiert. Diese Komponente muss einen Konstruktor haben. Im Status der Komponente können Sie eine logische Eigenschaft speichern, die beispielsweise als isLoggedIn kann. Der Wert true oder false gibt an, ob der Benutzer angemeldet ist oder nicht. Damit die SchaltflĂ€che, die der von der Anwendung generierten Seite hinzugefĂŒgt werden muss, ihre Funktionen ausfĂŒhren kann, ist ein onClick Ereignishandler onClick . Um je nach dem sich Ă€ndernden Wert des Staates unterschiedliche Texte anzuzeigen, muss auf die Technologie des bedingten Renderings zurĂŒckgegriffen werden.

▍Lösung


Wir transformieren die im Code verfĂŒgbare Funktionskomponente in die Komponente basierend auf einer Klasse. Wir brauchen dies aus mehreren GrĂŒnden. ZunĂ€chst mĂŒssen wir mit dem Status der Anwendung arbeiten. Zweitens benötigen wir einen Ereignishandler, der aufgerufen wird, wenn auf eine SchaltflĂ€che geklickt wird. Im Prinzip können Sie eine unabhĂ€ngige Funktion schreiben und damit SchaltflĂ€chenereignisse verarbeiten. Ich beschreibe jedoch lieber Handler innerhalb der Komponentenklassen.

So sieht der Code fĂŒr eine Funktionskomponente aus, die in eine klassenbasierte Komponente konvertiert wurde. Hier beschreiben wir im Komponentenkonstruktor seinen Anfangszustand, der die auf false isLoggedIn Eigenschaft isLoggedIn enthĂ€lt.

 import React from "react" class App extends React.Component {   constructor() {       super()       this.state = {           isLoggedIn: false       }   }   render() {          return (           <div>               Code goes here           </div>       )   } } export default App 

Der obige Code ist eine Lösung fĂŒr den ersten und zweiten Teil der Aufgabe. Jetzt arbeiten wir daran, der von der Komponente angezeigten Seite eine SchaltflĂ€che hinzuzufĂŒgen. Bisher wird auf dieser SchaltflĂ€che dieselbe Beschriftung angezeigt, unabhĂ€ngig davon, was im Anwendungsstatus gespeichert ist. Wir werden es mit einem Ereignishandler ausstatten, der die FunktionsfĂ€higkeit unseres Codes ĂŒberprĂŒft. Dies ist ein einfacher Befehl, um eine Nachricht an die Konsole auszugeben. DarĂŒber hinaus binden wir im Komponentenkonstruktor diesen Handler an this , was fĂŒr uns nĂŒtzlich ist, wenn wir im Code dieses Handlers auf die Mechanismen zugreifen, die fĂŒr die Arbeit mit dem Status der Komponente ausgelegt sind. Jetzt sieht der Code wie folgt aus.

 import React from "react" class App extends React.Component {   constructor() {       super()       this.state = {           isLoggedIn: false       }       this.handleClick = this.handleClick.bind(this)   }     handleClick() {       console.log("I'm working!")   }     render() {          return (           <div>               <button onClick={this.handleClick}>LOG IN</button>           </div>       )   } } export default App 

Wenn Sie auf die SchaltflÀche LOG IN klicken, I'm working! .

Erinnern wir uns nun daran, dass sich die im isLoggedIn gespeicherte Eigenschaft isLoggedIn beim Klicken auf die SchaltflĂ€che von true in false und umgekehrt isLoggedIn . Dazu mĂŒssen Sie im SchaltflĂ€chenklick-Handler die Funktion this.setState() , die auf zwei Arten verwendet werden kann. Es kann nĂ€mlich in Form eines Objekts eine neue Vorstellung davon vermittelt werden, was in dem Zustand enthalten sein soll. Die zweite Variante ihrer Verwendung sieht die Übertragung einer Funktion an sie vor, die den vorherigen Zustand der Komponente annimmt und einen neuen bildet und das Objekt wieder zurĂŒckgibt. Wir werden genau das tun. Das haben wir in dieser Phase der Arbeit bekommen.

 import React from "react" class App extends React.Component {   constructor() {       super()       this.state = {           isLoggedIn: false       }       this.handleClick = this.handleClick.bind(this)   }     handleClick() {       this.setState(prevState => {           return {               isLoggedIn: !prevState.isLoggedIn           }       })   }     render() {          return (           <div>               <button onClick={this.handleClick}>LOG IN</button>           </div>       )   } } export default App 

Hier könnten wir das if-else-Konstrukt verwenden, aber wir konvertieren einfach true in false und false in true mithilfe des logischen Operators ! (NICHT).

Bisher haben wir keinen Mechanismus, der es uns ermöglicht, basierend auf dem, was im Status gespeichert ist, das Erscheinungsbild der Anwendung zu beeinflussen. Daher werden wir jetzt die zusÀtzliche Aufgabe von Aufgabe Nummer 3 lösen. Wir werden nÀmlich die Beschriftung auf der SchaltflÀche abhÀngig vom Status der Komponente Àndern. Um dies zu erreichen, können Sie in der render() -Methode eine Variable deklarieren, deren Wert LOG IN oder LOG OUT davon abhÀngt, was im Status gespeichert ist. Dieser Wert kann dann als SchaltflÀchentext verwendet werden. So sieht es aus.

 import React from "react" class App extends React.Component {   constructor() {       super()       this.state = {           isLoggedIn: false       }       this.handleClick = this.handleClick.bind(this)   }     handleClick() {       this.setState(prevState => {           return {               isLoggedIn: !prevState.isLoggedIn           }       })   }     render() {         let buttonText = this.state.isLoggedIn ? "LOG OUT" : "LOG IN"       return (           <div>               <button onClick={this.handleClick}>{buttonText}</button>           </div>       )   } } export default App 

Nehmen wir nun den vierten Teil der Aufgabe. Wir werden Text auf der Seite anzeigen, je nachdem, ob der Benutzer angemeldet ist oder nicht. In der Tat ist die Lösung dieses Problems sehr einfach, wenn man alles berĂŒcksichtigt, was bereits im Komponentencode vorhanden ist. Unten finden Sie den fertigen Code fĂŒr die Datei App.js

 import React from "react" class App extends React.Component {   constructor() {       super()       this.state = {           isLoggedIn: false       }       this.handleClick = this.handleClick.bind(this)   }     handleClick() {       this.setState(prevState => {           return {               isLoggedIn: !prevState.isLoggedIn           }       })   }     render() {         let buttonText = this.state.isLoggedIn ? "LOG OUT" : "LOG IN"       let displayText = this.state.isLoggedIn ? "Logged in" : "Logged out"       return (           <div>               <button onClick={this.handleClick}>{buttonText}</button>               <h1>{displayText}</h1>           </div>       )   } } export default App 

So sieht die Anwendung im Browser aus.


Anwendungsseite im Browser

Durch Klicken auf die in der vorherigen Abbildung gezeigte SchaltflĂ€che LOG OUT wird der Anwendungsstatus geĂ€ndert. LOG OUT wird Anmelden auf der SchaltflĂ€che angezeigt und auf der Seite wird Text angezeigt, der den Benutzer darĂŒber informiert, dass er angemeldet ist.

Zusammenfassung


Heute haben wir weiter ĂŒber bedingtes Rendern gesprochen, die Verwendung des Operators && untersucht und eine praktische Aufgabe mit vielen der von uns untersuchten Mechanismen erledigt. Das nĂ€chste Mal werden Sie weiter an der Todo-Anwendung und einem neuen Thema arbeiten.

Liebe Leser! Haben Sie die heutige praktische Aufgabe gemeistert?

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


All Articles