Ich versuche, die Ursache für ein seltsames Verhalten in der Bindung von this
in einer React-Komponente zu finden.Was passiert mit der Bindung von React?
Ich bin es gewohnt, Komponenten zu entwickeln und ihre Methoden im Klassenkörper zu platzieren und sie an die Komponente this
innerhalb der constructor
zu binden. Vor kurzem entschied ich jedoch, dass ich Dinge aufräumen und Bedenken lösen wollte, indem ich einige dieser großen Methoden zu separaten Dateien extrahieren und sie dann in die Komponente importiere.
Zu meiner Bestürzung funktioniert die Bindung this
in diesem Fall nicht so einfach. Noch seltsamer, während die Verwendung einer ES6-Pfeil-Funktion nicht richtig zu binden scheint, funktioniert die Verwendung einer grundlegenden ES5-Funktion gut. Ich versuche, die Ursache für dieses Verhalten, um herauszufinden:
Beispiel 1
import React, { Component } from 'react';
class App extends Component {
constructor(props) {
super(props);
this.changeName = this.changeName.bind(this);
this.state = {
name: 'John'
};
}
changeName() {
this.setState({
...this.state,
name: 'Jane'
});
}
...
Beispiel 2 [wie erwartet funktioniert] [NICHT ARBEITEN - Typeerror: kann Eigenschaft ‚setState‘ undefinierten lesen]
App.js
import React, { Component } from 'react';
import changeName from './change-name';
class App extends Component {
constructor(props) {
super(props);
this.changeName = changeName.bind(this);
this.state = {
name: 'John'
};
}
...
change-name.js
Beispiel [funktioniert wie erwartet - die gleichen App.js
wie in Beispiel 2]
change-name.js
function changeName() {
this.setState({
...this.state,
name: 'Jane'
});
};
module.exports = changeName;
Ahh, ich sehe jetzt. Ich hatte den Eindruck, eine 'const'-Pfeilfunktion sei synonym mit einer ES5-Funktion. Vielen Dank! – aware
Also in der Konstruktorfunktion der React-Komponente warum gibt 'this.changeN = changeName' der importierten Funktion nicht ihr' this'? Angenommen, 'changeName' ist die importierte Funktion (definiert als Pfeilfunktion). – aware
, da die Funktionsinstanz changeName diese explizit aus der Umgebung entnimmt, in der sie deklariert ist. Stellen Sie sich das als normale Funktion vor, aber an das äußere 'This' gebunden:' changeName.bind (this) 'wobei' this' das 'this' der Stelle der Pfeilfunktionsdeklaration ist – smnbbrv