React Tutorial Teil 20: Erste Lektion zum bedingten Rendern

In der Übersetzung des nĂ€chsten Teils des React-Tutorials werden wir heute ĂŒber das bedingte Rendern sprechen.

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 36. Bedingtes Rendern, Teil 1


→ Original

Bedingte Rendering-Technologien werden in FĂ€llen verwendet, in denen gemĂ€ĂŸ einer bestimmten Bedingung etwas auf einer Seite angezeigt werden muss. In dieser Lektion wird erlĂ€utert, wie eine spezielle Nachricht angezeigt wird (möglicherweise durch einen Ladebildschirm dargestellt), wĂ€hrend die Anwendung betriebsbereit ist, Daten lĂ€dt und nach dem Ersetzen ersetzt wird Diese Nachricht ist fĂŒr etwas anderes.

Heute werden wir mit einer Anwendung experimentieren, die mit den Tools zum Erstellen und Reagieren von App.js Datei App.js enthÀlt den folgenden Code:

 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 

DarĂŒber hinaus befindet sich in demselben Ordner, in dem sich die Datei App.js befindet, eine Conditional.js Komponentendatei mit den folgenden Inhalten:

 import React from "react" function Conditional(props) {   return (         ) } export default Conditional 

In dieser Phase der Arbeit wird diese Anwendung noch nicht funktionieren. Bei der Analyse des Materials werden wir sie reparieren.

Eine der Herausforderungen fĂŒr React-Entwickler besteht darin, dass sie viele Tools erlernen mĂŒssen, die auf verschiedene Arten verwendet werden können. Ein Programmierer ist nicht unbedingt auf nur eine Möglichkeit beschrĂ€nkt, ein bestimmtes Werkzeug zu verwenden. Dies wird durch die Tatsache beeinflusst, dass die React-Entwicklung der Entwicklung in einfachem JavaScript sehr nahe kommt.

Daher haben wir die Möglichkeit, unterschiedliche AnsĂ€tze zur Lösung derselben Probleme zu verwenden, sodass dieselben Tools auf unterschiedliche Weise verwendet werden können. Bedingtes Rendern ist der Bereich von React, in dem sich die oben genannten Ideen besonders stark manifestieren. Bevor wir beginnen, möchte ich darauf hinweisen, dass wir zwar verschiedene AnsĂ€tze fĂŒr die Anwendung dieser Technologie analysieren werden, die tatsĂ€chlichen Optionen fĂŒr ihre Verwendung jedoch nicht auf diese beschrĂ€nkt sind.

Lassen Sie uns ĂŒber den Code sprechen, mit dem wir jetzt experimentieren werden. Wir haben in der Datei App.js eine Komponente, die auf der Klasse basiert. Der Konstruktor hat einen Status initialisiert, der die auf true isLoading Eigenschaft isLoading enthĂ€lt. Ein solches Design wird hĂ€ufig in FĂ€llen verwendet, in denen es beispielsweise erforderlich ist, Anforderungen an eine bestimmte API auszufĂŒhren, um eine Komponente in einen funktionsfĂ€higen Zustand zu versetzen, und wĂ€hrend die Komponente auf das Eintreffen von Daten wartet und diese analysiert, muss etwas auf dem Bildschirm angezeigt werden. Es kann 3-4 Sekunden dauern, bis der API-Aufruf abgeschlossen ist, und Sie möchten nicht, dass der Benutzer auf dem Bildschirm denkt, dass Ihre Anwendung abgestĂŒrzt ist. Infolgedessen verfĂŒgt der Status ĂŒber eine Eigenschaft, die angibt, ob die Anwendung derzeit bestimmte Dienstaktionen ausfĂŒhrt. Das bedingte Rendern wird verwendet, um etwas anzuzeigen, das dem Benutzer mitteilt, dass die Anwendung gerade etwas im Hintergrund lĂ€dt.

Der App Komponentencode verfĂŒgt ĂŒber eine componentDidMount() -Methode, die wir in KĂŒrze diskutieren werden. In der Zwischenzeit achten wir auf die render() -Methode. Hier geben wir die Condition , die in den Code oben in der Datei App.js wird. Die Komponente isLoading an diese Komponente ĂŒbergeben. Dies ist der aktuelle Wert der isLoading Eigenschaft aus dem Status der App Komponente. Der Code der Conditional Komponente gibt nichts zurĂŒck, was auf dem Bildschirm angezeigt werden kann. Wir werden uns etwas spĂ€ter mit dieser Komponente befassen. In der Zwischenzeit kehren wir aus dem App Komponentencode zur Methode componentDidMount() .

