Ich habe die folgende Reaktionskomponente:
export default class MyComponent extends React.Component {
onSubmit(e) {
e.preventDefault();
var title = this.title;
console.log(title);
}
render(){
return (
...
<form className="form-horizontal">
...
<input type="text" className="form-control" ref={(c) => this.title = c} name="title" />
...
</form>
...
<button type="button" onClick={this.onSubmit} className="btn">Save</button>
...
);
}
};
Die Konsole gibt mir undefined
- irgendwelche Ideen, was mit diesem Code falsch ist?
javascript
reactjs
JoeTidee
quelle
quelle
this.onSubmit.bind(this);
e.target.value
ohne die Bindung?onSubmit
Methode beim Klicken (dhonClick={this.onSubmit.bind(this)}
) an die Schaltfläche "Senden" (DOM-Element) binden . Und wenn Sie auf den Wert der Titeleingabe in dem Formular zugreifen möchten, das Sie verwenden könnenonSubmit(event) { const title = event.target.elements.title.value; }
.Antworten:
Sie sollten den Konstruktor unter der Klasse MyComponent verwenden, die React.Component erweitert
Dann erhalten Sie das Ergebnis des Titels
quelle
Hier gibt es drei Antworten, abhängig von der Version von React, mit der Sie arbeiten (gezwungen sind) und ob Sie Hooks verwenden möchten.
Das wichtigste zuerst:
Es ist wichtig zu verstehen , wie funktioniert Reaktion, so dass Sie die Dinge richtig tun können (protip: es ist Super läuft wert durch das Tutorial Übung Reagieren Sie auf die Website Reagieren Es ist gut geschrieben, und deckt alle Grundlagen in einer Weise , dass tatsächlich erklärt , wie zu tun ist . Dinge). "Richtig" bedeutet hier, dass Sie eine Anwendungsoberfläche schreiben, die zufällig in einem Browser gerendert wird. Die gesamte Arbeit an der Benutzeroberfläche erfolgt in React, nicht in "Was Sie gewohnt sind, wenn Sie eine Webseite schreiben" (aus diesem Grund sind React-Apps "Apps", keine "Webseiten").
Reaktionsanwendungen werden aus zwei Gründen gerendert:
Wenn Sie React verwenden, generieren Sie ausdrücklich keine HTML-Elemente und verwenden diese dann: Wenn Sie React anweisen, ein zu verwenden
<input>
, erstellen Sie beispielsweise kein HTML-Eingabeelement, und Sie weisen React an, ein React-Eingabeobjekt zu erstellen das passiert zu machen als HTML - Eingabeelement, und deren Ereignisbehandlung schaut, aber nicht kontrolliert wird durch das HTML - Element Eingabeereignisse.Wenn Sie React verwenden, generieren Sie Elemente der Anwendungsbenutzeroberfläche, die dem Benutzer (häufig manipulierbare) Daten präsentieren, wobei die Benutzerinteraktion den Status der Komponente ändert, was dazu führen kann, dass ein Teil Ihrer Anwendungsschnittstelle den neuen Status wiedergibt. In diesem Modell ist der Status immer die letzte Autorität, nicht "welche UI-Bibliothek auch immer zum Rendern verwendet wird", die im Web das DOM des Browsers ist. Das DOM ist in diesem Programmiermodell fast ein nachträglicher Gedanke: Es ist nur das spezielle UI-Framework, das React gerade verwendet.
Im Fall eines Eingabeelements lautet die Logik also:
render
nach der Aktualisierung einen Aufruf aus, jedoch nur, wenn die Statusaktualisierung den Status geändert hat .All dies geschieht in wenigen Millisekunden, wenn nicht sogar weniger. Es sieht also so aus, als hätten Sie das Eingabeelement so eingegeben, wie Sie es von "nur ein Eingabeelement auf einer Seite verwenden" gewohnt sind, aber das ist absolut nicht der Fall passierte.
Nachdem dies gesagt wurde, erfahren Sie, wie Sie Werte von Elementen in React erhalten:
Reagieren Sie 15 und darunter mit ES5
Um die Dinge richtig zu machen, hat Ihre Komponente einen Statuswert, der über ein Eingabefeld angezeigt wird. Wir können ihn aktualisieren, indem das UI-Element Änderungsereignisse an die Komponente zurücksendet:
Also haben wir das verwenden Reagieren tell
updateInputValue
Funktion die Interaktion mit dem Benutzer zu handhaben , verwenden ,setState
um das Status - Update zu planen, und die Tatsache , dassrender
zapftthis.state.inputValue
bedeutet , dass , wenn es rerenders nach dem Zustand zu aktualisieren, wird der Benutzer des Update Text sehen , auf dem, was sie eingegeben hat .Nachtrag basierend auf Kommentaren
Angesichts der Tatsache, dass UI-Eingaben Statuswerte darstellen (überlegen Sie, was passiert, wenn ein Benutzer seine Registerkarte auf halbem Weg schließt und die Registerkarte wiederhergestellt wird. Sollten alle von ihnen eingegebenen Werte wiederhergestellt werden? Wenn ja, ist dies der Status). Das könnte Ihnen das Gefühl geben, dass ein großes Formular zehn oder sogar hundert Eingabeformulare benötigt, aber bei React geht es darum, Ihre Benutzeroberfläche auf wartbare Weise zu modellieren: Sie haben nicht 100 unabhängige Eingabefelder, Sie haben Gruppen verwandter Eingaben, also erfassen Sie jedes gruppieren Sie in einer Komponente und bauen Sie dann Ihr "Master" -Formular als Sammlung von Gruppen auf.
Dies ist auch viel einfacher zu warten als eine riesige Einzelformkomponente. Teilen Sie Gruppen in Komponenten mit Statusverwaltung auf, wobei jede Komponente nur für die Verfolgung einiger Eingabefelder gleichzeitig verantwortlich ist.
Möglicherweise haben Sie auch das Gefühl, dass es "mühsam" ist, den gesamten Code zu schreiben, aber das ist eine falsche Ersparnis: Entwickler, die nicht Sie sind, einschließlich zukünftiger Sie, profitieren tatsächlich stark davon, wenn all diese Eingaben explizit verknüpft werden, weil Dadurch können Codepfade viel einfacher nachverfolgt werden. Sie können jedoch jederzeit optimieren. Sie können beispielsweise einen Statuslinker schreiben
Natürlich gibt es verbesserte Versionen davon. Rufen Sie also https://npmjs.com auf und suchen Sie nach einer Lösung zum Verknüpfen des Reaktionsstatus, die Ihnen am besten gefällt. Bei Open Source geht es hauptsächlich darum, herauszufinden, was andere bereits getan haben, und dies zu verwenden, anstatt alles selbst von Grund auf neu zu schreiben.
Reagiere auf 16 (und 15.5 Übergangs) und 'moderne' JS
Ab React 16 (und Softstart mit 15.5) wird der
createClass
Aufruf nicht mehr unterstützt und die Klassensyntax muss verwendet werden. Dies ändert zwei Dinge: die offensichtliche Klassensyntax, aber auch diethis
Kontextbindung,createClass
die "kostenlos" ausgeführt werden kann. Um sicherzustellen, dass die Dinge weiterhin funktionieren, stellen Sie sicher, dass Sie die Notation "Fettpfeil" verwenden, umthis
anonyme Funktionen inonWhatever
Handlern wie z das verwendenonChange
wir im code hier:Möglicherweise haben Sie auch gesehen, dass Benutzer
bind
in ihrem Konstruktor alle Funktionen zur Ereignisbehandlung wie folgt verwenden:Tu das nicht.
Fast jedes Mal, wenn Sie verwenden
bind
, gilt das sprichwörtliche "Sie machen es falsch". Ihre Klasse definiert bereits den Objektprototyp und damit bereits den Instanzkontext. Nicht darüber legenbind
; Verwenden Sie die normale Ereignisweiterleitung, anstatt alle Ihre Funktionsaufrufe im Konstruktor zu duplizieren, da diese Duplizierung Ihre Fehleroberfläche vergrößert und das Verfolgen von Fehlern erheblich erschwert, da das Problem möglicherweise in Ihrem Konstruktor liegt, anstatt dort, wo Sie Ihren Code aufrufen. Sie müssen auch andere, mit denen Sie arbeiten oder arbeiten möchten, mit Wartungsarbeiten belasten.Ja, ich weiß, dass die Reaktionsdokumente sagen, dass es in Ordnung ist. Es ist nicht, tu es nicht.
Reagieren Sie 16.8 mit Funktionskomponenten mit Haken
Ab Reaktion 16.8 kann der Funktionskomponente (dh buchstäblich nur einer Funktion, die einige
props
als Argument verwendet, so verwendet werden, als ob es sich um eine Instanz einer Komponentenklasse handelt, ohne jemals eine Klasse zu schreiben) auch mithilfe von Hooks der Status zugewiesen werden .Wenn Sie keinen vollständigen Klassencode benötigen und eine einzelne Instanzfunktion ausreicht, können Sie jetzt mithilfe des
useState
Hooks eine einzelne Statusvariable und deren Aktualisierungsfunktion abrufen, die ungefähr genauso funktioniert wie die obigen Beispiele, außer ohne dersetState
Funktionsaufruf:Früher war die inoffizielle Unterscheidung zwischen Klassen und Funktionskomponenten "Funktionskomponenten haben keinen Status", daher können wir uns nicht mehr dahinter verstecken: Der Unterschied zwischen Funktionskomponenten und Klassenkomponenten ist auf mehreren Seiten im Brunnen verteilt -geschriebene Reaktionsdokumentation (keine Abkürzung für eine Liner-Erklärung, die Sie bequem falsch interpretieren können!), die Sie lesen sollten, damit Sie wissen, was Sie tun, und somit wissen können, ob Sie die beste (was auch immer das für Sie bedeutet) Lösung ausgewählt haben, um sich selbst zu programmieren aus einem Problem heraus, das Sie haben.
quelle
Es ist gelungen, den Eingabefeldwert auf folgende Weise abzurufen:
quelle
In Reaktion 16 benutze ich
quelle
Dies gelang mir, indem ich das "this" an die Funktion updateInputValue (evt) mit band
this.updateInputValue = this.updateInputValue.bind (this);
Der Eingabewert = {this.state.inputValue} ... erwies sich jedoch als keine gute Idee.
Hier ist der vollständige Code in babel ES6:
quelle
Ihr Fehler ist darauf zurückzuführen, dass Sie class verwenden. Wenn Sie class verwenden, müssen wir die Funktionen mit This verknüpfen, damit dies gut funktioniert. Trotzdem gibt es viele Tutorials, warum wir "dies" tun sollten und was "dies" in Javascript tun soll.
Wenn Sie Ihren Submit-Button korrigieren, sollte es funktionieren:
und auch wenn Sie den Wert dieser Eingabe in der Konsole anzeigen möchten, sollten Sie var title = this.title.value verwenden;
quelle
quelle
Geben Sie dem
<input>
eine eindeutige IDVerwenden Sie dann die Standard-Web-API, um im DOM darauf zu verweisen
Sie müssen den Reaktionsstatus nicht bei jedem Tastendruck ständig aktualisieren. Holen Sie sich einfach den Wert, wenn es erforderlich ist.
quelle
Sie können einen Eingabewert erhalten, ohne die Funktion 'onChange' hinzuzufügen.
Fügen Sie dem Eingabeelement einfach ein 'ref attr:
Verwenden Sie dann this.refs, um den Eingabewert abzurufen, wenn Sie ihn benötigen.
quelle
Ändern Sie Ihre Referenz in:
ref='title'
und löschen Siename='title'
dann Löschenvar title = this.title
und schreiben Sie:Auch sollten Sie hinzufügen
.bind(this)
zuthis.onSubmit
(Es hat in meinem Fall funktioniert, was ziemlich ähnlich war, aber anstatt
onClick
ich hatteonSubmit={...}
und es wurde in Form gebracht (<form onSubmit={...} ></form>)
)quelle
Wenn Sie eine Klassenkomponente verwenden, sind es nur 3 Schritte. Zuerst müssen Sie den Status für Ihre Eingabe deklarieren, z. B. this.state = {name: ''} . Zweitens müssen Sie eine Funktion zum Festlegen des Status schreiben, wenn er sich im folgenden Beispiel ändert: setName (), und schließlich müssen Sie die Eingabe jsx schreiben, zum Beispiel <input value = {this.name} onChange = {this.setName} />
quelle
quelle
Verwenden unkontrollierter Felder:
quelle