Ich benutze React seit einiger Zeit, und ich habe mich mit dem Konzept vertraut gemacht, dass ich meine Komponentenmethoden manuell an meine Komponenteninstanz binden muss, da React die Entscheidung getroffen hat, "nicht idiomatisch" zu sein:Tun ES2015-Klassen "nicht autobind"?
Deshalb haben wir uns entschieden, diese nicht in die Klasse von React eingebaut zu haben. Sie können Methoden in Ihrem Konstruktor immer noch explizit vorbinden, wenn gewünscht wird.
class Counter extends React.Component { constructor() { super(); this.tick = this.tick.bind(this); } tick() { ... } ... }
- https://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html
Wir können deutlich die Auswirkungen dieses in diesem Beispiel http://jsbin.com/citafaradu/2/edit?js,console,output, aus dieser ähnlichen Frage sehen: How to properly bind current object context in ES6 using babelify
jedoch jemand fragte mich kürzlich, ob es ein Unterschied war zwischen prototypbasierten Klassen und neuen ES2015-Klassen. Intuitiv sollte diese Antwort ein nachdrückliches "Nein!" Sein., da die resultierenden Instanz-Objekte natürlich normale Prototypen haben und sich ... gut verhalten, wie JS-Objekte! Und was wäre die Verwendung von Instanzmethoden, die nicht an die Instanz gebunden sind?
Ich habe versucht, für jede Indikation zu suchen, dass diese „idomatically“ von es6 Klassen wahr wäre, aber alles drehte ich mich von anderen Fragen nach oben waren Devs Reaktion, mit Antworten wie folgt aus:
Klassen Reagieren des ES6 haben keine automatische bindung. Dies wird hier dokumentiert: https://facebook.github.io/react/docs/reusable-components.html#no-autobinding
Der Grund dafür ist, dass ES6 Klassen der Javascript haben kein Autobinding weder [sic]. React versucht, Sachen, die bereits in Javascript sind, nicht neu zu erfinden. ES5 hat keine nette Syntax für Klassen, daher musste React eigene Klassen erfinden. Aber jetzt mit ES6-Klassen können wir einfach Standard Javascript verwenden.
- "cody", https://github.com/facebook/react/issues/4065
Jetzt war ich wirklich verwirrt. War das vielleicht ein Trick der JSX-Transpilation? Wirft man einen Blick auf den Ausgang der Render-Methode des Standes Beispiel:
{
key: "render",
value: function render() {
return React.createElement("div",null,
React.createElement("input", {
type: "text", onChange: this.handleBindedChange
}),
React.createElement("br", null),
React.createElement("input", {
type: "text", onChange: this.handleUnbindedChange
}),
React.createElement("br", null),
React.createElement("p",null,"Result: ",this.state.demo)
);
}
}
Keine Würfel hier entweder - Der babel Ausgang verwendet Object.defineProperty, die mit ihm absolut binden Funktionen hinzugefügt, um das Objekt sie gebunden sind, .
Und so bin ich ratlos. Die meisten der Antworten, die ich dabei gefunden habe, sind älter als die endgültige es2015-Spezifikation - da ich in der Spezifikation selbst nichts darüber finden kann, gab es eine Änderung, die das Vorgehen des React-Teams ungültig gemacht hätte? Ist das ein seltsames Artefakt der Transpiration, das ich irgendwie falsch interpretiert habe? Reagiert man hinter den Kulissen etwas Verrücktes, um das zu verursachen? Wenn ja, warum würden sie wiederholt behaupten, dass dies getan wurde, um dem ES2015-Standard zu entsprechen? Und wenn nicht, was verursacht das Verhalten im ersten Beispiel?
Ich bin nicht sicher, was du meinst. 'Object.defineProperty' wird nicht" autobind ", das Aufrufen einer Funktion wird das' this' basierend darauf, wie die Funktion aufgerufen wird, genauso wie anderswo einstellen. – loganfsmyth
@loganfsmyth, Object.defineProperty ist nicht das, was mich wirklich interessiert, so sehr, warum die Leute überhaupt von "autobinding" sprechen - die Art und Weise, wie es diskutiert wurde, ist vielleicht die Quelle meiner Verwirrung. – MaxPRafferty
Vielleicht möchten Sie sich hier [http://stackoverflow.com/a/31842627/1048572] ansehen – Bergi