TLDR: Verwenden Sie defaultChecked anstelle von aktiviertem , funktionierendem jsbin .
Es wird versucht, ein einfaches Kontrollkästchen einzurichten, bei dem der Beschriftungstext durchgestrichen wird, 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>
);
}
});
Verwendung:
React.renderComponent(CrossoutCheckbox({text: "Text Text", complete: false}), mountNode);
Lösung:
Durch die Verwendung von "Check" wird der zugrunde liegende Wert (anscheinend) nicht geändert, und der onChange-Handler wird nicht aufgerufen. Das Wechseln zu 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>
);
}
});
this.refs.complete.getDOMNode().checked
. siehe fiddle jsfiddle.net/d10xyqu1
this.setState({checked: !this.state.checked})
einfacher ist als das Speichern eines Werts. Dann ein ternärer Operator im geprüften Attribut:checked={this.state.checked ? 'checked': null}