Im heutigen Teil der Übersetzung des React-Tutorials werden wir uns mit Komponenteneigenschaften befassen. Dies ist eines der wichtigsten Konzepte in dieser Bibliothek.

→ 
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 19. Komponenteneigenschaften in React
→ 
OriginalErstellen Sie ein neues Projekt mit 
create-react-app und ändern Sie den Code mehrerer Standarddateien aus dem Ordner 
src .
Hier ist der Code für die Datei 
index.js :
 import React from "react" import ReactDOM from "react-dom" import "./index.css" import App from "./App" ReactDOM.render(<App />, document.getElementById("root")) 
Hier sind die Stile, die in der Datei 
index.css werden:
 body { margin: 0; } .contacts { display: flex; flex-wrap: wrap; } .contact-card { flex-basis: 250px; margin: 20px; } .contact-card > img { width: 100%; height: auto; } .contact-card > h3 { text-align: center; } .contact-card > p { font-size: 12px; } 
Hier ist der Code in der Datei 
App.js :
 import React from "react" function App() {   return (       <div className="contacts">           <div className="contact-card">               <img align="center" src="http://placekitten.com/300/200"/>               <h3><font color="#3AC1EF">▍Mr. Whiskerson</font></h3>               <p>Phone: (212) 555-1234</p>               <p>Email: mr.whiskaz@catnap.meow</p>           </div>                     <div className="contact-card">               <img align="center" src="http://placekitten.com/400/200"/>               <h3><font color="#3AC1EF">▍Fluffykins</font></h3>               <p>Phone: (212) 555-2345</p>               <p>Email: fluff@me.com</p>           </div>                     <div className="contact-card">               <img align="center" src="http://placekitten.com/400/300"/>               <h3><font color="#3AC1EF">▍Destroyer</font></h3>               <p>Phone: (212) 555-3456</p>               <p>Email: ofworlds@yahoo.com</p>           </div>                     <div className="contact-card">               <img align="center" src="http://placekitten.com/200/100"/>               <h3><font color="#3AC1EF">▍Felix</font></h3>               <p>Phone: (212) 555-4567</p>               <p>Email: thecat@hotmail.com</p>           </div>       </div>   ) } export default App 
So sieht diese App in einem Browser aus.
Anwendungsseite im BrowserNach der Analyse des Codes und des Erscheinungsbilds der Anwendung können wir den Schluss ziehen, dass es hilfreich wäre, spezielle Komponenten zu verwenden, um Karten mit Informationen über Tiere anzuzeigen. Diese Elemente werden nun mithilfe der 
App Komponente gebildet. In Anbetracht dessen, worüber wir in früheren Klassen gesprochen haben, können Sie noch weiter gehen - denken Sie an eine universelle Komponente, die angepasst werden kann, indem Attribute oder Eigenschaften an sie übergeben werden.
In unserer Anwendung gibt es Karten mit Bildern von Katzen, ihren Namen und Kontaktinformationen ihrer Besitzer (oder vielleicht ihrer selbst) - ein Telefon und eine E-Mail-Adresse. Um eine Komponente zu erstellen, die später als Grundlage für alle diese Karten dient, können Sie eines der von der 
App Komponente zurückgegebenen Markup-Fragmente verwenden. Zum Beispiel - dies:
 <div className="contact-card">   <img align="center" src="http://placekitten.com/300/200"/>   <h3><font color="#3AC1EF">▍Mr. Whiskerson</font></h3>   <p>Phone: (212) 555-1234</p>   <p>Email: mr.whiskaz@catnap.meow</p> </div> 
App gibt vier solcher Blöcke zurück, von denen jeder zum Erstellen einer unabhängigen Komponente verwendet werden kann, aber dieser Ansatz passt nicht zu uns. Daher erstellen wir eine Komponente, die die Grundlage für alle von der Anwendung angezeigten Karten bildet. Erstellen Sie dazu eine neue Komponentendatei im Ordner 
src - 
ContactCard.js und 
ContactCard.js Sie einen Code ein, der das erste von der 
App Komponente zurückgegebene 
<div> -Element zurückgibt, dessen Code oben angegeben ist. Hier ist der Code für die 
ContactCard Komponente:
 import React from "react" function ContactCard() {   return (       <div className="contact-card">           <img align="center" src="http://placekitten.com/300/200"/>           <h3><font color="#3AC1EF">▍Mr. Whiskerson</font></h3>           <p>Phone: (212) 555-1234</p>           <p>Email: mr.whiskaz@catnap.meow</p>       </div>   ) } export default ContactCard 
