2016-07-05 18 views
1

Entschuldigung für den verwirrenden Titel; wenn ich ein onClick-Attribut auf einem meiner Komponenten wie die folgendenWarum muss ich die Funktionen meiner onClick-Attribute in anonyme Funktionen in Reagieren?

<Component onClick={this.doSomething()} /> 

habe ich oft seltsame Fehler, je nachdem, was die doSomething() Funktion tatsächlich anruft. Wenn doSomething() den Status wechselt, erhalte ich alle möglichen Renderfehler. Auf der anderen Seite, wenn ich das tue

Alle Fehler gehen weg und alles funktioniert, wie ich es vorhatte. Was genau mache ich, indem ich mein onClick-Attribut in einer anonymen Funktion verpacke, die das funktioniert? Gibt es eine bessere Art zu tun, was ich versuche zu tun?

+0

Sie können 'onClick = {_this.doSomething}' – Rajesh

+2

@Rajesh nicht immer tun. Es besteht eine gute Chance, dass du 'this.doSomething.bind (this)' auch brauchst. –

+0

@BenFortune Ja, Sie haben Recht. Wir müssen das vielleicht tun. – Rajesh

Antwort

9

Wenn Sie dies tun:

<Component onClick={this.doSomething()} /> 

Dann bist du die Funktion und die Zuweisung der Rückgabewert auf den onClick Attribut aufrufen. Wenn this.doSomething() den Komponentenstatus während eines Rendervorgangs ändert, führt dies zu Problemen.

sollten Sie in der Lage sein zu verwenden:

<Component onClick={this.doSomething} /> 

das heißt die () entfernen, so dass die Funktion mit dem Attribut zugewiesen wird, anstatt das Ergebnis der Ausführung der Funktion.

im Konstruktor Ihrer Komponentenklasse, sollten Sie die folgende Zeile enthalten:

this.doSomething = this.doSomething.bind(this); 

Sie onClick={this.doSomething.bind(this)} verwenden, aber dies bedeutet, dass eine neue Funktion jedes Mal erstellt wird, wird die Komponente neu gerendert.

das Bindungsverhalten von this innerhalb einer Komponentenklasse variiert, je nachdem, wie die Komponente erstellt wird:

  • Verwenden des class Schlüsselwort (ES6), wird this nicht automatisch
  • Mit React.createClass gebunden, this ist gebunden

Mit ES7, haben Sie auch ein paar mehr Optionen:

  • Mit doSomething =() => { //... anstelle des function Stichwort
  • onClick={::this.doSomething} verwenden, eine Kurzform zu binden this

Dank Zequez für ihre nützlichen Kommentar.

+2

Wenn Sie react 'createClass' verwenden, ist es das. Wenn Sie ES6-Klassen verwenden, ist es nicht. Wenn Sie jedoch ES7 verwenden, können Sie eine Klassenmethode als Eigenschaft mit 'classMethod =() => {}' anstelle von 'function classMethod() {}' definieren und sie wird automatisch gebunden, oder Sie können ': : this.doSomething' was eine Kurzschrift von '.bind (this)' ist. – Zequez

+0

Ich wusste nichts über die Doppelpunktsyntax. Vielen Dank! –

+0

Danke @Zequez, ich habe meine Antwort aktualisiert, um die Details aus Ihrem Kommentar hinzuzufügen. –