Denken Sie daran, dass wir mit der componentDidMount() -Methode unmittelbar nach der ersten Anzeige der Komponente, in unserem Fall der App Komponente, Code ausfĂŒhren können. Im Code dieser Methode simulieren wir einen Aufruf an eine bestimmte API. Hier stellen wir den Timer auf eineinhalb Sekunden ein. Nach setTimeout() dieser Zeit wird der Code der an setTimeout() Funktion gestartet. In dieser Funktion wird basierend auf der Annahme, dass der Aufruf das Ende des Datenladens aus der API symbolisiert, eine StatusĂ€nderung durchgefĂŒhrt. Die isLoading Eigenschaft wird nĂ€mlich auf false . Dies zeigt an, dass der Daten-Download abgeschlossen ist und die Anwendung danach normal funktionieren kann. In zukĂŒnftigen Klassen werden wir ĂŒber die Verwendung der Funktion fetch() zum Laden von Daten sprechen. Im fetch() beschrĂ€nken wir uns auf die obige Simulation dieses Prozesses.

Übrigens ist es hier noch einmal angebracht, das Thema der Methoden des Komponentenlebenszyklus anzusprechen. Tatsache ist, dass die Conditional Komponente einen neuen Eigenschaftswert erhĂ€lt, sobald sich die Eigenschaft isLoading state von true in false Ă€ndert. isLoading die Komponente zum ersten Mal angezeigt wird, empfĂ€ngt sie in der Eigenschaft isLoading true und nach Änderung des Status dieselbe Eigenschaft mit dem neuen Wert. Wenn sich der Status Ă€ndert, wird die render() -Methode erneut aufgerufen. Infolgedessen wird auch die Conditional Komponente erneut angezeigt. Denken Sie daran, dass Conditional eine gewöhnliche Funktionskomponente ist, dh, dass das erneute Rendern den wiederholten Aufruf der Funktion bedeutet, der es prĂ€sentiert wird. Was wir jedoch von dieser Funktion zurĂŒckgeben, wenn wir die Komponente erneut rendern, kann von dem abweichen, was zuvor zurĂŒckgegeben wurde. Der Grund fĂŒr diese Änderung ist die Änderung dessen, was wir an die Komponente ĂŒbergeben.

Die Conditional Komponente akzeptiert also die Eigenschaft isLoading . Bevor wir mit der Arbeit an dem Code beginnen, werden wir prĂŒfen, ob die bereits vorhandenen Mechanismen funktionieren. Dazu geben wir ein Markup von der Komponente zurĂŒck und zeigen den Wert props.isLoading in der Konsole an. Danach sieht der Komponentencode folgendermaßen aus:

 import React from "react" function Conditional(props) {   console.log(props.isLoading)   return (       <h1>Temp</h1>   ) } export default Conditional 

Die darauf folgende Anwendungsseite sieht wie in der folgenden Abbildung dargestellt aus.


Anwendungsseite im Browser

Bitte beachten Sie, dass true unmittelbar nach dem Laden der Anwendung in der Konsole angezeigt wird und false - nach 1,5 Sekunden. Dies ist auf die Funktionsweise des obigen Mechanismus in der componentDidMount() -Methode der App Komponente zurĂŒckzufĂŒhren.

Lassen Sie uns nun ĂŒber das bedingte Rendern sprechen. Seine Essenz liegt in der Tatsache, dass wir etwas nur dann auf dem Bildschirm anzeigen, wenn eine bestimmte Bedingung erfĂŒllt ist. In diesem Fall können wir anstelle der Zeichenfolge Temp auf der Seite in der Conditional den Wert von props.isLoading ĂŒberprĂŒfen und, falls dies true , den Text Loading... auf der Seite anzeigen. Wenn dieser Wert false , was das Ende des Downloads angibt, können Sie einen anderen Text von der Komponente zurĂŒckgeben. Im Code sieht es folgendermaßen aus:

 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 

Versuchen Sie, diesen Code bei Ihnen zu Hause auszufĂŒhren, die Seite zu aktualisieren und zu beobachten, wie beim Laden der Seite ein Text angezeigt wird und nach einer Weile ein anderer.

Angesichts der JavaScript-Funktionen können wir den obigen Code folgendermaßen vereinfachen:

 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 

Wenn die im if Block ĂŒberprĂŒfte Bedingung wahr ist, funktioniert die return in diesem Block. Danach wird die Funktion abgeschlossen. Wenn die Bedingung falsch ist, ist der return aus diesem Block nicht erfĂŒllt und die Funktion gibt zurĂŒck, was in der zweiten return der Funktion angegeben ist.

Lassen Sie uns nun darĂŒber sprechen, wie Sie die Probleme des bedingten Renderns mit dem ternĂ€ren Operator lösen können. Dieses Konstrukt existiert sehr lange in JavaScript. Es wird hĂ€ufig in React verwendet, um bedingte Rendering-Aufgaben zu lösen. So sieht es aus:

  ? 1 : 2 

Der Wert von Ausdruck 1 wird zurĂŒckgegeben, wenn die Bedingung wahr ist, der Wert von Ausdruck 2 wird zurĂŒckgegeben, wenn die Bedingung falsch ist.

In unserem Fall kann der Code der Conditional Komponente mithilfe des ternÀren Operators wie folgt umgeschrieben werden:

 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 