Es ist klar, dass, wenn Sie mehrere Instanzen dieser Komponente erstellen, alle dieselben Daten enthalten, da diese Daten im Komponentencode fest codiert sind. Und wir möchten, dass beim Erstellen verschiedener Instanzen dieser Komponente die von ihr angezeigten Daten angepasst werden können. Der Punkt ist, dass der Komponente bestimmte Eigenschaften übergeben werden könnten, die er dann verwenden kann.
Wir arbeiten mit Funktionskomponenten, bei denen es sich um gewöhnliche JS-Funktionen handelt, bei denen dank der React-Bibliothek spezielle Konstruktionen verwendet werden können. Wie Sie wissen, können Funktionen Argumente annehmen, obwohl sie ohne Argumente verwendet werden können. Ein 
ContactCard unserer 
ContactCard Komponente in der Form, in der sie jetzt existiert, kann eine so einfache Funktion sein, dass, ohne etwas zu akzeptieren, einfach die Summe zweier Zahlen zurückgegeben wird:
 function addNumbers() {   return 1 + 1 } 
Es kann verwendet werden, um die Summe der Zahlen 1 und 1 herauszufinden, aber um beispielsweise 1 und 2 zu addieren und Funktionen zu verwenden, die keine Eingabe akzeptieren, müssten wir eine neue Funktion schreiben. Es ist ziemlich offensichtlich, dass dieser Ansatz zu großen Unannehmlichkeiten führt, wenn Sie verschiedene Zahlen hinzufügen müssen. In einer solchen Situation ist es daher ratsam, eine universelle Funktion zum Hinzufügen von Zahlen zu erstellen, die zwei Zahlen akzeptiert und deren Summe zurückgibt:
 function addNumbers(a, b) {   return a + b } 
Was eine solche Funktion zurückgibt, hängt davon ab, welche Argumente beim Aufruf an sie übergeben wurden. Durch das Erstellen von React-Komponenten können wir genauso vorgehen.
Wir importieren die 
App.js Komponente 
ContactCard und geben vier ihrer Instanzen zurück, ohne den Code zu löschen, der die Karten auf der Anwendungsseite bildet:
 import React from "react" import ContactCard from "./ContactCard" function App() {   return (       <div className="contacts">           <ContactCard />           <ContactCard />           <ContactCard />           <ContactCard />           <div className="contact-card">               <img align="center" src="http://placekitten.com/300/200"/>               <h3><font color="#3AC1EF">▍Mr. Whiskerson</font></h3>               <p>Phone: (212) 555-1234</p>               <p>Email: mr.whiskaz@catnap.meow</p>           </div>                     <div className="contact-card">               <img align="center" src="http://placekitten.com/400/200"/>               <h3><font color="#3AC1EF">▍Fluffykins</font></h3>               <p>Phone: (212) 555-2345</p>               <p>Email: fluff@me.com</p>           </div>                     <div className="contact-card">               <img align="center" src="http://placekitten.com/400/300"/>               <h3><font color="#3AC1EF">▍Destroyer</font></h3>               <p>Phone: (212) 555-3456</p>               <p>Email: ofworlds@yahoo.com</p>           </div>                     <div className="contact-card">               <img align="center" src="http://placekitten.com/200/100"/>               <h3><font color="#3AC1EF">▍Felix</font></h3>               <p>Phone: (212) 555-4567</p>               <p>Email: thecat@hotmail.com</p>           </div>       </div>   ) } export default App 
