React Tutorial Teil 10: Workshop zum Arbeiten mit Komponenteneigenschaften und zum Styling

Heute, im zehnten Teil der Übersetzung des React-Schulungskurses, empfehlen wir Ihnen, eine praktische Aufgabe zum Arbeiten mit den Eigenschaften von Komponenten und zum Gestalten dieser zu erledigen.

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 20. Workshop. Komponenteneigenschaften, Styling


→ Original

»Job


  1. Erstellen Sie ein neues React-Anwendungsprojekt.
  2. Zeigen Sie die App-Komponente auf der Anwendungsseite an, deren Code sich in einer separaten Datei befinden sollte.
  3. Die App-Komponente sollte 5 Joke ausgeben, die Witze enthalten. Bringen Sie diese Komponenten so heraus, wie Sie es möchten.
  4. Jede Joke Komponente sollte die question Eigenschaft für den Hauptteil des Witzes und die punchLine Eigenschaft für ihre Schlüsselphrase akzeptieren und verarbeiten.

▍Zusatzaufgabe


Einige Witze bestehen ausschließlich aus einem Schlüsselbegriff. Zum Beispiel: "Es ist schwierig, Kleptomanen Wortspiele zu erklären, weil sie die Dinge immer wörtlich nehmen." Überlegen Sie, wie die Joke Komponente punchLine an sie übergebene punchLine Eigenschaft nur anzeigen kann, wenn die question Eigenschaft nicht festgelegt ist. Experimentieren Sie mit dem Styling Ihrer Komponenten.

▍Lösung


Hauptaufgabe


Die Datei index.js mir bekannt vor:

 import React from "react" import ReactDOM from "react-dom" import App from "./App" ReactDOM.render(<App />,   document.getElementById("root")) 

Hier ist der Code für die Datei App.js :

 import React from "react" import Joke from "./Joke" function App() {   return (       <div>           <Joke               question="What's the best thing about Switzerland?"               punchLine="I don't know, but the flag is a big plus!"           />                     <Joke               question="Did you hear about the mathematician who's afraid of negative numbers?"               punchLine="He'll stop at nothing to avoid them!"           />                     <Joke               question="Hear about the new restaurant called Karma?"               punchLine="There's no menu: You get what you deserve."           />                     <Joke               question="Did you hear about the actor who fell through the floorboards?"               punchLine="He was just going through a stage."           />                     <Joke               question="Did you hear about the claustrophobic astronaut?"               punchLine="He just needed a little space."           />                 </div>   ) } export default App 

Da sich die Joke Komponentendatei im selben Ordner wie die App Komponentendatei befindet, importieren wir sie mit dem import Joke from "./Joke" . Wir geben mehrere Elemente aus der App , daher müssen wir die gesamte Ausgabe in ein bestimmtes Tag einschließen, z. B. in das <div> . An die Komponenteninstanzen übergeben wir die question und punchLine .

Hier ist der Code für die Datei Joke.js :

 import React from "react" function Joke(props) {   return (       <div>           <h3>Question: {props.question}</h3>           <h3>Answer: {props.punchLine}</h3>           <hr/>       </div>   ) } export default Joke 

Hier geben wir beim Deklarieren der Joke Funktion den Parameter props . Denken Sie daran, dass es ein solcher Name ist, der gemäß der etablierten Tradition verwendet wird. In der Tat kann es alles sein, aber es ist besser, es props zu nennen.

Wir geben mehrere Elemente von der Komponente zurück - daher sind sie im <div> . Mit den props.punchLine props.question und props.punchLine wir auf die Eigenschaften zu, die beim props.question an die Komponenteninstanz übergeben wurden. Diese Eigenschaften werden zu Eigenschaften des props . Sie sind in geschweiften Klammern eingeschlossen, da der im JSX-Markup verwendete JavaScript-Code in geschweiften Klammern eingeschlossen sein muss. Andernfalls nimmt das System die Variablennamen als Klartext. Nach einem Paar von <h3> -Elementen, in denen der Haupttext des Witzes angezeigt wird, und in dem anderen - seiner Schlüsselphrase - befindet sich das <hr/> -Element, das die horizontale Linie beschreibt. Solche Zeilen werden nach jedem Witz angezeigt und getrennt.

So sieht das Anwendungsprojekt in VSCode aus.


Anwendung in VSCode

Hier ist die Bewerbungsseite.


Anwendungsseite im Browser

Zusätzliche Aufgabe


