React Tutorial Teil 24: Lektion für zweite Formen

Heute setzen wir die Diskussion über die Verwendung von Formularen in React fort. Letztes Mal haben wir die Merkmale des Zusammenspiels von Komponenten und Textfeldern untersucht. Hier diskutieren wir die Arbeit mit anderen Formularelementen.

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 42. Arbeiten mit Formularen, Teil 2


Original

In dieser Lektion werden wir über Felder zur Eingabe von mehrzeiligem Text, über Flags, über Optionsfelder (sie werden auch als Optionsfelder bezeichnet) und über Felder mit Listen sprechen. Bisher haben wir nur in Betracht gezogen, mit normalen Texteingabefeldern zu arbeiten.
Hier ist der Code für die App Komponente, mit der wir die heutigen Experimente beginnen werden:

 import React, {Component} from "react" class App extends Component {   constructor() {       super()       this.state = {           firstName: "",           lastName: ""       }       this.handleChange = this.handleChange.bind(this)   }     handleChange(event) {       const {name, value} = event.target       this.setState({           [name]: value       })   }     render() {       return (           <form>               <input                   type="text"                   value={this.state.firstName}                   name="firstName"                   placeholder="First Name"                   onChange={this.handleChange}               />               <br />               <input                   type="text"                   value={this.state.lastName}                   name="lastName"                   placeholder="Last Name"                   onChange={this.handleChange}               />                             {                   /**                    *    :                    *                    * <textarea />                    * <input type="checkbox" />                    * <input type="radio" />                    * <select>  <option>                    */               }                             <h1>{this.state.firstName} {this.state.lastName}</h1>           </form>       )   } } export default App 

So sieht die Anwendungsseite im Browser in dieser Arbeitsphase aus.


Anwendungsseite im Browser

Formulare enthalten normalerweise nicht nur Felder, in die kurze Zeilen eingegeben werden. Wenn Sie Formulare mit anderen Elementen ausstatten, ist die Arbeit mit ihnen in React etwas kompliziert, obwohl dies nichts Besonderes ist.

Im obigen Code gibt es ein auskommentiertes Fragment, das die Elemente auflistet, über die wir sprechen werden. Beginnen wir mit dem Feld für die Eingabe von mehrzeiligem Text - dem textarea . Es ist wahrscheinlich am einfachsten zu verstehen, wie man mit ihm arbeitet. Wenn Sie dieses Element beim Erstellen regulärer HTML-Formulare verwendet haben, wissen Sie, dass dies kein selbstschließendes Tag ist, wie dies beim input der Fall war. Es hat öffnende und schließende Teile.
Fügen Sie dieses Element zum Formular hinzu, indem Sie unmittelbar nach dem Kommentar den folgenden Code einfügen:

 <br /> <textarea></textarea> 

Wenn Sie sich jetzt die Anwendungsseite ansehen, können Sie sehen, wie ein Feld zur Eingabe von mehrzeiligem Text darauf angezeigt wurde.


Feld zur Eingabe von Text auf der Seite

Wie Sie sehen können, ist dieses Feld etwas höher als normale Felder. Der Benutzer kann seine Größe mithilfe der Markierung unten rechts ändern. Dank der rows und cols Sie bei der Beschreibung dieses Elements die Abmessungen angeben. Wenn Sie im normalen HTML-Code nach der Anzeige Text enthalten möchten, geben Sie dazu den gewünschten Text zwischen den öffnenden und schließenden Tags des Elements ein. In React wird die Arbeit mit solchen Elementen so ähnlich wie möglich gemacht, wie die Arbeit mit input , über die wir das letzte Mal gesprochen haben. In React schließt sich das textarea Tag nämlich selbst. Das heißt, der Code zum Anzeigen des Felds auf der Seite kann wie folgt geändert werden:

 <textarea /> 

Sie können das value Attribut in diesem Tag verwenden. Darüber hinaus wird die Arbeit damit genauso ausgeführt wie mit demselben Attribut gewöhnlicher Textfelder. Aufgrund dessen wird eine einheitliche Arbeit mit verschiedenen Elementen erreicht, und außerdem ist es einfacher, den Inhalt der Felder zu aktualisieren, indem die mit solchen Feldern verbundenen Statuseigenschaften aktualisiert werden. Lassen Sie uns den Status des Feldcodes in dieses Formular bringen:

 <textarea value={"Some default value"}/> 

Dadurch wird der angegebene Text im Feld angezeigt, wenn er auf der Seite angezeigt wird.


Der Text, der im Feld angezeigt wird