Dieses Design, obwohl es funktioniert, sieht ungewöhnlich aus. Tatsache ist, dass Komponenten normalerweise komplexere Designs zurĂŒckgeben. Wickeln Sie daher alles in ein <div> -Element:

 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 

Ein solcher Code funktioniert auch, obwohl er nicht mehr so ​​ist, wie er sollte. Alles, was im <div&gtl; . Um dies zu beheben, erinnern wir uns, dass die JS-Konstrukte, die in dem von den Komponenten zurĂŒckgegebenen Markup verwendet werden, in geschweiften Klammern eingeschlossen sein mĂŒssen und den Code entsprechend umschreiben mĂŒssen:

 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 

Jetzt funktioniert alles wieder so wie es sollte.

Es ist zu beachten, dass in der realen Komponente das von ihnen zurĂŒckgegebene Markup komplizierter aussehen wĂŒrde. Hier kann beispielsweise im oberen Teil der Anzeige der Komponente eine Navigationsleiste vorhanden sein, im unteren Teil kann eine „Fußzeile“ der Seite bereitgestellt werden und so weiter. Es kann so aussehen:

 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 

DarĂŒber hinaus beeintrĂ€chtigt das Vorhandensein zusĂ€tzlicher Elemente in dem Markup, das von der Komponente zusĂ€tzlicher Elemente zurĂŒckgegeben wird, nicht die Mechanismen des bedingten Renderns. Außerdem werden diese Elemente sowohl angezeigt, wenn props.isLoading true , als auch wenn diese Eigenschaft false .

Eine weitere Verbesserung, die an diesem Code vorgenommen werden kann, basiert auf der Tatsache, dass props.isLoading , da props.isLoading um eine boolesche Eigenschaft handelt, die den Wert true oder false annimmt, direkt verwendet werden kann, ohne den strengen Vergleichsoperator mit true . Das Ergebnis ist folgendes:

 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 

Jetzt sind wir zu einem funktionierenden Beispiel fĂŒr die Verwendung der bedingten Rendering-Technologie gekommen, aber die gleichen Ergebnisse können auf viele Arten erzielt werden. Beispielsweise werden in Komponenten wie unserer normalerweise Navigationsfelder und Seitenfußzeilen nicht angezeigt. Solche Seitenelemente werden normalerweise entweder von der App Komponente selbst oder von speziellen Komponenten angezeigt, die von der App Komponente angezeigt werden.

DarĂŒber hinaus sollte beachtet werden, dass sich hier die gesamte Logik des bedingten Renderns innerhalb der render() -Methode der Funktionskomponente befindet, die nur durchgefĂŒhrt wurde, um kompakten Code zu demonstrieren, der an einer Stelle zusammengestellt wurde. Wahrscheinlich sollte die App Komponente fĂŒr das bedingte Rendern verantwortlich sein, und eine Komponente, die unserer Conditional Komponente Ă€hnelt, sollte einfach anzeigen, was an sie ĂŒbergeben wurde. Wenn die App Komponente dafĂŒr verantwortlich ist, herauszufinden, ob zu einem bestimmten Zeitpunkt etwas geladen wird, und wenn dieser Vorgang abgeschlossen ist, sollte sie höchstwahrscheinlich dafĂŒr verantwortlich sein, zu bestimmen, was auf der Seite angezeigt werden soll. Das heißt, in unserem Fall könnte der Code neu organisiert werden, indem die isLoading Eigenschaft in der render() -Methode der App Komponente ĂŒberprĂŒft und der Text wie Loading... isLoading falls der Download nicht abgeschlossen ist, oder indem eine Komponente Ă€hnlich der Conditional Komponente in Conditional wird Wenn der Download abgeschlossen ist. Gleichzeitig akzeptiert die Conditional Komponente möglicherweise keine Eigenschaften aus der App und zeigt in jedem Fall nur an, was sie ausgeben soll.

So sieht der App-Komponentencode aus, der gemĂ€ĂŸ diesen Überlegungen konvertiert wurde:

 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 

Und hier ist der aktualisierte Code der Conditional Komponente, in dem jetzt keine ÜberprĂŒfung von Bedingungen erfolgt:

 import React from "react" function Conditional(props) {   return <h1>Some cool stuff about conditional rendering</h1> } export default Conditional 

Hier haben wir jedoch die Navigationsleiste und den "Keller" entfernt, was in diesem Fall jedoch nicht wichtig ist.

Zusammenfassung


In dieser Lektion fand Ihre erste EinfĂŒhrung in bedingte Rendering-Technologien statt. NĂ€chstes Mal werden wir uns weiter mit ihnen befassen. Insbesondere erhalten Sie eine zweite Lektion zum bedingten Rendern und zur praktischen Arbeit zu diesem Thema.

Liebe Leser! Wenn Sie React-Anwendungen entwickeln, bitten wir Sie, uns mitzuteilen, wie Sie das bedingte Rendern durchfĂŒhren.

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


All Articles