Es gibt zwei Probleme in Ihrem Code. Die erste ist hier:
<SingleChoiceGroup selectedItem={() => this.selectedDay()} numberOfButtons={7} prefix={"Text"}/>
Weil Ihre selectedItem
Pfeil Funktion keine Argumente übernehmen, der i
Wert durch SingleChoiceGroup geben wird verloren.
Sie können dieses Problem lösen, indem es selectedItem={i => this.selectedDay(i)}
verändert, sondern eher als eine Funktion übergeben, die this.selectedDay
nennt, können Sie einfach this.selectedDay
passieren selbst, das heißt:
<SingleChoiceGroup selectedItem={this.selectedDay} numberOfButtons={7} prefix={"Text"}/>
Das zweite Problem, wie Bartek in darauf hingewiesen, seine Antwort ist, dass i
in unserer for
Schleife eine Referenz auf das gleiche Objekt in jeder Iteration der Schleife ist, und da der endgültige Wert 7
ist, das ist der Wert, den der Ereignishandler für jede Schaltfläche erhält. Es gibt eine ausführlichere Diskussion zu diesem Thema in this answer. Der TL; DR soll let
anstelle von var
verwenden, um die for
-Schleife jedes Mal eine neue Blockbereichsvariable initialisieren zu lassen.
Hier sind diese beiden Änderungen in einem Arbeits Schnipsel:
const Button = props => <button type="button" {...props}/>;
var SingleChoiceGroup = React.createClass({
render(){
var numberOfButtons = this.props.numberOfButtons;
var prefix = this.props.prefix;
var buttons = [];
for (let i = 0; i < numberOfButtons; i++){
buttons.push(
<Button key={i} value={i} onClick={() => this.props.selectedItem(i)}>{`${prefix} ${i+1}`}</Button>
);
}
return <div>{buttons}</div>;
}
});
var AnotherComponent = React.createClass({
selectedDay(i){
console.log('clicked %d', i);
},
render(){
return <SingleChoiceGroup selectedItem={this.selectedDay} numberOfButtons={7} prefix="Text"/>
}
});
ReactDOM.render(<AnotherComponent/>, document.getElementById('container'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
Click on us: <div id="container"></div>
Entschuldigung Im ziemlich neu zu reagieren, was genau "etwas binden" bedeutet, habe ich versucht 'selectedItem = {this.selectedDay}' aber ich bekomme immer den gleichen Wert (7) in 'selectedDay' Methode –
Ich habe das Problem, das Sie erwähnt haben, behoben und meine Antwort mit einem Arbeits-Snippet aktualisiert. "Bind" ist kein Begriff von React, es ist ein Begriff aus JavaScript. Der Grund, warum Sie es verwenden müssen, wird hier erklärt: https://facebook.github.io/react/docs/handling-events.html (Scrollen Sie zum Absatzanfang "Sie müssen vorsichtig sein ...") –
Danke, jetzt verstehe ich den Unterschied zwischen 'var' und' let' –