Wir werden wieder mit dem Feld für die Eingabe von mehrzeiligem Text arbeiten, aber im Moment werden wir über Flags sprechen. Ein Kontrollkästchen ist ein input , dessen Typ das Kontrollkästchen ist. Hier ist seine Beschreibung:

 <input type="checkbox" /> 

So sieht die durch dieses Markup beschriebene Flagge auf der Seite aus.


Kontrollkästchen

Das Hauptmerkmal dieses Steuerelements ist die Tatsache, dass das value Attribut bei der Arbeit damit nicht verwendet wird. Es wird verwendet, um dem Benutzer zwei Optionen zur Auswahl zu stellen, von denen eine dem Kontrollkästchen und die andere dem nicht aktivierten Kontrollkästchen entspricht. Um zu verfolgen, ob das Kontrollkästchen aktiviert oder deaktiviert ist, wird das checked Attribut verwendet, das durch einen logischen Wert beschrieben wird. Infolgedessen entsprechen die Flags normalerweise den im Status gespeicherten logischen Eigenschaften.

Lassen Sie uns den Status der Komponente in dieses Formular bringen:

 this.state = {   firstName: "",   lastName: "",   isFriendly: true } 

Der Flag-Beschreibungscode wird wie folgt geändert:

 <input   type="checkbox"   checked={this.state.isFriendly} /> 

Danach wird das ausgewählte Kontrollkästchen auf der Seite angezeigt.


Aktiviertes Kontrollkästchen

Es stimmt, jetzt wird er nicht auf Klicks auf ihn reagieren. Tatsache ist, dass das Flag an die entsprechende im Status gespeicherte Variable gebunden ist. Wenn wir in unserem Fall versuchen, es zu entfernen, lässt Reagieren, Überprüfen des Status und Feststellen, dass die Eigenschaft isFriendly auf true , dies nicht zu. Gleichzeitig wird in der Konsole eine Warnung angezeigt, die besagt, dass wir keinen Mechanismus zum Ändern des Felds ( onChange Ereignishandler) onChange und dass es schreibgeschützt angezeigt wurde.


Konsolenwarnung

Wir schreiben vielleicht eine spezielle Methode für die Arbeit mit dem Flag, aber der Code unserer Komponente hat bereits die handleChange() -Methode. Jetzt wird es verwendet, um mit Textfeldern zu arbeiten. Wir werden darüber nachdenken, wie wir damit mit der Flagge arbeiten können. onChange Sie dazu zuerst die obige Methode als onChange Ereignishandler onChange Flags zu und weisen Sie dem Flag einen Namen zu, der dem Namen der onChange entspricht, die sich auf das Flag bezieht. Zusätzlich werden wir die Flagge mit dem label Tag signieren:

 <label>    <input       type="checkbox"       name="isFriendly"       checked={this.state.isFriendly}       onChange={this.handleChange}   /> Is friendly? </label> 

In der handleChange() -Methode, deren Code unten gezeigt wird, haben wir bei der Arbeit mit Textfeldern den Namen des Elements ( name ) und seinen Inhalt ( value ) herausgefunden. handleChange() wir den Status aktualisiert, indem wir darauf geschrieben haben, in welchem ​​Feld sich ein bestimmter Name befindet sein Wertattribut:

 handleChange(event) {   const {name, value} = event.target   this.setState({       [name]: value   }) } 

Jetzt müssen wir herausfinden, wie wir mit einem Flag umgehen sollen, das kein value hat. Es hat nur das checked Attribut, das nur true oder false Werte akzeptieren kann. Um mit der Methode handleChange() mit einem Flag arbeiten zu können, müssen wir daher prüfen, ob das Element, für das dieser Handler aufgerufen wird, ein Flag ist. Um diese Prüfung durchzuführen, erinnern wir uns, dass der Typ ( type ) des input , das das Flag darstellt, auf das checkbox . Um diesen Wert zu überprüfen, können Sie auf die type Eigenschaft des Elements event.target . Wir werden diese Eigenschaft aus event.target sowie die checked Eigenschaft mithilfe der folgenden Konstruktion extrahieren:

 const {name, value, type, checked} = event.target 

Jetzt können wir den Wert der Typkonstante überprüfen und herausfinden, ob das Element, für das der Ereignishandler aufgerufen wird, ein Flag ist. Wenn dies der Fall ist, schreiben wir in den Zustand, der sich als in der checked Konstante herausstellte. Vergessen Sie nicht, den Code zu speichern, der für die Arbeit mit Textfeldern verantwortlich ist. Infolgedessen hat der handleChange() Code die folgende Form:

 handleChange(event) {   const {name, value, type, checked} = event.target   type === "checkbox" ? this.setState({ [name]: checked }) : this.setState({ [name]: value }) } 

