Der Autor des Artikels, dessen Übersetzung wir veröffentlichen, ist der Ansicht, dass die meisten vorhandenen React-Leitfäden leider wertvolle praktische Entwicklungstechniken nicht gebührend berücksichtigen. Diese Anleitungen geben der an ihnen beteiligten Person nicht immer ein Verständnis dafür, was der „richtige Ansatz“ für die Arbeit mit React ist.

Dieses Tutorial richtet sich an Anfänger mit HTML-, JavaScript- und CSS-Kenntnissen und behandelt die Grundlagen von React und die häufigsten Fehler, auf die ein Programmierer, der diese Bibliothek verwendet, stoßen kann.
Warum wählen Webentwickler React?
Bevor wir zur Sache kommen, lassen Sie uns ein paar Worte darüber sagen, warum React als die beste Alternative unter den Tools zur Entwicklung von Webschnittstellen angesehen werden kann. Es gibt viele UI-Frameworks. Warum Reagieren wählen? Um diese Frage zu beantworten, vergleichen wir die beiden beliebtesten Tools für die Entwicklung von Schnittstellen - React und Angular. Es sollte beachtet werden, dass das Vue.js-Framework, das immer beliebter wird, in diesen Vergleich einbezogen werden könnte, aber wir werden uns auf React und Angular beschränken.
▍ Deklarativer Ansatz zur Beschreibung von Schnittstellen
Die Reaktionsentwicklung besteht darin, zu beschreiben, was auf der Seite angezeigt werden muss (und nicht darin, Anweisungen für den Browser zu kompilieren, wie dies zu tun ist). Dies bedeutet unter anderem eine signifikante Reduzierung der Menge an Boilerplate-Code.
Angular hingegen verfügt über Befehlszeilentools, die Code für Komponenten-Boilerplates generieren. Scheint dies ein wenig anders zu sein, als Sie es von modernen Schnittstellenentwicklungstools erwarten können? Tatsächlich sprechen wir über die Tatsache, dass Angular so viel Vorlagencode enthält, dass zum Generieren sogar ein spezielles Tool erstellt wurde.
In React beginnen sie mit der Entwicklung und schreiben einfach Code. Es gibt keinen Boilerplate-Komponentencode, der irgendwie generiert werden muss. Natürlich sind vor der Entwicklung einige Vorbereitungen erforderlich, aber wenn es um Komponenten geht, können sie als reine Funktionen bezeichnet werden.
▍ Syntax löschen
Angular Code verwendet Anweisungen wie
ng-model
,
ngIf
und
ngFor
. Dieser Code sieht ziemlich umständlich aus. React verwendet dagegen die JSX-Syntax, die als normales HTML wahrgenommen wird. Um die React-Entwicklung zu starten, müssen Sie also keine grundlegend neuen Dinge lernen. So sieht es aus:
const Greetings = ({ firstName }) => ( <div>Hi, {firstName}</div> );
▍ Lernkurve korrigieren
Die Lernkurve ist ein wichtiger Faktor, der bei der Auswahl eines UI-Frameworks berücksichtigt werden muss. In diesem Zusammenhang sollte beachtet werden, dass es in React weniger Abstraktionen gibt als in Angular. Wenn Sie JavaScript kennen, können Sie wahrscheinlich lernen, wie Sie React-Anwendungen buchstäblich an einem Tag schreiben. Natürlich wird es einige Zeit dauern, um zu lernen, wie man es richtig macht, aber Sie können sehr, sehr schnell zur Arbeit gehen.
Wenn Sie Angular analysieren, müssen Sie eine neue Sprache lernen (Angular verwendet TypeScript) sowie lernen, wie Sie die Angular-Befehlszeilentools verwenden und sich an die Arbeit mit Direktiven gewöhnen.
▍ Merkmale des Datenbindungsmechanismus
Angular verfügt über ein bidirektionales Datenbindungssystem. Dies drückt sich beispielsweise darin aus, dass Änderungen in Form eines Elements zu einer automatischen Aktualisierung des Anwendungsstatus führen. Dies erschwert das Debuggen und ist ein großer Nachteil dieses Frameworks. Wenn bei diesem Ansatz etwas schief geht, kann der Programmierer nicht genau wissen, warum genau die Anwendung den Status geändert hat.
React verwendet dagegen die Einweg-Datenbindung. Dies ist ein großes Plus dieser Bibliothek, da sich darin ausdrückt, dass der Programmierer immer genau weiß, was zu der Änderung des Anwendungsstatus geführt hat. Dieser Ansatz zur Datenbindung vereinfacht das Debuggen von Anwendungen erheblich.
▍Funktionaler Entwicklungsansatz
Ich glaube, dass eine der Stärken von React die Tatsache ist, dass diese Bibliothek den Entwickler nicht zwingt, Klassen zu verwenden. In Angular müssen alle Komponenten als Klassen implementiert werden. Dies führt zu einer übermäßigen Codekomplexität, ohne dass Vorteile entstehen.
In React können alle Komponenten der Benutzeroberfläche als Sätze reiner Funktionen ausgedrückt werden. Die Verwendung reiner Funktionen zur Bildung einer Benutzeroberfläche kann mit einem Hauch sauberer Luft verglichen werden.
Nachdem wir nun die Gründe für die Beliebtheit von React untersucht haben, die Sie möglicherweise bei der Auswahl von Tools für die Entwicklung von Benutzeroberflächen zu dieser bestimmten Bibliothek neigen werden, fahren wir mit dem Üben fort.
Reaktionsentwicklungspraxis reagieren
▍Node.js
Node.js ist eine Serverplattform, die die Ausführung von JavaScript-Code unterstützt, dessen Funktionen für die React-Entwicklung nützlich sind. Wenn Sie diese Plattform noch nicht installiert haben, ist es jetzt an der Zeit,
sie zu
beheben .
▍Vorbereitung des Projekts
Hier verwenden wir das Create-React
create-react-app
Paket von Facebook, um den Kern der React-Anwendung zu erstellen. Dies ist wahrscheinlich der beliebteste Ansatz zum Einrichten einer Arbeitsumgebung, mit der Sie mit der Entwicklung beginnen können. Dank der
create-react-app
Programmierer viele notwendige Tools zur Verfügung, sodass sie nicht mehr selbst ausgewählt werden müssen.
Verwenden Sie diesen Befehl, um
create-react-app
zu installieren:
npm i -g create-react-app
Führen Sie dann zum Erstellen der Anwendungsvorlage den folgenden Befehl aus:
create-react-app react-intro
Diese vorläufige Vorbereitung ist abgeschlossen. Führen Sie die folgenden Befehle aus, um die Anwendung zu starten:
cd react-intro npm start
Hier gehen wir zum Projektordner und starten den Entwicklungsserver, mit dem Sie eine neue React-Anwendung öffnen können, indem Sie zum Browser unter
http: // localhost: 3000 / gehen .
▍ Projektstruktur
Lassen Sie uns herausfinden, wie die React-Anwendung funktioniert. Öffnen Sie dazu das Projekt, das Sie gerade mit Ihrer IDE erstellt haben (ich empfehle
Visual Studio Code ).
Index.html Datei
Öffnen Sie im Projektordner die Datei unter
public/index.html
. Folgendes sehen Sie dabei.
Index.html DateiHier interessiert uns besonders die Zeile
<div id="root">
. Hier befindet sich unsere React-Anwendung. All dieses Element wird durch den Anwendungscode ersetzt, und alles andere bleibt unverändert.
Datei Index.js
Öffnen Sie nun die
src/index.js
. Diese Datei stellt die React-Anwendung bereit. Übrigens wird der Quellcode der Anwendung im Verzeichnis
src
abgelegt.
Datei Index.jsHier ist die Codezeile, die für die Ausgabe einer sogenannten "React-Anwendung" auf der Seite verantwortlich ist:
ReactDOM.render(<App />, document.getElementById('root'));
Diese Zeile teilt React mit, dass wir die
App
Komponente (wir werden sehr bald darüber sprechen) in das
root
div
, das in der gerade untersuchten Datei
index.html
definiert wurde.
Jetzt beschäftigen wir uns mit dem Konstrukt
<App />
. Es ist dem HTML-Code sehr ähnlich, aber es ist ein Beispiel für JSX-Code, eine spezielle JavaScript-Syntax, die von React verwendet wird. Bitte beachten Sie, dass diese Konstruktion mit einem Großbuchstaben
A
beginnt und genau
<App />
und nicht
<app />
. Dies liegt an der in React verwendeten Konvention zur Benennung von Entitäten. Dieser Ansatz ermöglicht es dem System, zwischen regulären HTML-Tags und React-Komponenten zu unterscheiden. Wenn Komponentennamen nicht groß geschrieben werden, kann React sie nicht auf der Seite anzeigen.
Wenn Sie JSX in einer bestimmten
.js
Datei verwenden
.js
, müssen Sie React dort mit dem folgenden Befehl importieren:
import React from 'react';
App.js Datei
Jetzt können wir uns den Code unserer ersten Komponente ansehen. Öffnen Sie dazu die
src/App.js
App.js DateiUm eine React-Komponente zu erstellen, müssen Sie zuerst eine Klasse erstellen, die ein Nachkomme von
React.Component
. Dies ist genau das, was die
class App extends Component
. Alle React-Komponenten müssen eine Implementierung der Rendermethode enthalten, bei der, wie Sie anhand des Namens erraten können, die Komponente gerendert und eine Beschreibung ihrer visuellen Darstellung generiert wird. Diese Methode sollte HTML-Markup für die Ausgabe auf der Seite zurückgeben.
Beachten Sie, dass das Attribut
className
Attribut
class
in HTML entspricht. Es wird verwendet, um Elementen CSS-Klassen zuzuweisen, um sie zu formatieren. Die JavaScript-Schlüsselwortklasse ist reserviert und kann nicht als Attributname verwendet werden.
Wiederholen wir, was wir gerade über die Komponenten herausgefunden haben:
- Ihre Namen beginnen mit einem Großbuchstaben (
A
in der App
). - Sie erweitern die
React.Component
Klasse. - Sie müssen eine
render
implementieren, die Markup zurückgibt.
Lassen Sie uns nun darüber sprechen, was bei der Entwicklung von React-Anwendungen zu vermeiden ist.
▍Empfehlung Nr. 1: Es ist nicht erforderlich, überall Komponentenklassen zu verwenden
Komponenten in React können mit zwei Ansätzen erstellt werden. Die erste besteht darin, Komponentenklassen (Class Component) zu verwenden, die zweite darin, funktionale Komponenten (Functional Component) zu verwenden. Wie Sie vielleicht bemerkt haben, verwendet das obige Beispiel Klassen. Leider schlagen die meisten React-Anfänger-Tutorials vor, sie zu verwenden.
Was ist falsch daran, Komponenten mithilfe des Klassenmechanismus zu beschreiben? Tatsache ist, dass solche Komponenten schwer zu testen sind und dazu neigen, übermäßig zu wachsen. Diese Komponenten unterliegen dem Problem der Aufgabentrennung, der Mischlogik und der visuellen Darstellung von schlechter Qualität (und dies erschwert das Debuggen und Testen von Anwendungen). Im Allgemeinen führt die Verwendung von Komponentenklassen dazu, dass der Programmierer im übertragenen Sinne "sich selbst in den Fuß schießt". Daher würde ich insbesondere Anfängern von Programmierern empfehlen, überhaupt keine Komponentenklassen zu verwenden.
Wir haben also herausgefunden, dass die Verwendung von Klassen zur Beschreibung von Komponenten keine gute Idee ist. Welche Alternativen haben wir? Die Antwort auf diese Frage sind funktionale Komponenten. Wenn die mit der Klasse erstellte Komponente nur die
render
, ist sie ein hervorragender Kandidat für die Verarbeitung zu einer Funktionskomponente. Lassen Sie uns mit dieser Idee überlegen, wie Sie die
App
Komponente verbessern können, die mit dem Tool zum
create-react-app
:
function App() { return ( <div className="App"> ... </div> ); } export default App;
Sehen Sie, was wir hier gemacht haben? Wir haben nämlich die Klasse entfernt und die
render
durch eine Konstruktion der Formularfunktion
function App() {...}
. Wenn wir hier die Syntax der ES6-Pfeilfunktion verwenden, sieht unser Code noch besser aus:
const App = () => ( <div className="App"> ... </div> ); export default App;
Wir haben die Klasse in eine Funktion umgewandelt, die das Markup zurückgibt, das auf der Seite angezeigt werden muss.
Betrachten Sie dies. Eine Funktion, die Markup zurückgibt, hat keinen Boilerplate-Code. Dies ist fast ein reines Markup. Ist das nicht perfekt?
Der Code der Funktionskomponenten ist viel einfacher zu lesen. Wenn Sie mit ihnen arbeiten, müssen Sie sich weniger von Standarddesigns ablenken lassen.
Es sollte hier angemerkt werden, dass, obwohl wir gerade gesagt haben, dass funktionale Komponenten Komponentenklassen vorzuziehen sind, in diesem Artikel hauptsächlich Klassen verwendet werden, da der Code von Komponentenklassen für Anfänger klarer ist, er sich auf weniger Abstraktionen stützt, mit Es ist einfacher, wichtige React-Konzepte zu demonstrieren. Wenn Sie jedoch mit der Entwicklung von React-Anwendungen hinreichend vertraut sind, wird dringend empfohlen, bei der Entwicklung realer Projekte die oben genannten Punkte zu berücksichtigen. Um die Funktionskomponenten besser zu verstehen, schauen Sie sich
dieses Material an .
▍ Bekanntschaft mit Eigenschaften
Eigenschaften (Requisiten) ist eines der zentralen Konzepte von React. Was sind "Eigenschaften"? Um dies zu verstehen, merken Sie sich die Parameter, die an die Funktionen übergeben werden. Im Wesentlichen sind Eigenschaften die Parameter, die an die Komponenten übergeben werden. Betrachten Sie den folgenden Code:
const Greetings = (props) => <div>Hey you! {props.firstName} {props.lastName}!</div>; const App = () => ( <div> <Greetings firstName="John" lastName="Smith" /> </div> );
Hier haben wir die
Greetings
Komponente erstellt und damit einen Mann namens
John Smith
aus der
App
Komponente
App
. All dieser Code führt zu folgendem HTML-Markup:
<div> <div>Hey you! John Smith!</div> </div>
Geschweifte Klammern in Ausdrücken wie
{props.name}
werden verwendet, um JavaScript-Code hervorzuheben. Die
Greetings
Komponente wird in Form von Parametern an die Eigenschaften
firstName
und
lastName
. Wir arbeiten mit ihnen und beziehen uns auf die Eigenschaften des
props
.
Beachten Sie, dass ein einzelnes
props
und nicht zwei Werte, die die Eigenschaften
firstName
und
lastName
.
Der Code kann vereinfacht werden, indem die Fähigkeit von ES6 zur Umstrukturierung von Objekten genutzt wird:
const Greetings = ({ firstName, lastName }) => <div>Hey you! {firstName} {lastName}!</div>;
Wie Sie sehen können, wurde hier die Konstruktion
(props)
durch
({ firstName, lastName })
. Mit diesem Ersatz teilen wir dem System mit, dass wir nur an zwei Eigenschaften des
props
interessiert sind. Dies ermöglicht uns wiederum den direkten Zugriff auf die Werte von
firstName
und
lastName
ohne Objekteigenschaften wie
props.firstName
explizit anzugeben.
Was wäre, wenn wir zur Lösung des gleichen Problems anstelle von Funktionskomponenten klassenbasierte Komponenten verwenden würden? In diesem Fall würde der Code der
Greetings
Komponente folgendermaßen aussehen:
class Greetings extends React.Component { render() { return ( <div>Hey you! {this.props.firstName} {this.props.lastName}!</div> ); } }
Ich weiß nicht, welche Empfindungen dieser Code bei Ihnen hervorruft, aber er scheint mir mit Hilfsmechanismen überladen zu sein. Insbesondere hier müssen Sie für den Zugriff auf Eigenschaften Konstruktionen der Form
this.props
.
▍ Prinzip der alleinigen Verantwortung
Das Single Responsibility Principle (SRP) ist eines der wichtigsten Programmierprinzipien. Er sagt uns, dass das Modul nur ein Problem lösen und es auf qualitativ hochwertige Weise tun sollte. Wenn Sie ein Projekt entwickeln, ohne nur diesem Prinzip zu folgen, kann der Code für ein solches Projekt zu einem Albtraumdesign werden, das nicht unterstützt werden kann.
Wie kann der Grundsatz der alleinigen Verantwortung verletzt werden? Meistens geschieht dies, wenn Mechanismen, die nicht miteinander zusammenhängen, in denselben Dateien abgelegt werden. In diesem Material werden wir oft auf dieses Prinzip verweisen.
Anfänger platzieren normalerweise viele Komponenten in einer Datei. Zum Beispiel haben wir den Code für die
Greetings
und
App
Komponenten in derselben Datei. In der Praxis sollte dies nicht erfolgen, da dies gegen die SRP verstößt.
Selbst sehr kleine Komponenten (wie unsere
Greetings
Komponente) müssen in separaten Dateien abgelegt werden.
Platzieren Sie den Code der
Greetings
Komponente in einer separaten Datei:
import React from "react"; const Greetings = ({ firstName, lastName }) => ( <div> Hey you! {firstName} {lastName}! </div> ); export default Greetings;
Verwenden Sie dann diese Komponente in der
App
Komponente:
import Greetings from "./Greetings"; const App = () => ( ... );
Beachten Sie, dass der Dateiname mit dem Namen der Komponente übereinstimmen muss. Das heißt, der Code der
App
Komponente sollte in der Datei
App.js
, der Code der
Greetings
Komponente in der Datei
Greetings
usw. platziert werden.
▍ Vertrautheit mit dem Status der Anwendung
Staat ist ein weiteres zentrales Konzept in React. Hier werden Anwendungsdaten gespeichert - das kann sich ändern. Müssen Sie etwas speichern, das in das Formularfeld eingegeben wurde? Verwenden Sie state. Müssen Sie Punkte speichern, die ein Spieler in einem Browsergame erzielt hat? Dazu müssen Sie den Status der Anwendung verwenden.
Erstellen wir ein einfaches Formular, mit dem der Benutzer seinen Namen eingeben kann. Bitte beachten Sie, dass ich hier absichtlich eine Klasse zur Beschreibung der Komponente verwende, da dies die Demonstration des betreffenden Konzepts erleichtert. Hier erfahren Sie, wie Sie eine mit einer Klasse erstellte Komponente in eine Funktionskomponente konvertieren.
import React from "react"; class SimpleForm extends React.Component { render() { return ( <div> <input type="text" name="firstName" /> <Greetings firstName="John" /> </div> ); } } const App = () => ( <div> <SimpleForm /> </div> );
Der Benutzer kann etwas in das Formularfeld eingeben, und das ist gut so. Wenn Sie diesen Code jedoch sorgfältig lesen, werden Sie möglicherweise feststellen, dass
John
in der Ausgabe auf der Begrüßungsseite immer als Benutzername verwendet wird. Was ist, wenn nicht alle unsere Benutzer so genannt werden? Wenn ja, dann bringen wir uns in eine nicht sehr bequeme Position.
Wie verwende ich den in das Feld eingegebenen Wert? React basiert nicht direkt auf DOM-Elementen. Event-Handler und der Anwendungsstatus helfen uns, dieses Problem zu lösen.
class SimpleForm extends React.Component { state = { firstName: "", }; onFirstNameChange = event => this.setState({ firstName: event.target.value }); render() { return ( <div> <input type="text" name="firstName" onChange={this.onFirstNameChange} /> <Greetings firstName={this.state.firstName} /> </div> ); } }
Sie können sich einen Status als einfaches JavaScript-Objekt vorstellen, das in Form einer Eigenschaft in der Klasse der
SimpleForm
Komponente gespeichert ist. In diesem Objekt fügen wir die Eigenschaft
firstName
.
Hier haben wir das Feld
firstName
mit einem Event-Handler ausgestattet. Es beginnt jedes Mal, wenn ein Benutzer mindestens ein Zeichen in ein Feld eingibt. In der Klasse ist die Eigenschaft
onChange
für die Verarbeitung des
onFirstNameChange
onChange
, in dem der folgende Befehl ausgeführt wird:
this.setState(...)
Hier wird der Status der Komponente aktualisiert. Der Komponentenstatus wird nicht direkt aktualisiert. Dies erfolgt nur mit der
setState
Methode. Um einen neuen Wert in die Eigenschaft
firstName
zu schreiben, übergeben wir an diese Methode einfach ein Objekt, das enthält, was in den Status geschrieben werden muss:
{ firstName: event.target.value }
In diesem Fall ist
event.target.value
das, was der Benutzer in das Formularfeld eingegeben hat, nämlich sein Name.
Beachten Sie, dass wir
onFirstNameChange
als Methode deklariert
onFirstNameChange
. Es ist sehr wichtig, dass solche Dinge in Form von Klasseneigenschaften deklariert werden, die Pfeilfunktionen enthalten, und nicht in Form von Methoden. Wenn Sie eine ähnliche Funktion als Methode deklarieren, wird diese an das Formularelement gebunden, das diese Methode aufruft, und nicht wie erwartet an die Klasse. Dieses kleine Ding ist für Anfänger oft verwirrend. Dies ist einer der Gründe, die Verwendung von Funktionskomponenten anstelle von Komponentenklassen zu empfehlen.
▍Überprüfen Sie die im Formular eingegebenen Daten
Wir implementieren ein einfaches System zur Überprüfung der in das Formular eingegebenen Daten mit regulären Ausdrücken. Lassen Sie uns entscheiden, dass ein Name aus mindestens drei Zeichen bestehen muss und nur Buchstaben enthalten darf.
Fügen
onBlur
der Komponente den
onBlur
Ereignishandler hinzu, der aufgerufen wird, wenn der Benutzer das Eingabefeld verlässt. Fügen Sie dem Anwendungsstatus eine weitere Eigenschaft hinzu -
firstNameError
. Wenn bei der Eingabe des Namens ein Fehler aufgetreten ist, wird unter dem Feld eine entsprechende Meldung angezeigt.
Lassen Sie uns diesen Code analysieren.
class SimpleForm extends React.Component { state = { firstName: "", firstNameError: "", }; validateName = name => { const regex = /[A-Za-z]{3,}/; return !regex.test(name) ? "The name must contain at least three letters. Numbers and special characters are not allowed." : ""; }; onFirstNameBlur = () => { const { firstName } = this.state; const firstNameError = this.validateName( firstName ); return this.setState({ firstNameError }); }; onFirstNameChange = event => this.setState({ firstName: event.target.value }); render() { const { firstNameError, firstName } = this.state; return ( <div> <div> <label> First name: <input type="text" name="firstName" onChange={this.onFirstNameChange} onBlur={this.onFirstNameBlur} /> {firstNameError && <div>{firstNameError}</div>} </label> </div> <Greetings firstName={firstName} /> </div> ); } }
Bewerbungsstatus
Bei der Entwicklung eines Eingabeverifizierungssystems haben wir dem Status zunächst eine neue Eigenschaft hinzugefügt:
firstNameError
:
state = { ... firstNameError: "", };
Datenvalidierungsfunktion
Die Datenüberprüfung wird in der
validateName
. Der eingegebene Name wird mit einem regulären Ausdruck überprüft:
validateName = name => { const regex = /[A-Za-z]{3,}/; return !regex.test(name) ? "The name must contain at least three letters..." : ""; }
Wenn die Prüfung fehlschlägt, geben wir eine Fehlermeldung von der Funktion zurück. Wenn der Name den Test bestanden hat, geben wir eine leere Zeichenfolge zurück, die angibt, dass bei der Namensprüfung keine Fehler gefunden wurden. Hier verwenden wir der Kürze halber den ternären Operator JavaScript.
OnBlur-Ereignishandler
Schauen
onBlur
sich den
onBlur
Ereignishandler an, der aufgerufen wird, wenn der Benutzer das Eingabefeld verlässt:
onFirstNameBlur = () => { const { firstName } = this.state; const firstNameError = this.validateName( firstName ); return this.setState({ firstNameError }); };
Hier extrahieren wir die Eigenschaft
firstName
aus dem Status und nutzen dabei die Fähigkeit von ES6, Objekte zu zerstören. Die erste Zeile dieses Codes entspricht:
const firstName = this.state.firstName;
Dann rufen wir die oben beschriebene Datenüberprüfungsfunktion auf, übergeben sie
firstName
und schreiben in die
firstNameError
was diese Funktion zurückgibt. Wenn die Prüfung fehlschlägt, wird eine Fehlermeldung an diese Eigenschaft gesendet. Bei Erfolg wird dort eine leere Zeile geschrieben.
Rendermethode
Betrachten Sie die Komponente
render()
-Methode:
render() { const { firstNameError, firstName} = this.state; ... }
Hier verwenden wir wieder die destruktive Zuweisung, um Daten aus dem Zustand abzurufen. <input ... onBlur={this.onFirstNameBlur} />
Diese Zeile weist die Funktion dem onFirstNameBlur
Ereignishandler zu onBlur
. {firstNameError && <div>{firstNameError}</div>}
Hier nutzen wir die Funktionen zur Berechnung logischer Ausdrücke in JavaScript. Das Element div
mit der Fehlermeldung wird nur angezeigt, wenn der Wert in umgewandelt werden firstNameError
kann true
.▍ Stilisierung
Wenn Sie selbst reproduziert haben, worüber wir hier gesprochen haben, werden Sie möglicherweise feststellen, dass unsere Form nicht allzu hübsch aussieht. Lassen Sie uns dies mithilfe der integrierten Stile beheben: render() { const { firstNameError, firstName } = this.state; return ( <div style={{ margin: 50, padding: 10, width: 300, border: "1px solid black", backgroundColor: "black", color: "white" }} > <div style={{marginBottom: 10}}> <label> First name: <input style={{backgroundColor: '#EFEFFF', marginLeft: 10}} type="text" name="firstName" onChange={this.onFirstNameChange} onBlur={this.onFirstNameBlur} /> {firstNameError && <div style={{color: 'red', margin: 5}}>{firstNameError}</div>} </label> </div> <Greetings firstName={firstName} /> </div> ); }
React
style
.
, , , , , . , .
▍ №2:
, , React-. , , —
render
, , . ? , . , , .
? , .
style
, . . ,
style.js
:
// style.js: const style = { form: { margin: 50, padding: 10, width: 300, border: "1px solid black", backgroundColor: "black", color: "white" }, inputGroup: { marginBottom: 10 }, input: { backgroundColor: "#EFEFFF", marginLeft: 10 }, error: { color: "red", margin: 5 } }; export default style;
, ,
SimpleComponent
:
import style from './style'; class SimpleForm extends React.Component { ... render() { const { firstNameError, firstName } = this.state; return ( <div style={style.form}> <div style={style.inputGroup}> <label> First name: <input style={style.input} type="text" name="firstName" onChange={this.onFirstNameChange} onBlur={this.onFirstNameBlur} /> {firstNameError && ( <div style={style.error}>{firstNameError}</div> )} </label> </div> <Greetings firstName={firstName} /> </div> ); } } export default SimpleForm;
, . .
▍
, :
class SimpleForm extends React.Component { state = { ... lastName: "", lastNameError: "" }; validateName = ...; onFirstNameBlur = ...; onFirstNameChange = ...; onLastNameBlur = () => { const { lastName } = this.state; const lastNameError = this.validateName(lastName); return this.setState({ lastNameError }); }; onLastNameChange = event => this.setState({ lastName: event.target.value }); render() { const { firstNameError, firstName, lastName, lastNameError } = this.state; return ( <div style={style.form}> <div style={style.inputGroup}> <label> First name: <input style={style.input} type="text" name="firstName" onChange={this.onFirstNameChange} onBlur={this.onFirstNameBlur} /> {firstNameError && <div style={style.error}>{firstNameError}</div>} </label> </div> <div style={style.inputGroup}> <label> Last name: <input style={style.input} type="text" name="lastName" onChange={this.onLastNameChange} onBlur={this.onLastNameBlur} /> {lastNameError && <div style={style.error}>{lastNameError}</div>} </label> </div> <Greetings firstName={firstName} lastName={lastName} /> </div> ); } } export default SimpleForm;
— ,
firstName
.
«»? — , .
▍ №3:
, , , , , . , ,
render
. .
, , , .
TextField
, .
import React from 'react' import style from "./style"; const TextField = ({name, onChange, onBlur, error, label}) => ( <div style={style.inputGroup}> <label> {label} <input style={style.input} type="text" name={name} onChange={onChange} onBlur={onBlur} /> {error && <div style={style.error}>{error}</div>} </label> </div> ); export default TextField;
, ,
render
. , , .
SimpleForm
:
... import TextField from './TextField'; class SimpleForm extends React.Component { ... render() { const { firstNameError, firstName, lastName, lastNameError } = this.state; return ( <div style={style.form}> <TextField name="firstName" label="First name:" onChange={this.onFirstNameChange} onBlur={this.onFirstNameBlur} error={firstNameError} /> <TextField name="lastName" label="Last name:" onChange={this.onLastNameChange} onBlur={this.onLastNameBlur} error={lastNameError} /> <Greetings firstName={firstName} lastName={lastName} /> </div> ); } }
, . ,
TextField
.
FirstNameField
:
import React from 'react'; import TextField from './TextField'; const FirstNameField = ({...rest}) => ( <TextField name="firstName" label="First name:" {...rest} /> ); export default FirstNameField;
, .
({...rest})
( rest, ). , , ,
rest
. , ,
TextField
, « », spread (,
{...rest}
, ).
rest
, ,
TextField
.
, : ,
FirstNameField
TextField
.
LastNameField
:
:
... import FirstNameField from './FirstNameField'; import LastNameField from './LastNameField'; class SimpleForm extends React.Component { ... render() { const { firstNameError, firstName, lastName, lastNameError } = this.state; return ( <div style={style.form}> <FirstNameField onChange={this.onFirstNameChange} onBlur={this.onFirstNameBlur} error={firstNameError} /> <LastNameField onChange={this.onLastNameChange} onBlur={this.onLastNameBlur} error={lastNameError} /> <Greetings firstName={firstName} lastName={lastName} /> </div> ); } }
.
▍
, , , :
- , , , .
- . , , , , 1000 ( ).
- , . , , .
- , , , . . , , . , , , .
- , , , , .
this
, .
Zusammenfassung
, React- . , , , , . , , , React, , , , UI-.
→ , ,
Liebe Leser! , , React-, .
