2016-03-07 4 views

Antwort

27

React 0.14 führte reine Funktionskomponenten ein.

Dies sollte die bevorzugte Option für alle zustandslosen Komponenten sein.

function Option({ onClick, option }) { 
    return (
     <li onClick={onClick}> 
      {option} 
     </li> 
    ); 
} 
+0

Es gibt jedoch einen Unterschied darin, dass der Click-Handler Teil der Komponente in der Frage ist. – flq

+0

In den meisten Fällen ist es besser, den Click-Handler auf einer höheren Ebene zu definieren. Alternativ können Sie eine separate Funktion in derselben Datei erstellen. –

0

Ich habe ein ähnliches Problem. Weiß jemand wie man eine komponentenspezifische Requisite innerhalb der übergebenen Klick-Funktion aufruft?

z.

function ElementRow({onClick, element, key}) { 
    return (
    <tr key={key}> 
     <td><a href="#" onClick={onClick}>Delete</a></td> 
     <td> 
     ... 
     <td>{ element.first } { element.last }</td> 
    </tr> 
); 
} 

Innerhalb der onClick Funktion brauche ich die element.id. Ich bin auf der Suche nach einer Lösung ohne bind()

Ich weiß, wie man es mit oder extend React.Component arbeiten, aber nicht als reine Funktion geschrieben.

Bearbeiten: Eine Lösung gefunden, aber ich bin mir nicht sicher, ob es ein Code-Geruch ist. :)

function ElementRow({ onClick, element, key }) { 
    const _onClick = (e) => { 
    onClick(e, element.id); 
    }; 

    return (
    <tr key={key}> 
     <td><a href="#" onClick={_onClick}>Delete</a></td> 
     <td> 
     ... 
     </td> 
     <td>{ element.first } { element.last }</td> 
    </tr> 
); 
} 
+1

In diesem Fall können Sie auch die Funktion 'onClick = {(event) => onClick (event, element.id)}' einfügen. Alternativ können Sie das onClick-Ereignis auf einer höheren Ebene definieren (d. H. Die übergeordnete Komponente). Wenn Sie eine Frage haben, starten Sie in Zukunft einen neuen Thread, anstatt eine Frage auf eine bestehende zu setzen. –

+0

Sie haben Recht, nächstes Mal werde ich einen neuen Thread starten, war mir nicht sicher. In diesem Fall wird das onClick durch Requisiten von einer übergeordneten Komponente geleitet. Ich denke, es lohnt sich, einen neuen Thread mit einem vollständigen und beschreibenden Beispiel zu beginnen. – hyde

10

In ES6 Sie etwas ähnliches wie dies tun könnte:

const Option = (props) => { 

    handleClickOption() { 
     // some code 
    } 

    return (
     <li onClick={this.handleClickOption}>{this.props.option}</li> 
    ); 
}; 

Option.propTypes = { 
    // validate props 
}; 

export default Options; 
+2

Nichts mit Ihrer speziellen Lösung zu tun, aber mehr als eine allgemeine Antwort auf diese Art von Codierungsstil: Ich verstehe es nicht. Warum sollten Sie jedes Mal, wenn Ihre Komponente rendern soll, eine neue 'handleClickOption' erstellen, anstelle eines prototypischen Objekts, das alle die gleiche Funktionsreferenz hat, aber für jede Ausführung einen anderen Kontext verwendet? Scheint wie aufgeblasen für die JS-Engine ... – Swivel

+0

es funktioniert gut für mich: D ich stimme für diese @ John Meyer – Vijay

6

Die Stateless funktionalen Komponenten aus zukünftigen speziell für diese Komponenten reagieren Performance-Optimierungen profitieren. Hier ist die Art, wie wir Komponente als reine Funktion schreiben:

const App =() => { 
 
    return (
 
    <div> 
 
     <h2 id="heading">Hello ReactJS </h2> 
 
     <header /> 
 
    </div> 
 
); 
 
}; 
 

 
export default App;

Allerdings, wenn Sie in ES6 Stil schreiben Komponente möchten, können Sie noch tun, aber in diesem Fall ist der eslint Fehler sein müssen entfernt (wenn Sie eslint verwenden). Die folgende Änderung in .eslintrc Datei

z.B:

"rules": { 
 
    "react/prefer-stateless-function": "off" 
 
}

Dann hier ES6 Stil Komponente, die Sie mit eslint schreiben aktivieren:

import React, { Component } from 'react'; 
 

 
class Home extends Component { 
 
    render() { 
 
    return (
 
     <header className="header"> 
 
     <h1>Home page</h1> 
 
     </header> 
 
    ); 
 
    } 
 
} 
 

 
export default Home;

Verwandte Themen