Lassen Sie uns nun an dem Code arbeiten, der zum Instanziieren der 
ContactCard Komponente verwendet wird. Durch das Erstellen regulärer HTML-Elemente können wir deren Attribute anpassen, die sich auf ihr Verhalten und Erscheinungsbild auswirken. Die Namen dieser Attribute sind vom Standard fest codiert. Bei Komponenten können Sie genau den gleichen Ansatz verwenden. Der einzige Unterschied besteht darin, dass wir die Attributnamen selbst erstellen und selbst entscheiden, wie sie im Komponentencode verwendet werden.
Jede der Karten enthält vier Informationen, die sich von Karte zu Karte ändern können. Dies ist ein Bild einer Katze und ihres Namens sowie eine Telefon- und E-Mail-Adresse. Lassen Sie den Katzennamen in der Eigenschaft 
name , die 
imgURL in der Eigenschaft 
imgURL , das Telefon in der Eigenschaft 
phone und die E-Mail-Adresse in der Eigenschaft 
email .
Wir setzen diese Eigenschaften auf Instanzen von 
ContactCard Komponenten und löschen beim Übertragen von Daten aus dem Code, der bereits in der 
App , die entsprechenden Fragmente. Infolgedessen sieht der Code der 
App Komponente folgendermaßen aus:
 import React from "react" import ContactCard from "./ContactCard" function App() {   return (       <div className="contacts">           <ContactCard               name="Mr. Whiskerson"               imgUrl="http://placekitten.com/300/200"               phone="(212) 555-1234"               email="mr.whiskaz@catnap.meow"           />                     <ContactCard               name="Fluffykins"               imgUrl="http://placekitten.com/400/200"               phone="(212) 555-2345"               email="fluff@me.com"           />                     <ContactCard               name="Destroyer"               imgUrl="http://placekitten.com/400/300"               phone="(212) 555-3456"               email="ofworlds@yahoo.com"           />                     <ContactCard               name="Felix"               imgUrl="http://placekitten.com/200/100"               phone="(212) 555-4567"               email="thecat@hotmail.com"           />                 </div>   ) } export default App 
Die bloße Übertragung von Eigenschaften auf eine Komponente reicht zwar nicht aus, um sie darin zu verwenden. Die Seite, die von der obigen 
App Komponente gebildet wird, enthält vier identische Karten, deren Daten im Code der 
ContactCard Komponente festgelegt sind, die noch nicht weiß, was mit den darauf übertragenen Eigenschaften zu tun ist.
Kartendaten sind im Code fest codiert, die Komponente kann nicht mit den an sie übergebenen Eigenschaften arbeitenJetzt ist es an der Zeit, darüber zu sprechen, wie die 
ContactCard Komponente mit den Eigenschaften arbeiten kann, die bei der Instanziierung an sie übergeben werden.
Wir lösen dieses Problem, indem wir beim Deklarieren der 
ContactCard Funktion angeben, dass sie den 
props akzeptiert. In diesem Fall sieht der Komponentencode folgendermaßen aus:
 import React from "react" function ContactCard(props) {   return (       <div className="contact-card">           <img align="center" src="http://placekitten.com/300/200"/>           <h3><font color="#3AC1EF">▍Mr. Whiskerson</font></h3>           <p>Phone: (212) 555-1234</p>           <p>Email: mr.whiskaz@catnap.meow</p>       </div>   ) } export default ContactCard 
Tatsächlich kann dieser Parameter beliebig genannt werden, aber in React ist es üblich, ihn als 
props , und die Eigenschaften, über die wir hier sprechen, werden oft einfach als „Requisiten“ bezeichnet.
Der Parameter 
props ist ein Objekt. Die Eigenschaften dieses Objekts sind die Eigenschaften, die bei der Instanziierung an die Komponente übergeben werden. Das heißt, in unserem 
props es beispielsweise eine Eigenschaft 
props.name die den Namen der Katze enthält, die an die Komponente übergeben wurde, als sie instanziiert wurde. Darüber hinaus verfügt es über die Eigenschaften 
props.imgUrl , 
props.phone , 
props.email . Um dies zu überprüfen, fügen Sie den 
console.log(props) am Anfang der 
ContactCard Funktion hinzu.
 import React from "react" function ContactCard(props) {   console.log(props)   return (       <div className="contact-card">           <img align="center" src="http://placekitten.com/300/200"/>           <h3><font color="#3AC1EF">▍Mr. Whiskerson</font></h3>           <p>Phone: (212) 555-1234</p>           <p>Email: mr.whiskaz@catnap.meow</p>       </div>   ) } export default ContactCard 
