2017-07-11 1 views
4

Ist es in Ordnung, Verschlüsse für Event-Handler zu verwenden? Zum Beispiel habe ich eine Funktion und eine Menge Menü in der Navigation und in Navigationskomponente verwende ich so etwas wie diese:Verschlüsse in React

handleMenuClick(path) { 
    return() => router.goTo(path) 
} 
... 
<MenuItem 
    handleTouchTap={this.handleMenuClick('/home')} 
> 

oder soll ich gerade Funktion Pfeil bevorzugen?

<MenuItem 
    handleTouchTap={() => router.goTo('/home')} 
> 

erste Variante wirklich Code sauberer machen, aber ich mache mir Sorgen um die Leistung mit einer großen Anzahl solcher Elemente

+0

Ich bin nicht damit einverstanden, dass die erste sauberer ist, und beide Versionen werden ähnliche Leistung haben. Es wird Dir gut gehen. Keep coding and carry weiter – azium

Antwort

7

Beide sollen vermieden werden.

Während beide funktionieren, haben beide die gleiche Schwäche, dass sie unnötige Rendern verursachen, da die Funktion dynamisch erstellt wird und daher als ein anderes Objekt angezeigt wird.

Anstelle von beiden, möchten Sie Ihre Funktionen auf eine statische Weise erstellen und dann übergeben. Für etwas wie Ihre MenuItem, es sollte nur die Zeichenfolge für den Pfad und dann den Code, um das Routing zu tun Innerhalb. Wenn der Router benötigt wird, sollten Sie ihn stattdessen weitergeben.

sollte die Funktion dann (im Konstruktor in der Regel) eine prä- bind -ed Funktion sein und nur in geben.

export class MenuItem extends React.Component { 
    constructor() { 
     this.handleClick =() => this.props.router.go(this.props.path); 
    } 

    render() { 
     return (
     <Button onClick={ this.handleClick }>Go to link</Button> 
    ); 
    } 
} 

Sie einen Pfeil Funktion im Konstruktor verwenden können. Auf diese Weise wird nicht jede Renderfunktion neu erstellt und Sie vermeiden unnötige Renderings. Dieses Muster funktioniert gut für einfache einfache Funktionen. Für komplexere Funktionen können Sie sie auch als separate Funktion erstellen, dann bind im Konstruktor.

export class MenuItem extends React.Component { 
    handleClick() { 
    this.props.router.go(this.props.path); 
    } 

    constructor() { 
    this.handleClick = this.handleClick.bind(this); 
    } 

    render() { /* same as above */ } 
} 

Der Punkt ist, dass der Handler jedes Mal die gleiche Funktion ist. Wenn es anders wäre (was beide oben beschriebenen Methoden wären), würde React unnötige Neu-Renderings des Objekts durchführen, weil es jedes Mal eine andere Funktion wäre.

Hier sind zwei Artikel, die in mehr Details gehen:

+0

hm, aber Autor des folgenden Artikels geben uns empfehlen, closueres zu verwenden, wo es gebraucht wird?Ich weiß, wir schaffen hier ein neues Objekt, wenn wir den Verschluss benutzen, aber das gibt uns so viel Platz zum benutzen. Ich bin sehr vereinfacht mein Beispiel, in dieser Funktion kann ich verwenden was auch immer wollen - manipulieren aktuellen Menü-Status mit Pfad, etc. – vanless

+1

Lesen Sie weiter den Artikel. Sie gehen ein paar Dinge durch, aber sie erwähnen, dass Pfeilfunktionen nicht perfekt sind. Der Hauptpunkt ist, dass Ihre Handler nicht in der Renderfunktion erstellt werden sollten. Sie sollten im Konstruktor erstellt werden. Sie könnten mehrere Handler im Konstruktor von ''s Eltern erstellen, wie 'this.handleClickHome =() => this.props.router.go ('/home ')', aber Sie wollen es nicht erstellen in der Renderfunktion. – samanime

+0

aber ... in der endgültigen Code in diesem Artikel Autor {this.handleKeyPress (item)} in renderItem() -Methode verwenden, so dass für jedes Element in render() -Funktion erstellt eigene Handler-Funktion, mit Schließung) Aber ich habe Ihre Meinung , danke – vanless

0

, wenn Sie definieren eine neue Methode in einer Komponente (Object) reagieren, wie wir wissen, Funktionen Objekt sind in Javascript.

let reactComponent={ 
addition: function(){ //some task ...}, 
render: function(){}, 
componentWillMount : function(){}, 
} 

so sollte jede neue Methode mit bind im Objekt binden verwenden, aber render() bereits definiert ist, so dass wir nicht tun

this.render = this.render.bind(this) 

für jede neue Funktion, mit der Ausnahme reagieren Lifecycle Methoden müssen hinzugefügt werden, und daher rufen wir die Objekt (Konstruktorfunktion) -Methoden mit this.method() auf.

+0

Wenn wir es6 mit der 'class'-Syntax verwenden, müssen Sie die' bind() 'Methode überhaupt nicht verwenden. Aber die Frage ist nicht darüber :) – vanless