Ich erhalte den folgenden Fehler
Nicht erfasster TypeError: Die Eigenschaft 'setState' von undefined kann nicht gelesen werden
auch nach Bindung von Delta im Konstruktor.
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = {
count : 1
};
this.delta.bind(this);
}
delta() {
this.setState({
count : this.state.count++
});
}
render() {
return (
<div>
<h1>{this.state.count}</h1>
<button onClick={this.delta}>+</button>
</div>
);
}
}
javascript
reactjs
Dangling_pointer
quelle
quelle
Antworten:
Dies liegt daran,
this.delta
nicht gebunden zu seinthis
.So binden Sie set
this.delta = this.delta.bind(this)
im Konstruktor:Derzeit rufen Sie bind auf. Bind gibt jedoch eine gebundene Funktion zurück. Sie müssen die Funktion auf ihren gebundenen Wert setzen.
quelle
this
Bindung haben und dann nicht einmal eine Syntax für die direkte Bindung ihres Kontexts an ihre Definition verfügbar machen?delta
alsdelta = () => { return this.setState({ count: this.state.count++ }); };
Code definiert würden, würde auch funktionieren. Hier erklärt: hackernoon.com/…In ES7 + (ES2016) können Sie die experimentelle Verwendung Funktion bind Syntax Operator
::
zu binden. Es ist ein syntaktischer Zucker und wird das Gleiche tun wie Davin Tryons Antwort.Sie können dann umschreiben
this.delta = this.delta.bind(this);
zuthis.delta = ::this.delta;
Für ES6 + (ES2015) Sie können auch die ES6 verwenden + Pfeil - Funktion (
=>
) verwenden zu könnenthis
.Warum ? Aus dem Mozilla-Dokument:
quelle
Es gibt einen Kontextunterschied zwischen der ES5- und der ES6-Klasse. Es wird also auch einen kleinen Unterschied zwischen den Implementierungen geben.
Hier ist die ES5-Version:
und hier ist die ES6-Version:
Seien Sie vorsichtig, neben dem Syntaxunterschied in der Klassenimplementierung gibt es einen Unterschied in der Bindung des Ereignishandlers.
In der ES5-Version ist es
In der ES6-Version ist es:
quelle
Verwenden Sie bei der Verwendung von ES6-Code in React immer Pfeilfunktionen , da dieser Kontext automatisch damit verbunden wird
Benutze das:
anstatt:
quelle
this.setState({videos});
Sie müssen nichts binden. Verwenden Sie einfach die Pfeilfunktionen wie folgt:
quelle
Sie können auch verwenden:
Oder:
Wenn Sie einige Parameter übergeben ..
quelle
Sie müssen dies an den Konstruktor binden und sich daran erinnern, dass Änderungen am Konstruktor einen Neustart des Servers erfordern. Andernfalls wird derselbe Fehler angezeigt.
quelle
Sie müssen Ihre Methoden mit 'this' (Standardobjekt) binden. Was auch immer Ihre Funktion sein mag, binden Sie sie einfach in den Konstruktor.
quelle
Dieser Fehler kann mit verschiedenen Methoden behoben werden.
Wenn Sie die ES5- Syntax verwenden, müssen Sie gemäß React js Documentation bind verwenden - Methode.
So etwas für das obige Beispiel:
this.delta = this.delta.bind(this)
Wenn Sie mit ES6 Syntax, dann müssen Sie nicht verwenden bind Methode, können Sie es mit so etwas wie dies tun:
delta=()=>{ this.setState({ count : this.state.count++ }); }
quelle
Es gibt zwei Lösungen für dieses Problem:
Die erste Lösung besteht darin, Ihrer Komponente einen Konstruktor hinzuzufügen und Ihre Funktion wie folgt zu binden:
Also mach das:
An Stelle von:
Die zweite Lösung besteht darin, stattdessen eine Pfeilfunktion zu verwenden:
Tatsächlich bindet die Pfeilfunktion NICHT ihre eigene
this
. Pfeilfunktionen lexikalisch bezieht sichbind
ihr Kontext alsothis
tatsächlich auf den Ursprungskontext .Weitere Informationen zur Bindefunktion:
Bindungsfunktion Grundlegendes zur JavaScript-Bindung ()
Weitere Informationen zur Pfeilfunktion:
Javascript ES6 - Pfeilfunktionen und Lexikalisch
this
quelle
Sie müssen ein neues Ereignis mit diesem Schlüsselwort binden, wie ich unten erwähne ...
quelle
Hinzufügen
wird das Problem lösen. Dieser Fehler tritt auf, wenn wir versuchen, die Funktion der ES6-Klasse aufzurufen. Daher müssen wir die Methode binden.
quelle
Die Pfeilfunktion hätte Ihnen das Leben erleichtern können, um das Binden dieses Schlüsselworts zu vermeiden . Wie so:
quelle
Obwohl diese Frage bereits eine Lösung hatte, möchte ich meine nur teilen, damit sie geklärt wird. Ich hoffe, sie könnte helfen:
quelle
quelle
Ändern Sie einfach Ihre bind-Anweisung von dem, was Sie müssen => this.delta = this.delta.bind (this);
quelle
2. Überprüfen Sie (dies), wenn Sie setState in einer Funktion ausführen (z. B. handleChange). Überprüfen Sie, ob die Funktion an diese gebunden ist oder ob die Funktion eine Pfeilfunktion sein soll.
## 3 Möglichkeiten, dies an die folgende Funktion zu binden ##
quelle
Wenn Sie die ES5-Syntax verwenden, müssen Sie sie ordnungsgemäß binden
und wenn Sie ES6 verwenden und oben können Sie Pfeil - Funktion verwenden, dann müssen Sie nicht verwenden müssen bind () es
quelle