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

â
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 KomponentenlebenszyklusTeil 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: KursprojektLektion 36. Bedingtes Rendern, Teil 1
â
OriginalBedingte 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 BrowserBitte 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>l;
. 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.
