2016-11-22 4 views
1

Ich habe gerade begonnen, mit ReactJS zu arbeiten, und ich kann nicht herausfinden, wie ich OnClick-Ereignisse innerhalb einer Map-Funktion arbeiten, die ein paar ähnliche Elemente macht. Wenn ich onClick = {this.someMethodName} in den untergeordneten Elementen nicht verwende, funktioniert alles einwandfrei. Daher nehme ich an, dass das Schlüsselwort 'this' nicht mehr auf das übergeordnete Element verweist.ReactJS onClick-Ereignis in Kartenfunktion, dann rufen Elternfunktion

Hier ist mein Code, die eine einfache menubar macht:

var SupplierBarComponent = React.createClass({ 
doSomething: function() { 
    console.log("aaaaaaaah"); 
}, 

render: function() { 

    const suppliers = this.props.data.map(function(supplier){ 
     return (
      <option onClick={this.doSomething} key={supplier.id}>{supplier.name}</option> 
     ); 
    }, this); 

    return(
     <div>{suppliers}</div> 
    ); 

} 

Wie kann ich es funktioniert? Ich habe ein paar ähnliche Fragen * gelesen, aber ihre Lösungen funktionierten nicht für mich, oder ich konnte sie nicht funktionieren lassen.

*: React onClick inside .map then change data in another sibling component "this" is undefined inside map function Reactjs Pass props to parent component in React.js

+0

Wenn Sie dies in der Karte Funktion console.log ist es die Komponente Objekt zurückgeben? – finalfreq

+0

Ja, tut es. Wenn ich es durch console.log (this.doSomething) - also ohne() s anrufe, druckt es die Funktion selbst: 3models.jsx: 9() { console.log ("aaaaaaaah"); } Wenn ich es mit Klammern anrufe, druckt es zuerst 'undefined', aber die Funktion wird immer noch aufgerufen, und 'aaaah' wird ausgedruckt. – handris

+0

Müssen Sie 'this.doSomething.bind (this)' ?? abhängig von Ihrer Verwendung dieses Innen DoSomething? Außerdem sollten Sie ein synthetisches Ereignisobjekt erhalten, das mehr Informationen enthält ... – Tracker1

Antwort

2

Ihr Code funktioniert. Ich habe es auf dieser Fiddle überprüft. Ich habe nur ein Array anstelle der Requisiten fest programmiert.

var Hello = React.createClass({ 
doSomething: function() { 
    console.log("aaaaaaaah"); 
}, 

render: function() { 
     var data=[{id:1,name:'name 1'},{id:2,name:'name 2'}] 
    const suppliers = data.map(function(supplier){ 
     return (
      <option onClick={this.doSomething} key={supplier.id}>{supplier.name}</option> 
     ); 
    }, this); 

    return(
     <div>{suppliers}</div> 
    ); 
} 
}) 

ReactDOM.render(
    <Hello />, 
    document.getElementById('container') 
); 

https://jsfiddle.net/evweLre5/

+0

Danke für die Mühe, es auszuprobieren, es funktioniert eindeutig in Geige. Was könnte ich auf meinem lokalen Rechner falsch machen? Ich habe keine Ahnung, wo ich hinschauen soll. – handris

+0

Mein erster Vorschlag an Sie ist die Verwendung der ES6-Konvention für den Reaktionscode. –

+0

Ich habe es auch auf meinem lokalen versucht und es funktioniert absolut gut. –