TLDR Senden: Verwenden Sie defaultChecked statt geprüft, Arbeits jsbin hier http://jsbin.com/mecimayawe/1/edit?js,outputReagieren Checkbox nicht onChange
Der Versuch, die Einrichtung ein einfaches Kontrollkästchen, das das Etikett Text überqueren, wenn es aktiviert ist. Aus irgendeinem Grund wird handleChange nicht ausgelöst, wenn ich die Komponente verwende. Kann mir jemand erklären, was ich falsch mache?
var CrossoutCheckbox = React.createClass({
getInitialState: function() {
return {
complete: (!!this.props.complete) || false
};
},
handleChange: function(){
console.log('handleChange', this.refs.complete.checked); // Never gets logged
this.setState({
complete: this.refs.complete.checked
});
},
render: function(){
var labelStyle={
'text-decoration': this.state.complete?'line-through':''
};
return (
<span>
<label style={labelStyle}>
<input
type="checkbox"
checked={this.state.complete}
ref="complete"
onChange={this.handleChange}
/>
{this.props.text}
</label>
</span>
);
}
});
Verbrauch:
React.renderComponent(CrossoutCheckbox({text: "Text Text", complete: false}), mountNode);
Lösung:
geprüft verwenden, nicht die zugrunde liegende Wertänderung (scheinbar) lassen und somit nicht den onChange Handler nicht nennen. Umschalten auf defaultChecked scheint dies zu beheben:
var CrossoutCheckbox = React.createClass({
getInitialState: function() {
return {
complete: (!!this.props.complete) || false
};
},
handleChange: function(){
this.setState({
complete: !this.state.complete
});
},
render: function(){
var labelStyle={
'text-decoration': this.state.complete?'line-through':''
};
return (
<span>
<label style={labelStyle}>
<input
type="checkbox"
defaultChecked={this.state.complete}
ref="complete"
onChange={this.handleChange}
/>
{this.props.text}
</label>
</span>
);
}
});
Zuerst, warum nicht ein onChange hinzufügen, das tut einfach 'this.setState ({checked:! This.state.checked})' Einfacher als einen Wert speichern zu müssen. Dann ein ternärer Operator in der aktivierten attrubute: 'checked = {this.state.checked? 'checked': null} ' – zackify
So begann es, aber es schien nie zu aktualisieren. Also fing ich an, hier und da aufzutun, um zu debuggen, was nicht gefeuert wurde. Im Idealfall gehen Sie zurück zum einfachsten Formular, wenn Sie fertig sind :) – jdarling
Angenommen, Ihr mountNode ist ein tatsächlicher Dom-Knoten, müssten Sie 'this.refs.complete.getDOMNode(). Checked' verwenden. siehe fiddle http://jsfiddle.net/d10xyqu1/ – trekforever