2015-02-01 37 views
21

Ich habe eine React-Komponente namens <SensorList />, die viele Kind hat <SensorItem /> s (eine andere React-Komponente). Ich möchte in der Lage sein, ein onClick Ereignis auf jedem <SensorItem /> von innerhalb <SensorList /> zu deklarieren. Ich habe versucht, folgendes zu tun:Reagieren onClick-Ereignis auf Komponente

sensorSelected: function(sensor) { 
    console.log('Clicked!'); 
}, 

render: function() { 
    var nodes = this.state.sensors.map(function(sensor) { 
     return (
      <SensorItem onClick={ this.sensorSelected } /> 
     ); 
    }.bind(this)); 

    return (
     <div className="sensor-list"> 
      { nodes } 
     </div> 
    ); 
} 

unnötig zu sagen, ich bekomme keine "Clicked!" in meiner Konsole auftauchen. Der React-Inspector in Chrome zeigt an, dass ein onClick -Ereignis registriert ist, mit der obigen Funktion body, wie es sein sollte.

Ich schließe daher, dass ich onClick Ereignisse auf die tatsächlichen <SensorItem /> Tags nicht registrieren kann (ich bin mir nicht sicher, warum das ist, jedoch). Wie kann ich das sonst erreichen?

Antwort

49

Dies hängt von der Definition Ihrer SensorItem-Komponente ab. Da SensorItem kein natives DOM-Element ist aber, wie Sie sagten, eine andere React-Komponente, onClick wie hier definiert ist einfach eine Eigenschaft dieser Komponente. Was Sie tun müssen, ist, innerhalb der SensorItem Komponente passieren prop die onClick auf ein onClick-Ereignis des DOM Komponente:

var SensorItem = React.createClass({ 
    render: function() { 
    return (
     <div className="SensorItem" onClick={this.props.onClick}> 
     ... 
     </div> 
    ); 
    } 
}); 
+1

Verstanden, hatte ich gedacht, vielleicht, dass eine Komponente automatisch auf alle Ereignisse an den Haupt DOM-Knoten weitergeleitet ('getDOMNode()'), aber es gibt keinen Grund, dass dies der Fall sein sollte. – GTF

+2

Ich dachte, angenommen, war sicher, dass diese Genies bei Facebook gedacht hätten, dass es bequem wäre. Nicht praktisch genug, denke ich. – Cody

+2

Um das hinzuzufügen, können Sie * all * Requisiten relativ leicht mit der Argument-Destrukturierungssyntax wie folgt an den Haupt-DOM-Knoten übergeben: '' const SensorItem = ({... reps}) => { return (

...
); } '' ' Das macht es zukunftssicher, wenn Sie onDoubleClick, onKeyDown, etc. hinzufügen müssen –

Verwandte Themen