TLDR:使用 defaultChecked 而不是已检查的工作jsbin。
尝试设置一个简单的复选框,当它被选中时会划掉它的标签文本。由于某种原因,当我使用该组件时,handleChange 没有被触发。谁能解释我做错了什么?
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> ); } });
用法:
React.renderComponent(CrossoutCheckbox({text: "Text Text", complete: false}), mountNode);
解决方案:
使用 checked 不会让底层值发生变化(显然),因此不会调用 onChange 处理程序。切换到 defaultChecked 似乎可以解决这个问题:
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.state.checked
另一种方法是从传递给handleChange方法的事件中获取它:
handleChange
event.target.checked