Web-Apps einfach und modular entwickeln
Stoyan Stefanov
Lektorat: Ariane Hesse
Korrektorat: Sibylle Feldmann
Herstellung: Susanne Bröckelmann
Umschlaggestaltung: Michael Oréal, www.oreal.de
Satz: III-satz, www.drei-satz.de
Druck und Bindung: Media-Print Informationstechnologie, mediaprint-druckerei.de
Bibliografische Information der Deutschen Nationalbibliothek
Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.
ISBN
Print:978-3-96009-042-7
PDF:978-3-96010-090-4
ePub:978-3-96010-091-1
mobi:978-3-96010-092-8
Dieses Buch erscheint in Kooperation mit O’Reilly Media, Inc. unter dem Imprint »O’REILLY«. O’REILLY ist ein Markenzeichen und eine eingetragene Marke von O’Reilly Media, Inc. und wird mit Einwilligung des Eigentümers verwendet.
1. Auflage 2017
Copyright © 2017 dpunkt.verlag GmbH
Wieblinger Weg 17
69123 Heidelberg
Authorized German translation of the English edition React: Up & Running, ISBN 9781491931820 © 2016 Stoyan Stefanov. This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same.
Die vorliegende Publikation ist urheberrechtlich geschützt. Alle Rechte vorbehalten. Die Verwendung der Texte und Abbildungen, auch auszugsweise, ist ohne die schriftliche Zustimmung des Verlags urheberrechtswidrig und daher strafbar. Dies gilt insbesondere für die Vervielfältigung, Übersetzung oder die Verwendung in elektronischen Systemen.
Es wird darauf hingewiesen, dass die im Buch verwendeten Soft- und Hardware-Bezeichnungen sowie Markennamen und Produktbezeichnungen der jeweiligen Firmen im Allgemeinen warenzeichen-, marken- oder patentrechtlichem Schutz unterliegen.
Die Informationen in diesem Buch wurden mit größter Sorgfalt erarbeitet. Dennoch können Fehler nicht vollständig ausgeschlossen werden. Verlag, Autoren und Übersetzer übernehmen keine juristische Verantwortung oder irgendeine Haftung für eventuell verbliebene Fehler und deren Folgen.
5 4 3 2 1 0
Für Eva, Zlatina und Nathalie
Vorwort
1Hallo Welt
Einrichten
Hallo React-Welt
Was ist da gerade passiert?
React.DOM.*
Besondere DOM-Attribute
Browsererweiterung React DevTools
Als Nächstes: eigene Komponenten
2Das Leben einer Komponente
Minimalversion
Eigenschaften
propTypes
Standardeigenschaftswerte
Status
Eine zustandsbehaftete Textarea-Komponente
Ein Hinweis zu DOM-Events
Event-Handling in den alten Tagen
Event-Handling in React
Props versus State
Props im initialen Status: ein Anti-Pattern
Von außen auf die Komponente zugreifen
Eigenschaften später ändern
Lifecycle-Methoden
Lifecycle-Beispiel: Alles loggen
Lifecycle-Beispiel: Ein Mixin verwenden
Lifecycle-Beispiel: Der Einsatz einer Kind-Komponente
Performanceverbesserung: Aktualisieren von Komponenten verhindern
PureRenderMixin
3Excel: Eine schicke Tabellen-Komponente
Zuerst die Daten
Schleife über den Tabellenkopf
Die Warnung an der Konsole debuggen
<td>-Inhalte hinzufügen
Wie können Sie die Komponente verbessern?
Sortieren
Wie können Sie die Komponente verbessern?
Sortierhinweise im UI
Daten bearbeiten
Bearbeitbares Feld
Eingabefeld
Sichern
Zusammenfassung und virtuelle DOM-Diffs
Suchen
Status und UI
Inhalte filtern
Wie können Sie die Suche verbessern?
Instant Replay
Wie können Sie die Wiedergabe verbessern?
Eine alternative Implementierung?
Die Tabellendaten herunterladen
4JSX
Hallo JSX
JSX transpilieren
Babel
Clientseite
Die JSX-Transformation
JavaScript in JSX
Whitespace in JSX
Kommentare in JSX
HTML-Entitäten
Anti-XSS
Spread-Attribute
Spread-Attribute vom Eltern-Element
Mehrere Knoten in JSX zurückgeben
Unterschiede zwischen JSX und HTML
Kein class und for
style ist ein Objekt
Schließende Tags
Attribute im camelCase
JSX und Formulare
onChange-Handler
value versus defaultValue
Value in <textarea>
Value in <select>
Die Excel-Komponente in JSX
5Die Umgebung für die Anwendungsentwicklung einrichten
Eine Anwendungsvorlage
Dateien und Ordner
index.html
CSS
JavaScript
JavaScript: modernisiert
Voraussetzungen einrichten
Node.js
Browserify
Babel
React usw
Auf zum Bauen
JavaScript transpilieren
JavaScript verpacken
CSS verpacken
Ergebnisse!
Windows-Version
Während der Entwicklung bauen
Deployment
Nächste Schritte
6Eine Anwendung bauen
Whinepad v.0.0.1
Einrichten
Erster Code
Die Komponenten
Setup
Entdecken
<Button>-Komponente
Button.css
Button.js
Formulare
<Suggest>
<Rating>-Komponente
Eine <FormInput>-»Fabrik«
<Form>
<Actions>
Dialoge
Anwendungskonfiguration
<Excel>: neu und verbessert
<Whinepad>
Alles zusammen
7Lint, Flow, Test, Repeat
package.json
Babel konfigurieren
scripts
ESLint
Einrichtung
Ausführen
Alle Regeln
Flow
Einrichten
Ausführen
Für die Typprüfung registrieren
<Button> korrigieren
app.js
Mehr zur Typprüfung von props und state
Typen exportieren und importieren
Typecasting
Invarianten
Testen
Einrichten
Erster Test
Erster React-Test
Die <Button>-Komponente testen
<Actions> testen
Mehr simulierte Interaktionen
Vollständige Interaktionen testen
Abdeckung
8Flux
Die Idee
Ein anderer Blick auf Whinepad
Der Store
Store-Events
Den Store in <Whinepad> verwenden
Den Store in <Excel> verwenden
Den Store in <Form> verwenden
Die Grenze definieren
Actions
CRUD-Actions
Suchen und sortieren
Die Actions in <Whinepad> einsetzen
Die Actions in <Excel> verwenden
Zusammenfassung
Immutable
Immutable Store Data
Daten ändern in immutablen Strukturen
Index
Ein weiterer wunderschöner, warmer Abend in Kalifornien. Durch die leichte Meeresbrise fühlt man sich rundum wohl. – »Aaaah!« Der Ort: Los Angeles; die Zeit: Zweitausendirgendwas. Ich war gerade dabei, meine kleine neue Web-App namens CSSsprites.com per FTP auf meinen Server zu laden und der Welt zu zeigen. Dabei dachte ich über ein Problem nach, mit dem ich mich die letzten paar Abende herumgeschlagen hatte: Warum zum Henker braucht man 20 % der Arbeit, um die Kernelemente der App zu erstellen, und verbringt dann die restlichen 80 % damit, sich mit der Benutzeroberfläche herumzuschlagen? Wie viel mehr Tools hätte ich schreiben können, wenn ich nicht die ganze Zeit getElementById() verwenden und mir Gedanken um den Status der App machen müsste? (Ist der Anwender mit dem Hochladen fertig? Was, ein Fehler? Ist das Dialogfenster immer noch offen?) Warum ist die UI-Entwicklung so zeitaufwendig? Und was soll das mit den ganzen verschiedenen Browsern? Nach und nach verwandelte sich das »Aaaah!« in ein »Aaargh!«.
Sprung auf die F8-Konferenz von Facebook im März 2015. Das Team, zu dem ich gehöre, wird zwei Web-Apps ankündigen, die komplett neu geschrieben wurden: unser Kommentartool für fremde Seiten und ein Moderationstool, um die Kommentare zu verwalten. Verglichen mit meiner kleinen CSSsprites.com-App, handelt es sich bei den beiden Anwendungen um richtig große Web-Apps mit weitaus mehr Features, mehr Möglichkeiten und einer unglaublich hohen Traffic-Last. Aber die Entwicklung war ein Klacks. Kollegen, die neu zur App-Entwicklung hinzustießen (und die zum Teil noch nicht einmal Erfahrung mit JavaScript und CSS hatten), waren schnell und problemlos dazu in der Lage, hier ein Feature hinzuzufügen oder dort etwas zu verbessern. Wie ein Teammitglied sagte: »Aha, jetzt verstehe ich, wovon hier alle so begeistert sind!«
Was ist dazwischen passiert? React.
React ist eine Bibliothek, mit der UIs gebaut werden können – es hilft Ihnen dabei, das UI ein für alle Mal zu definieren. Wenn sich dann der Status der Anwendung ändert, reagiert das UI auf diese Änderungen, und Sie müssen sich keine Gedanken mehr darüber machen. Denn schließlich haben Sie das UI schon definiert. Definiert? Eher deklariert. Sie verwenden kleine, handhabbare Komponenten, um eine große und mächtige App zu bauen. In Ihren Funktionen brauchen Sie nicht mehr die Hälfte der Codezeilen, um DOM-Knoten aufzustöbern – stattdessen kümmern Sie sich nur um den state der Anwendung (mit einem guten alten JavaScript-Objekt), während der Rest von allein geschieht.
Durch das Erlernen von React haben Sie gleich eine Reihe von Vorteilen – Sie machen sich mit einer Bibliothek vertraut und können diese dann für folgende Bereiche einsetzen:
Sie können native Anwendungen mit nativer Performance und nativen Steuerelementen erstellen (wirklich nativen Steuerelementen – nicht Kopien davon, die nur so aussehen) und dabei die gleichen Konzepte für das Erstellen von Komponenten und UIs einsetzen. Es geht nicht um »write once, run everywhere« (bei dem unsere Branche immer noch strauchelt), sondern um »learn once, use everywhere«.
Lange Rede, kurzer Sinn: Erlernen Sie React, und Sie erhalten 80 % Ihrer Zeit zurück, um sich auf die wirklich wichtigen Dinge zu konzentrieren (wie zum Beispiel den Grund, warum Sie die App schreiben).
Dieses Buch konzentriert sich darauf, React aus Sicht der Webentwicklung zu erlernen. In den ersten drei Kapiteln beginnen Sie mit einer leeren HTML-Datei, die Sie nach und nach mit Leben füllen. So können Sie sich auf das Erlernen von React fokussieren und müssen sich nicht gleich mit der neuen Syntax oder zusätzlichen Tools herumschlagen.
In Kapitel 4 wird JSX vorgestellt, bei dem es sich um eine zusätzliche, optionale Technik handelt, die aber meist zusammen mit React zum Einsatz kommt.
Anschließend geht es darum, was Sie zum Entwickeln einer echten Anwendung brauchen und welche Werkzeuge Ihnen dabei helfen können. So werden zum Beispiel Tools zum Packen von JavaScript-Code vorgestellt (Browserify), für das Unit Testing (Jest), Linting (ESLint), die Typisierung (Flow), das Organisieren des Datenflusses innerhalb der Anwendung (Flux) und für immutable Daten (Immutable.js). Bei all diesen Themen werden die Zusatztools aber immer nur kurz präsentiert, denn der Fokus soll weiterhin auf React liegen. Sie werden sich mit diesen Tools vertraut machen und dann selbst entscheiden können, welche Sie einsetzen wollen.
Viel Glück auf Ihrer Reise – sei sie angenehm und ergiebig!
Die folgenden typografischen Konventionen werden in diesem Buch genutzt:
Kursiv
Für neue Begriffe, URLs, E-Mail-Adressen, Dateinamen und Dateierweiterungen.
Nichtproportionalschrift
Für Programmlistings, aber auch für Codefragmente in Absätzen, wie zum Beispiel Variablen- oder Funktionsnamen, Datenbanken, Datentypen, Umgebungsvariablen, Anweisungen und Schlüsselwörter.
Fette Nichtproportionalschrift
Für Befehle und anderen Text, der genau so vom Benutzer eingegeben werden sollte.
Kursive Nichtproportionalschrift
Für Text, der vom Benutzer durch eigene Werte ersetzt werden sollte.
Dieses Symbol steht für einen Tipp, Vorschlag oder allgemeinen Hinweis. |
|
Dieses Symbol steht für eine allgemeine Anmerkung. |
Zusätzliches Material (Codebeispiele, Übungen usw.) finden Sie (auf Englisch) zum Herunterladen auf https://github.com/stoyan/reactbook.
Dieses Buch ist dazu gedacht, Ihnen bei der Erledigung Ihrer Arbeit zu helfen. Im Allgemeinen dürfen Sie den Code in diesem Buch in Ihren eigenen Programmen oder Dokumentationen verwenden. Solange Sie den Code nicht in großem Umfang reproduzieren, brauchen Sie uns nicht um Erlaubnis zu bitten. Zum Beispiel benötigen Sie nicht unsere Erlaubnis, wenn Sie ein Programm unter Zuhilfenahme einiger Codestücke aus diesem Buch schreiben. Wollen Sie allerdings einen Datenträger mit Beispielen aus O’Reilly-Büchern verkaufen oder vertreiben, müssen Sie eine Genehmigung von uns einholen. Eine Frage mit einem Zitat oder einem Codebeispiel aus dem Buch zu beantworten, erfordert keine Genehmigung. Signifikante Teile des Beispielcodes aus diesem Buch für die eigene Produktdokumentation zu verwerten, ist dagegen genehmigungspflichtig. Wir freuen uns über eine Quellenangabe, verlangen sie aber nicht unbedingt. Zu einer Quellenangabe gehören normalerweise Autor, Titel, Verlagsangabe, Veröffentlichungsjahr und ISBN, hier also: »Stoyan Stefanov, Durchstarten mit React, O’Reilly Verlag 2017, ISBN 978-3-96009-042-7«.
Sollten Sie das Gefühl haben, Ihre Verwendung der Codebeispiele könnte gegen das Fairnessprinzip oder die Genehmigungspflicht verstoßen, nehmen Sie bitte unter kommentar@oreilly.de Kontakt mit uns auf.
Ich möchte mich bei allen bedanken, die die verschiedenen Entwurfszustände dieses Buchs gelesen und Rückmeldung sowie Verbesserungsvorschläge liefert haben: Andreea Manole, Iliyan Peychev, Kostadin Ilov, Mark Duppenthaler, Stephan Alber, Asen Bozhilov.
Vielen Dank an die Leute bei Facebook, die an (oder mit) React arbeiten und meine Fragen unermüdlich beantworten. Mein Dank geht auch an die große React-Community, die tolle Tools, Bibliotheken, Artikel und Einsatzmuster liefert.
Danke ebenfalls an Jordan Walke.
Vielen Dank an alle bei O’Reilly, die dazu beigetragen haben, dass dieses Buch entstehen konnte: Meg Foley, Kim Cofer, Nicole Shelby und viele weitere.
Ein großes Dankeschön geht an Yavor Vatchkov, der das UI für die Beispielanwendung entworfen hat, die in diesem Buch aufgebaut wird (probieren Sie sie unter whinepad.com aus).
Beginnen wir unsere Reise durch die Anwendungsentwicklung mit React. In diesem Kapitel werden Sie erfahren, wie Sie React einrichten, und dafür werden Sie Ihre erste »Hallo Welt«-Anwendung schreiben.
Zunächst brauchen Sie die React-Bibliothek. Zum Glück stellt sich das als ganz einfach heraus.
Rufen Sie http://reactjs.com auf (was auf die offizielle GitHub-Seite https://face-book.github.io/react/ weiterleiten sollte), klicken Sie auf den Download-Button und dann auf Download Starter Kit, um eine ZIP-Datei herunterzuladen. Packen Sie die Datei aus und kopieren Sie das Verzeichnis darin an einen Ort, an dem Sie es wiederfinden können, zum Beispiel:
mkdir ~/reactbook
mv ~/Downloads/react-15.3.1/ ~/reactbook/react
Jetzt sollte Ihr Arbeitsverzeichnis (reactbook) wie in Abbildung 1-1 gezeigt aussehen.
Sie brauchen jetzt zunächst nur die Datei ~/reactbook/react/build/react.js. Über die anderen Dateien werden Sie im weiteren Verlauf mehr erfahren.
Beachten Sie, dass React keine bestimmte Verzeichnisstruktur erwartet – Sie können das Verzeichnis verschieben oder sogar react.js selbst umbenennen, wenn Ihnen das besser passt.
Beginnen wir mit einer einfachen Seite in Ihrem Arbeitsverzeichnis (~/reactbook/01.01.hello.html):
<!DOCTYPE html>
<html>
<head>
<title>Hallo React</title>
<meta charset="utf-8">
</head>
<body>
<div id="app">
<!-- hier wird meine App gerendert -->
</div>
<script src="react/build/react.js"></script>
<script src="react/build/react-dom.js"></script>
<script>
// der Code meiner App
</script>
</body>
</html>
Sie finden den Code dieses Buchs im zugehörigen Repository (https://github.com/stoyan/reactbook/). |
In dieser Datei geschehen eigentlich nur zwei erwähnenswerte Dinge:
Sie können jederzeit normale HTML-Inhalte und auch andere JavaScript-Bibliotheken mit einer React-App kombinieren. Außerdem ist es möglich, mehrere React-Apps auf der gleichen Seite einzusetzen. Sie brauchen nur einen Platz im DOM, auf den Sie React hinweisen und es bitten, dort seine Magie walten zu lassen. |
Lassen Sie uns nun den Code für das »Hallo« hinzufügen. Passen Sie 01.01.hello.html an und ersetzen Sie // der Code meiner App durch:
ReactDOM.render(
React.DOM.h1(null, "Hallo Welt!"),
document.getElementById("app")
);
Laden Sie 01.01.hello.html in Ihren Browser, wird Ihre neue Anwendung ausgeführt (Abbildung 1-2).
Herzlichen Glückwunsch, Sie haben gerade Ihre erste React-Anwendung gebaut!
In Abbildung 1-2 sehen Sie in den Chrome Developer Tools auch den durch Ihre React-App generierten Code, der den Inhalt des Platzhalters <div id="app"> ersetzt.
In dem Code für Ihre erste App gibt es ein paar interessante Stellen.
Schauen Sie sich zuerst den Einsatz des React-Objekts an. Alle für Sie verfügbaren APIs erreichen Sie über dieses Objekt. Die API ist absichtlich minimal gehalten, sodass Sie sich nicht so viele Methodennamen merken müssen.
Es gibt hier auch ein Objekt ReactDOM. Dieses besitzt nur ein paar Methoden, von denen render() die nützlichste ist. Die Methoden dieses Objekts waren zuvor Teil des React-Objekts, sind aber seit Version 0.14 davon getrennt, um zu verdeutlichen, dass das eigentliche Rendern der Anwendung ein eigenständiges Thema ist. Sie können eine React-App erstellen, die in unterschiedlichen Umgebungen gerendert wird – zum Beispiel in HTML (dem Browser-DOM), Canvas oder nativ in Android oder iOS.
Als Nächstes wollen wir auf das Konzept der Komponenten eingehen. Sie bauen Ihr UI mithilfe von Komponenten auf, die Sie nach Wunsch kombinieren. In Ihren Anwendungen werden Sie Ihre eigenen Komponenten erstellen, aber für einen einfachen Start bietet React Wrapper um die HTML-DOM-Elemente an. Diese Wrapper erreichen Sie über das Objekt React.DOM. Im ersten Beispiel wird dabei die h1-Komponente verwendet. Diese entspricht dem HTML-Element <h1>, und Sie nutzen sie über einen Aufruf von React.DOM.h1().
Schließlich gibt es noch den guten alten DOM-Zugriff per document.getElement ById("app"). Damit teilen Sie React mit, wo die Anwendung auf der Seite untergebracht werden sollte – die Brücke zwischen der altbekannten DOM-Bearbeitung und dem gelobten neuen React-Land.
Haben Sie die Brücke vom DOM zu React überquert, brauchen Sie sich über DOM-Zugriffe keine Gedanken mehr zu machen, da sich React um die Umsetzung der Komponenten für die zugrunde liegende Plattform (Browser-DOM, Canvas, native Anwendung) kümmert. Sie müssen sich nicht kümmern, aber Sie können es weiterhin. React bietet »Fluchtwege«, falls Sie aus welchen Gründen auch immer zurück ins DOM-Land wechseln müssen. |
Nachdem Sie jetzt wissen, was jede einzelne Zeile tut, schauen wir uns das große Ganze an. Was ist hier passiert? Sie haben eine React-Komponente in einem DOM-Element Ihrer Wahl gerendert. Sie rendern immer eine Komponente auf oberster Ebene, die wiederum so viele Kind-Komponenten (und Enkel-Komponenten usw.) haben kann, wie Sie brauchen. Tatsächlich besitzt selbst in diesem einfachen Beispiel die h1-Komponente ein Kind – den Text »Hallo Welt!«
Wie Sie jetzt wissen, können Sie eine ganze Reihe von HTML-Elementen über das Objekt React.DOM als React-Komponenten einsetzen (in Abbildung 1-3 sehen Sie, wie Sie eine vollständige Liste über die Konsole Ihres Browsers erhalten). Schauen wir uns diese API genauer an.
Beachten Sie den Unterschied zwischen React.DOM und ReactDOM. Ersteres ist eine Sammlung fertiger HTML-Elemente, Letzteres eine Möglichkeit, die App im Browser zu rendern (denken Sie an React DOM.render()). |
Schauen wir uns die Parameter an, die alle Methoden von React.DOM.* übernehmen. Werfen Sie dazu noch mal einen Blick auf die »Hallo Welt!«-Anwendung:
ReactDOM.render(
React.DOM.h1(null, "Hallo Welt!"),
document.getElementById("app")
);
Beim ersten Parameter von h1() (der in diesem Fall null ist) handelt es sich um ein Objekt, in dem Eigenschaften (stellen Sie sich DOM-Attribute vor) an Ihre Komponente übergeben werden. So ist zum Beispiel Folgendes möglich:
React.DOM.h1(
{
id: "my-heading"
},
"Hallo Welt!"
),
Den von diesem Beispiel generierten HTML-Code sehen Sie in Abbildung 1-4.
Der zweite Parameter (in diesem Beispiel "Hallo Welt!") definiert ein Kind der Komponente, im einfachsten Fall ein Text-Kind (in DOM-Sprache ein Text-Knoten), wie im vorigen Beispiel zu sehen. Aber Sie können so viele verschachtelte Kind-Komponenten nutzen, wie Sie möchten, und diese als zusätzliche Funktionsparameter übergeben, zum Beispiel:
React.DOM.h1(
{id: "my-heading"},
React.DOM.span(null, "Hallo"),
" Welt!"
),
Ein weiteres Beispiel, dieses Mal mit verschachtelten Komponenten (das Ergebnis sehen Sie in Abbildung 1-5):
React.DOM.h1(
{id: "my-heading"},
React.DOM.span(null,
React.DOM.em(null, "Hall"),
"o"
),
" Welt!"
),
Beim Einsatz verschachtelter Komponenten werden Sie sich sehr schnell zwischen vielen Funktionsaufrufen und Klammern wiederfinden, die Sie im Auge behalten müssen. Zur Vereinfachung können Sie die JSX-Syntax verwenden. JSX wird später vorgestellt (siehe Kapitel 4), daher werden wir uns so lange noch mit der reinen JavaScript-Syntax herumschlagen. JSX ist durchaus nicht unumstritten, viele Menschen finden es häufig zuerst abschreckend (»Ihh, XML in meinem JavaScript!«), später dann aber unverzichtbar. Um Ihnen einen kleinen Vorgeschmack darauf zu geben – so sieht der vorige Codeschnipsel in JSX-Syntax aus: |
ReactDOM.render(
<h1 id="my-heading">
<span><em>Hall</em>o</span> Welt!
</h1>,
document.getElementById("app")
);
Es gibt ein paar besondere DOM-Attribute, die Sie beachten sollten: class, for und style.
class und for können Sie nicht verwenden, weil es sich dabei in JavaScript um reservierte Wörter handelt. Stattdessen müssen Sie className und htmlFor einsetzen:
// falsches Beispiel
// dieser Code funktioniert nicht
React.DOM.h1(
{
class: "pretty",
for: "me",
},
"Hallo Welt!"
);
// richtiges Beispiel
// dieser Code funktioniert
React.DOM.h1(
{
className: "pretty",
htmlFor: "me",
},
"Hallo Welt!"
);
Beim style-Attribut können Sie nicht einfach, wie bei normalem HTML, einen String verwenden, Sie müssen ein JavaScript-Objekt einsetzen. Es ist immer eine gute Idee, Strings zu vermeiden, um das Risiko von Cross-Site-Scripting-(XSS-) Angriffen zu verringern, daher ist das hier eine willkommene Änderung.
// falsches Beispiel
// dieser Code funktioniert nicht
React.DOM.h1(
{
style: "background: black; color: white; font-family: Arial",
},
"Hallo Welt!"
);
// richtiges Beispiel
// dieser Code funktioniert
React.DOM.h1(
{
style: {
background: "black",
color: "white",
fontFamily: "Arial",
}
},
"Hallo Welt!"
);
Beachten Sie, dass Sie bei CSS-Attributen die JavaScript-API-Namen verwenden müssen, also zum Beispiel fontFamily statt font-family.
Haben Sie Ihre Browserkonsole geöffnet, während Sie mit den Beispielen in diesem Kapitel spielen, sind Sie eventuell über folgende Nachricht gestolpert: »Download the React DevTools for a better development experience: https://fb.me/react-devtools.« Rufen Sie die URL auf, finden Sie Links zum Installieren einer Browsererweiterung, die beim Debuggen von React-Anwendungen sehr nützlich sein kann (Abbildung 1-6).
Auf den ersten Blick mag diese Erweiterung verwirrend sein, aber wenn Sie sich bis Kapitel 4 vorgearbeitet haben, werden sie Sie ausgesprochen sinnvoll finden.
Sie sind jetzt mit der einfachen »Hallo Welt!«-Anwendung fertig und wissen nun:
Die Möglichkeiten von React können Sie aber nur richtig ausspielen, wenn Sie eigene Komponenten nutzen, um das UI Ihrer App zu bauen (und aktuell zu halten!). Schauen wir uns das im nächsten Kapitel an.