Überprüfen Sie danach die Funktion des Flags.


Überprüfen der Funktion der Flagge

Wie Sie sehen, kann es jetzt entfernt und installiert werden. Gleichzeitig wird die Arbeit von Textfeldern nicht unterbrochen. Eine Benachrichtigung bezüglich des Kontrollkästchens ist von der Konsole verschwunden, dort wird jedoch eine Benachrichtigung bezüglich des Felds zur Eingabe von mehrzeiligem Text angezeigt. Ändern Sie den Code, der dieses Feld beschreibt, wie folgt:

 <textarea   value={"Some default value"}   onChange={this.handleChange} /> 

Dies führt zum Verschwinden der Benachrichtigung, obwohl wir keine anderen Mechanismen für die Arbeit mit diesem Feld mithilfe der Tools der Komponente implementiert haben (keinen Namen für das Feld angegeben, dem Status keine entsprechende Eigenschaft hinzugefügt). Sie können diese Funktionen selbst implementieren. Lassen Sie uns nun über Schalter sprechen.

Sie können als Kombination von input des text und checkbox werden. Hier ist gemeint, dass die Schalter sowohl ein Wertattribut als auch ein checked Attribut haben. Fügen Sie unserem Formular einige Schalter hinzu und erstellen Sie deren Code basierend auf dem Flag-Beschreibungscode. So sieht es aus:

 <label>   <input       type="radio"       name="gender"       value="male"       checked={this.state.isFriendly}       onChange={this.handleChange}   /> Male </label> <br /> <label>   <input       type="radio"       name="gender"       value="female"       checked={this.state.isFriendly}       onChange={this.handleChange}   /> Female </label> 

Wir haben diesen Code basierend auf dem Flag-Beschreibungscode erstellt und noch nichts bearbeitet. Daher verhalten sich die Schalter seltsam. Insbesondere wenn das Kontrollkästchen deaktiviert ist, befinden sich beide Schalter im Status "Aus". Wenn Sie das Kontrollkästchen aktivieren, wird einer von ihnen als "Ein" eingestuft. Solche Fehler können verhindert werden, indem der Elementcode sorgfältig behandelt wird, wenn er auf der Grundlage des Codes vorhandener Elemente erstellt wird. Jetzt werden wir es beheben.
Bitte beachten Sie, dass diese beiden Elemente denselben Namen haben - gender . Gleichnamige Switches bilden eine Gruppe. Es kann nur ein Schalter ausgewählt werden, der zu einer solchen Gruppe gehört.

Bei der Konfiguration der Switches können Sie nicht einfach angeben, dass der checked Wert beispielsweise auf true gesetzt ist, wenn eine Statuseigenschaft true . Switches müssen synchronisierte Änderungen innerhalb der Gruppe in ihrem eigenen Status unterstützen. Stattdessen wird der checked Wert der Schalter durch die Bedingung festgelegt. In unserem Fall wird diese Bedingung durch Vergleichen der state-Eigenschaft von this.state.gender mit der Zeichenfolge male oder female . Im Switch-Beschreibungscode sieht es so aus:

 <label>   <input       type="radio"       name="gender"       value="male"       checked={this.state.gender === "male"}       onChange={this.handleChange}   /> Male </label> <br /> <label>   <input       type="radio"       name="gender"       value="female"       checked={this.state.gender === "female"}       onChange={this.handleChange}   /> Female </label> 

Fügen Sie nun dem Status eine neue Eigenschaft, gender , hinzu und initialisieren Sie sie mit einer leeren Zeichenfolge:

 this.state = {   firstName: "",   lastName: "",   isFriendly: false,   gender: "" } 

Danach funktionieren die Schalter unabhängig vom Kontrollkästchen. Fügen Sie dem von der Komponente ausgegebenen Code einen Header der zweiten Ebene hinzu, der Informationen darüber anzeigt, welcher Schalter ausgewählt ist:

 <h2><font color="#3AC1EF">You are a {this.state.gender}</font></h2> 

Hier lohnt es sich wahrscheinlich, einen Mechanismus für das bedingte Rendern einzuführen. Auf diese Weise können Sie beim Öffnen der Seite, wenn keines der Optionsfelder ausgewählt ist, sicherstellen, dass der Text, den You are a , nicht darauf angezeigt wird. Wir werden dies jedoch nicht tun, obwohl Sie ihn selbst implementieren können. Schauen wir uns jetzt an, was wir haben.


Schaltet die Anwendungsseite ein

