2015-12-02 20 views
5

mam to w moim JSX:Unikaj .bind w ES6 (7?) Z Babel

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

jednak przysięgam widziałem jakiś fanciness negować potrzebę .bind przechodząc metod wywołania zwrotnego w dół dziecko Reaguj na składniki, czy mam rację?

+1

Możliwy duplikat [czy mogę użyć tłustej strzałki ES6 w metodach klasowych?] (Http://stackoverflow.com/questions/31362292/can-i-use-es6-fat-arrow-in-class-methods) – Bergi

+0

@Bergi Czy to duplikat? Nie pytam, jak używać grubych strzałek w metodach klasowych, ale co mogę użyć, aby osiągnąć X. Okazało się, że grubymi strzałkami była odpowiedź ... – benhowdle89

+0

tak, tytuł pytania nie jest dokładnie taki sam, ale Funkcje strzałki wydawały się być tym, czego szukałeś. Czy uważasz, że "[React.js ES6 unika wiązania" to "do każdej metody] (http://stackoverflow.com/q/32192682/1048572)" jest lepszym duplikatem? – Bergi

Odpowiedz

5

Można użyć arrow function w połączeniu z inicjalizacją właściwości.

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

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

Ponieważ funkcja strzałka jest zadeklarowana w zakresie konstruktora, a ponieważ funkcje strzałek utrzymać this z ich uznającej zakresie, to wszystko działa. Minusem jest to, że nie będą to funkcje na prototypie, wszystkie zostaną odtworzone z każdym komponentem. Nie jest to jednak żadną wadą, ponieważ bind powoduje to samo.

+0

Byłoby lepiej, gdyby jawnie umieszczasz go w konstruktorze, zamiast używać eksperymentalnej własności klasy :-) – Bergi

+1

@Bergi Dlaczego jest lepiej? Op specjalnie wymienił ES7 i Babel, z którymi to działa. – Tyrsius

+0

a) mniej zamieszania - nie trzeba wspominać, że jest w zakresie konstruktora b) wszystkie "ES7" są obecnie tylko propozycjami, a wtyczki babel są eksperymentalne. – Bergi

0

Można powiązać wszystkie funkcje komponentu używając składni klasy ES2015 z tej funkcji autoBind pomocnika:

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"); 
} 

Zauważ, że Component nie trzeba używać metody zdefiniowane funkcje strzałek.

+0

Nie neguje to potrzeby "bind", ponieważ OP zażądał – Tyrsius

Powiązane problemy