Dadurch wird das von der Komponente empfangene 
props zur Konsole gebracht.
Konsolen-RequisitenobjektHier sehen Sie die Ausgabe von vier Objekten aus 
ContactCard.js . Es gibt so viele davon, weil wir vier Instanzen der 
ContactCard Komponente erstellen.
All dies gibt uns die Möglichkeit, im Komponentencode anstelle von fest codierten Werten zu verwenden, was beim Erstellen der Instanz an ihn übergeben wurde, und zwar in Form von 
props .
Was ist, wenn wir versuchen, die Eigenschaft 
props.imgUrl zu verwenden:
 <img align="center" src=props.imgUrl/> 
Auf den ersten Blick mag eine solche Konstruktion funktionieren, aber denken Sie daran, dass wir hier eine Entität aus JavaScript in JSX-Code verwenden müssen. Wir haben darüber gesprochen, wie dies in einer der vorherigen Klassen gemacht wird. In unserem Fall muss die Eigenschaft des Objekts nämlich in geschweiften Klammern stehen:
 <img align="center" src={props.imgUrl}/> 
Wir verarbeiten die anderen von der Komponente zurückgegebenen Elemente auf die gleiche Weise. Danach hat der Code die folgende Form:
 import React from "react" function ContactCard(props) {   return (       <div className="contact-card">           <img align="center" src={props.imgUrl}/>           <h3><font color="#3AC1EF">▍{props.name}</font></h3>           <p>Phone: {props.phone}</p>           <p>Email: {props.email}</p>       </div>   ) } export default ContactCard 
Bitte beachten Sie, dass in den Feldern zur Anzeige der Telefon- und E-Mail-Adresse die Texte 
Phone: und 
Email: mit Leerzeichen gefolgt sind, da diese Texte in allen Komponenten verwendet werden. Wenn Sie sich jetzt die Anwendungsseite ansehen, werden Sie feststellen, dass sie vier verschiedene Karten enthält.
Seite gebildet mit einer universellen KomponenteUnsere Komponente akzeptiert nur vier Eigenschaften. Was ist, wenn eine Komponente beispielsweise 50 Eigenschaften übergeben muss? Möglicherweise ist es unpraktisch, jede dieser Eigenschaften als separate Zeile zu übergeben, wie dies in der 
App Komponente der Fall ist. In solchen Fällen können Sie Eigenschaften auf andere Weise auf Komponenten übertragen. Es besteht darin, dass beim Erstellen einer Instanz einer Komponente keine Liste von Eigenschaften übertragen wird, sondern ein Objekt mit Eigenschaften. So könnte es am Beispiel der ersten Komponente aussehen:
 import React from "react" import ContactCard from "./ContactCard" function App() {   return (       <div className="contacts">           <ContactCard               contact={{                 name: "Mr. Whiskerson",                 imgUrl: "http://placekitten.com/300/200",                 phone: "(212) 555-1234",                 email: "mr.whiskaz@catnap.meow"               }}           />                     <ContactCard               name="Fluffykins"               imgUrl="http://placekitten.com/400/200"               phone="(212) 555-2345"               email="fluff@me.com"           />                     <ContactCard               name="Destroyer"               imgUrl="http://placekitten.com/400/300"               phone="(212) 555-3456"               email="ofworlds@yahoo.com"           />                     <ContactCard               name="Felix"               imgUrl="http://placekitten.com/200/100"               phone="(212) 555-4567"               email="thecat@hotmail.com"           />                 </div>   ) } export default App 
