warum brauchen Sie, um zu binden, eine Funktion in einen Konstruktor
Ich habe eine Frage relavent zu diesem code: https://github.com/reactjs/redux/blob/master/examples/async/containers/App.js
speziell:
constructor(props) {
super(props)
this.handleChange = this.handleChange.bind(this)
this.handleRefreshClick = this.handleRefreshClick.bind(this)
}
Ich denke, es ist eine 2-teilige Frage.
- Warum ich brauche, um mit Veränderungen umzugehen, als eine Instanz der Klasse
this.handleChange =
, kann ich nicht einfach mit statischen Funktionen für handleChange und rufen Sie Sie direkt mit in die KlasseonClick={handleRefreshClick}>
? - Ich habe keine Ahnung, was ist denn hier Los:
this.handleRefreshClick.bind(this)
Dank
- Mögliche Duplikate von die Verwendung von JavaScript 'bind' - Methode
- nicht genau, ich habe nicht ganz verstehen, im Kontext einer Klasse, besonders Nummer 2
- Es ändert nicht den Sinn des
bind
. Verwenden Siebind
zu halten den Umfang derthis
. In den Kontext reagieren, diese können Sie aufrufen, Dinge wiethis.setState
etc.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beantwortet in umgekehrter Reihenfolge...
this.handleRefreshClick.bind(something)
gibt eine neue Funktion, in der die Verweise aufthis
beziehen sich aufsomething
. Dies ist eine Möglichkeit zum speichern des aktuellen Wertes desthis
, die sich in dem Bereich während des Aufrufs des Konstruktors, so dass Sie später verwendet werden können, wenn die Funktion aufgerufen wird.Das argument für das hinzufügen der folgenden Zeilen an den Konstruktor so, dass die neuen gebundenen Funktionen werden nur einmal pro Instanz der Klasse. Sie können auch
oder (ES6):
aber jede dieser Methoden erstellen Sie eine neue Funktion jedes mal, wenn die Komponente neu gerendert.
this
.ReactJS
und unter normalen Umständen besteht keine Notwendigkeit zu binden Funktionenthis
(in regelmäßigen JS-Klassen)this
gebunden werden, wenn Sie auf die Eigenschaften zugreifen, auf die Instanz.this.handleClick
durch die Suche durch die Prototyp-Kette im Fall von Klassen Reagieren ? Ich Verstand nicht, den letzten Punkt, Sie erklärt @user1970395, Werden Sie sagen, da der event-handler ist eine Funktion selbstthis
in dieser Funktion beziehen sich auf den event-handlersthis
?this
um eine Funktion, deren Wert hängt von dem Kontext ab, in dem es aufgerufen wird. Reagieren, verwendet die render-Funktion zum erstellen von DOM-Elementen mit event-Handlern. Aus dem Kontext, in dem diese Ereignisse werden behandelt, es gibt keine Kenntnis der Klasse, die diese event-Handler gehören, es sei denn, Sie binden Sie es.Diese 2 Funktionen handleChange und handleRefreshClick weitergegeben werden als Requisiten, um andere Komponenten ,
Sind Sie binden sich an diese, denn wenn die Kind-Komponente wird ein Aufruf dieser Funktionen werden Sie immer ausführen, mit dem APP-Kontext.
Können Sie entfernen diese Funktionen von der Klasse, aber immer noch Sie zu binden, müssen diese da, würden Sie die Aktualisierung werden einige Teile der APP
Der Grund, warum es getan wird, ist das binden der
this
Schlüsselwort für das Objekt. Wie Tom sagte, aufrufen einer Funktion aus einer Klasse, bedeutet nicht, es wird aufgerufen mit dem Kontext des Objekts, das erstellt, die Funktion.Ich denke, dass Sie vielleicht verwirrt, weil in der Reagieren, Beispiele/tutorials, mit Reagieren.createClass() HAT binden
this
automatisch für Sie. So werden Sie sich vielleicht Fragen, warum Reagieren.createClass() funktioniert es, aber nicht mit ES6-Klasse syntax.Dies ist, da Reagieren wollte nicht Durcheinander mit ES6-Spezifikationen (verbindliche
this
auf Funktionen aus seiner Klasse nicht in der ES6-Klasse-Skillung), aber zur gleichen Zeit geben wollte, seinen Nutzern die Bequemlichkeit der ES6-Klasse syntax. Lesen Sie mehr dazu unten.Github issue
Hoffentlich wirft etwas Licht auf, warum das geschieht.
Ich persönlich bind-Funktionen im Konstruktor, so dass Ihre Referenzen nicht ändern, auf jeden re-Rendern.
Dies ist besonders wichtig, wenn Sie auf der Durchreise sind Funktionen zum Lesen, nur Kinder, dass Sie nicht brauchen, um aktualisiert zu werden, wenn Ihre Requisiten nicht ändern. Ich benutze reagieren-addons-rein-Rendern-mixin für, die.
Sonst, auf jeden Elternteils re-Rendern, die Bindung wird passieren, neue Funktions-Referenz wird erstellt und an die Kinder, die denken, die Requisiten haben sich geändert.
Wenn du Blick auf den code werfen, sehen Sie zwei "dies", warum? Scheint seltsam, oder?
Die Sache ist es ist nicht, wie es scheint. Es geht darum, wie es genannt wird.
Sind Sie im Grunde sagen. Hey, wenn jemand Anrufe, die Sie daran erinnern
this
bedeutet, dass diese Klasse. nicht etwas anderes.Wenn jemand ruft die Klasse wie:
x.yourClass()
Sie sagenthis
ist nichtx
aber die Klasse selbst(mit Requisiten und Staaten etc.).