2015-12-02 7 views
5

Ich habe dies in meinem JSX:Vermeiden .bind in ES6 (7?) Mit Babel

<Options options={options} onOptionSelect={this.onOptionSelect.bind(this)} /> 

Aber ich schwöre, ich habe einige fanciness gesehen die Notwendigkeit .bind zu negieren, wenn Methoden Rückruf durch die über zu Kind Reagieren Komponenten, habe ich Recht?

+1

Mögliche Duplikate von [kann ich ES6 Fettpfeil in Klassenmethoden verwenden?] (Http://stackoverflow.com/questions/31362292/cani-i-use-es6-fat-arrow-in-class-methods) – Bergi

+0

@Bergi Ist es ein Duplikat? Ich frage nicht, wie kann ich fette Pfeile in Klassenmethoden verwenden, aber was kann ich verwenden, um X zu erreichen. Es stellte sich nur heraus, dicke Pfeile war die Antwort ... – benhowdle89

+0

ja, der Titel der Frage ist nicht genau das gleiche, aber Pfeilfunktionen schienen das zu sein, wonach du gesucht hast. Würdest du denken "[React.js ES6 vermeide es, dies an jede Methode zu binden]" (http://stackoverflow.com/q/32192682/1048572) "ist ein besseres Duplikat? – Bergi

Antwort

5

Sie können eine arrow function Kombination mit Property-Initialisierung verwenden.

class Component extends React.Component { 
    handleClick =() => { 
    console.log(this.props); 
    } 

    render() { 
    return <div onClick={this.handleClick} /> 
    } 
} 

Da die Pfeilfunktion wird im Rahmen des Konstruktor deklariert, und weil Pfeil Funktionen beibehalten this von ihrem erklärt Umfang, alles funktioniert. Der Nachteil ist, dass diese Funktionen nicht auf dem Prototyp funktionieren, sie werden alle mit jeder Komponente neu erstellt. Dies ist jedoch kein großer Nachteil, da bind dasselbe ergibt.

+0

Es wäre besser, wenn Sie setzen es explizit in den Konstruktor, anstatt dieses experimentelle Klasseneigenschaftsding zu verwenden :-) – Bergi

+1

@Bergi Warum ist das besser? Op speziell erwähnt ES7 und Babel, mit denen das funktioniert. – Tyrsius

+0

a) weniger Verwirrung - Sie müssen nicht erwähnen, dass es im Konstruktor-Bereich ist b) alle "ES7" sind derzeit nur Vorschläge und die Babel-Plugins sind experimentell – Bergi

0

Sie können alle Funktionen einer Komponente binden ES2015 Klasse Syntax mit dieser autoBind Helferfunktion:

class Component extends React.Component { 
    constructor(props) { 
    super(props); 
    autoBind(this); 
    } 

    onOptionSelect() { 
    // do stuff 
    } 

    render() { 
    return <Options options={options} onOptionSelect={this.onOptionSelect} />; 
    } 
} 

function autoBind(obj) { 
    getAllMethods(obj.constructor.prototype) 
     .forEach(mtd => { 
      obj[mtd] = obj[mtd].bind(obj); 
     }); 
} 

function getAllMethods(obj) { 
    return Object.getOwnPropertyNames(obj).filter(key => typeof obj[key] == "function"); 
} 

Beachten Sie, dass Component diese Methoden nicht mit Pfeil Funktionen definiert verwenden haben.

+0

Dies negiert nicht die Notwendigkeit für "bind", wie das OP angefordert – Tyrsius

Verwandte Themen