Dies bedeutet nicht, dass dieser Ansatz die Menge an Code, die zur Beschreibung der Komponenteninstanz verwendet wird, erheblich reduziert hat. Tatsache ist, dass die an die Komponente übergebenen Eigenschaften im Code immer noch fest codiert sind, obwohl wir nur eine Komponente an die Komponente übergeben. Die Vorteile dieses Ansatzes sind in Situationen zu spüren, in denen die Daten für die Komponente aus einigen externen Quellen stammen. Zum Beispiel aus einer JSON-Datei.
Während der Änderung des Codes der 
App Komponente, mit der die erste Instanz der 
ContactCard Komponente erstellt wurde, wurde der ordnungsgemäße Betrieb der Anwendung unterbrochen. So wird seine Seite jetzt aussehen.
Fehlfunktion der AnwendungWie kann das behoben werden? Um dies zu verstehen, ist es hilfreich, mit dem 
console.log(props) zu analysieren, was passiert.
Analyse des RequisitenobjektsWie Sie sehen können, unterscheidet sich das 
props der ersten Komponente vom gleichen Objekt der zweiten und nächsten Komponente.
In der 
ContactCard Komponente verwenden wir das 
props unter der Annahme, dass es den 
name , 
imgUrl und andere Eigenschaften hat. Hier erhält die erste Komponente nur eine Eigenschaft - 
contact . Dies führt dazu, dass das 
props nur eine Eigenschaft hat - 
contact , nämlich das Objekt, und der Komponentencode keine Arbeit mit einer solchen Struktur bietet.
Das Konvertieren unserer Komponente in das Modell, nur eine Eigenschaft eines 
contact , das andere Eigenschaften enthält, ist recht einfach. Um beispielsweise auf die Eigenschaft 
name zuzugreifen, reicht es aus, im Komponentencode eine Konstruktion der Form 
props.contact.name zu verwenden. Ähnliche Designs ermöglichen es uns, mit anderen Eigenschaften, die wir benötigen, richtig zu arbeiten.
Lassen Sie uns den Komponentencode recyceln und dabei die Übertragung eines einzelnen Objekt-Objekt- 
contact berücksichtigen, der andere Eigenschaften enthält:
 import React from "react" function ContactCard(props) {   console.log(props)   return (       <div className="contact-card">           <img align="center" src={props.contact.imgUrl}/>           <h3><font color="#3AC1EF">▍{props.contact.name}</font></h3>           <p>Phone: {props.contact.phone}</p>           <p>Email: {props.contact.email}</p>       </div>   ) } export default ContactCard 
Die erste Komponente sollte jetzt normal angezeigt werden, dies wird jedoch in dieser Phase des Projekts nicht angezeigt, da das System uns über viele Fehler informiert, die darauf zurückzuführen sind, dass mehrere in der 
App Komponente erstellte Instanzen der 
ContactCard Komponente die Eigenschaft nicht erhalten. 
contact . Bei der Ausführung des Codes ist diese Eigenschaft 
undefined . Infolgedessen wird versucht, auf eine bestimmte Eigenschaft des 
undefined Werts zu verweisen, was zu einem Fehler führt. Wir werden dies beheben, indem wir den Code der 
App Komponente verarbeiten, die für die Bildung von 
ContactCard Komponenten verantwortlich ist:
 import React from "react" import ContactCard from "./ContactCard" function App() {   return (       <div className="contacts">           <ContactCard               contact={{                 name: "Mr. Whiskerson",                 imgUrl: "http://placekitten.com/300/200",                 phone: "(212) 555-1234",                 email: "mr.whiskaz@catnap.meow"               }}           />                     <ContactCard               contact={{                 name: "Fluffykins",                 imgUrl: "http://placekitten.com/400/200",                 phone: "(212) 555-2345",                 email: "fluff@me.com"               }}           />                     <ContactCard               contact={{                 name: "Destroyer",                 imgUrl: "http://placekitten.com/400/300",                 phone: "(212) 555-3456",                 email: "ofworlds@yahoo.com"               }}           />                     <ContactCard               contact={{                 name: "Felix",                 imgUrl: "http://placekitten.com/200/100",                 phone: "(212) 555-4567",                 email: "thecat@hotmail.com"               }}           />                 </div>   ) } export default App 
Jetzt sieht die Anwendungsseite genauso aus wie zuvor.
Wie üblich wird empfohlen, mit den heute erlernten Konzepten zu experimentieren, um sie besser zu verstehen. Sie können beispielsweise mit dem Code arbeiten, neue Eigenschaften hinzufügen, die an die Komponente übergeben werden, und versuchen, sie in der Komponente zu verwenden.
Zusammenfassung
Heute haben wir das Konzept von Eigenschaften eingeführt, die an React-Komponenten übergeben werden können, um deren Verhalten und Erscheinungsbild zu steuern. Diese Eigenschaften ähneln den Attributen von HTML-Elementen, aber anhand der Eigenschaften in den Komponenten entscheidet der Programmierer unabhängig, welche Bedeutung sie haben und was genau mit ihnen in der Komponente zu tun ist. Das nächste Mal erhalten Sie eine praktische Lektion zum Arbeiten mit Komponenteneigenschaften und zum Styling.
Liebe Leser! Wie haben Sie mit dem Code für das heutige Beispiel experimentiert, um die Eigenschaften von React-Komponenten besser zu verstehen?