Alles, worüber wir hier gesprochen haben, mag ziemlich kompliziert erscheinen. Dies betrifft insbesondere das Speichern der Merkmale verschiedener Steuerelemente. Um die Arbeit mit Formularen zu vereinfachen, können Sie spezielle Bibliotheken verwenden. Zum Beispiel die formik Bibliothek. Diese Bibliothek vereinfacht das Entwickeln von Formularen in React-Anwendungen erheblich.

Lassen Sie uns nun über Listenfelder sprechen.

In normalem HTML werden die folgenden Konstrukte verwendet, um Kombinationsfelder zu beschreiben:

 <select>   <option></option>   <option></option>   <option></option> <select/> 

React verfolgt einen ähnlichen Ansatz, obwohl wie bei anderen Elementen das value Attribut verwendet wird. Auf diese Weise können Sie leicht herausfinden, welches Listenelement ausgewählt ist, und außerdem können Sie leichter mit dem Status der Komponente arbeiten.

Angenommen, wir möchten ein Kombinationsfeld erstellen, in dem der Benutzer seine Lieblingsfarbe auswählen kann. Dazu können Sie das folgende Konstrukt in das value Attribut des select Elements value={this.state.favColor} : value={this.state.favColor} . Dadurch werden die vom Benutzer ausgewählten Werte abgerufen. favColor nun favColor zum Status hinzu:

 this.state = {   firstName: "",   lastName: "",   isFriendly: false,   gender: "",   favColor: "blue" } 

Als Nächstes statten wir das Kombinationsfeld mit dem onChange Ereignishandler aus und geben ihm einen Namen. Wir weisen den options des Kombinationsfelds auch Werte zu und geben den Text ein, der im Feld angezeigt wird.

So sieht ein select Signaturauswahlelement mit einer Signatur aus:

 <label>Favorite Color:</label> <select   value={this.state.favColor}   onChange={this.handleChange}   name="favColor" >   <option value="blue">Blue</option>   <option value="green">Green</option>   <option value="red">Red</option>   <option value="orange">Orange</option>   <option value="yellow">Yellow</option> </select> 

Fügen Sie nun dem Formular eine weitere Beschriftung hinzu, in der die Lieblingsfarbe des Benutzers angezeigt wird:

 <h2><font color="#3AC1EF">Your favorite color is {this.state.favColor}</font></h2> 

Es ist Zeit, das Kombinationsfeld auszuprobieren.


Kombinationsfeld

Wie Sie sehen können, funktionieren die darauf platzierten Steuerelemente wie erwartet, obwohl unsere Form nicht mit der Raffinesse des Designs glänzt.

Dank der Organisation der React-Steuerelemente in React ist es einfach, denselben Handler für die Verarbeitung ihrer Ereignisse zu verwenden. Dies ist genau das in unserem Fall verwendete Arbeitsschema. Das einzige Merkmal unseres handleChange() ist, dass wir Flag-Ereignisse auf besondere Weise behandeln müssen.

Lassen Sie uns nun über das Senden des Formulars oder das Verarbeiten der darin eingegebenen Werte nach Abschluss des Formulars sprechen. Es gibt zwei Ansätze, um solche Aktionen auszuführen. Wenn Sie eines davon verwenden, sollte das Formular mit einer Schaltfläche ausgestattet sein:

 <button>Submit</button> 

Wenn in HTML5 ein button im Formular gefunden wird, verhält es sich wie ein altes input vom Typ submit . Wenn Sie auf diese Schaltfläche klicken, wird ein Ereignis des onSubmit Formulars selbst ausgelöst. Wenn Sie nach dem Ausfüllen des Formulars etwas tun müssen, können Sie den onClick Ereignishandler zur Schaltfläche hinzufügen. Ich persönlich bevorzuge es jedoch, solche Ereignisse auf Formularebene zu behandeln, indem onSubmit ihm den onSubmit Ereignishandler onSubmit :

 <form onSubmit={this.handleSubmit}> 

Die als Handler für dieses Ereignis verwendete Methode wurde noch nicht geschrieben. Dies ist ein regulärer Ereignishandler, der beispielsweise unter Bezugnahme auf eine bestimmte API Formulardaten an diese übergibt.

Zusammenfassung


In dieser Lektion schließen wir unseren Vortrag über die Arbeit mit Formularen in React ab. Das nächste Mal finden Sie praktische Arbeit zu diesem Thema.

Liebe Leser! Wenn Sie versucht haben, mithilfe der formik-Bibliothek Formulare in React zu erstellen, teilen Sie uns dies bitte mit.

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


All Articles