Denken Sie daran, dass das Hauptziel der zusätzlichen Aufgabe darin besteht, die korrekte Schlussfolgerung von Witzen zu organisieren, die ausschließlich aus einer Schlüsselphrase bestehen. Dies drückt sich darin aus, dass beim Erstellen einer Instanz der Joke Komponente nur die punchLine Eigenschaft punchLine wird und die question Eigenschaft nicht übergeben wird. Das Erstellen einer Instanz einer solchen Komponente sieht folgendermaßen aus:

 <Joke   punchLine="It's hard to explain puns to kleptomaniacs because they always take things literally." /> 

Wenn Sie diesen Code oben in den von der App Komponente zurückgegebenen Code einfügen, sieht die Anwendungsseite folgendermaßen aus.


Falsch gestaltete Anwendungsseite

Offensichtlich besteht das Problem hier darin, dass, obwohl die question Eigenschaft nicht an die Komponente übergeben wird, Text angezeigt wird, der dem Hauptteil jedes Witzes vorausgeht, wonach nichts ausgegeben wird.

Mit Blick auf die Zukunft werden wir feststellen, dass wir in zukünftigen Teilen des Kurses über bedingtes Rendern sprechen werden. Mit diesem Rendering-Ansatz können Sie Probleme wie das unsere effektiv lösen. In der Zwischenzeit werden wir versuchen, die Mittel zum Stylen von Seiten zu verwenden. Wir werden es so machen, dass, wenn die question Eigenschaft nicht an die Komponente übergeben wird, das entsprechende Fragment des von ihr zurückgegebenen JSX-Markups nicht auf der Seite angezeigt wird. Hier ist der vollständige Code für die Joke Komponente, der einen der möglichen Ansätze zur Lösung unseres Problems mithilfe von CSS implementiert:

 import React from "react" function Joke(props) {   return (       <div>           <h3 style={{display: props.question ? "block" : "none"}}>Question: {props.question}</h3>           <h3>Answer: {props.punchLine}</h3>           <hr/>       </div>   ) } export default Joke 

Wir weisen dem ersten Element <h3> Stil zu, der während der Instanziierung der Komponente basierend auf dem Vorhandensein der Eigenschaft props.question im Objekt bestimmt wird. Wenn sich diese Eigenschaft im Objekt befindet, übernimmt das Element den display: block und wird auf der Seite angezeigt. Wenn nicht, wird display: none angezeigt und nicht auf der Seite angezeigt. Die Verwendung einer solchen Konstruktion führt zu demselben Effekt:

 <h3 style={{display: !props.question && "none"}}>Question: {props.question}</h3> 

Hier wird dem Element die display: none Stil wird zugewiesen, wenn das props nicht über die question Eigenschaft verfügt, andernfalls wird der display nichts zugewiesen.

Jetzt sieht die Anwendungsseite im Browser wie unten gezeigt aus.


Ordnungsgemäße Behandlung von Komponenten in einer Situation, in der die Frageeigenschaft nicht an sie übergeben wird

Möglicherweise stellen Sie fest, dass alle von der Joke Komponente gebildeten Elemente gleich aussehen. Lassen Sie uns darüber nachdenken, wie Sie diejenigen auswählen, die nur die punchLine Eigenschaft übergeben. Wir werden dieses Problem mithilfe der integrierten Stile und des oben untersuchten Ansatzes lösen. Hier ist der aktualisierte Code für die Joke Komponente:

 import React from "react" function Joke(props) {   return (       <div>           <h3 style={{display: !props.question && "none"}}>Question: {props.question}</h3>           <h3 style={{color: !props.question && "#888888"}}>Answer: {props.punchLine}</h3>           <hr/>       </div>   ) } export default Joke 

Und hier ist, was jetzt auf der Anwendungsseite erscheint.


Styling eines Artikels, der sich von anderen unterscheidet

Nachdem wir an der Joke Komponente gearbeitet haben, ist sie vielseitiger und besser für die Wiederverwendung geeignet.

Zusammenfassung


In dieser praktischen Lektion haben wir Fähigkeiten entwickelt, um Eigenschaften auf Komponenten zu übertragen. Wenn Sie den Code in dem hier angegebenen Beispiel analysieren, werden Sie feststellen, dass Sie zur Wiederholung mehrerer ähnlicher Markup-Blöcke ständig sich wiederholende Fragmente des JSX-Codes schreiben müssen. In der nächsten Lektion werden wir darüber sprechen, wie die Erstellung solcher Seiten mithilfe von Standard-JavaScript-Tools automatisiert werden kann, während Markup und Daten getrennt werden.

Liebe Leser! Wenn sich Ihre Lösung für die Probleme dieses Workshops von der vorgeschlagenen unterscheidet, teilen Sie uns dies bitte mit.

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


All Articles