var Checkbox = React.createClass({
getDefaultProps() {
return {
defaultChecked: false,
onChange(){}
};
},
getInitialState() {
var state = {};
var props = this.props;
if('checked' in props){
state.checked = props.checked;
} else {
state.checked = props.defaultChecked;
}
return state;
},
componentWillReceiveProps(newProps){
// 组件重新渲染了,属性可能有改变,同步属性到状态
if('checked' in newProps){
this.setState({
checked: newProps.checked
});
}
},
onClick() {
var nextChecked = !this.state.checked;
if(!('checked' in this.props)){
// 非受限
this.setState({
checked: nextChecked
});
}
// 回调函数通知外部
this.props.onChange(nextChecked);
},
render() {
var state = this.state;
var style = {border:'1px solid red',display:'inline-block',width:100,height:100}
if(state.checked){
style.backgroundColor='red';
}
return <span style={style} onClick={this.onClick}></span>;
}
});
var Test = React.createClass({
getInitialState(){
return {
checked: false
};
},
onChange(){
this.setState({
checked: !this.state.checked
});
},
render(){
return <div>
<p>受限: <Checkbox checked={this.state.checked} /></p>
<p>不受限: <Checkbox defaultChecked={true} onChange={this.onChange}/></p>
</div>;
}
});
React.render(<Test />, document.getElementById('container'));
<script src="https://facebook.github.io/react/js/jsfiddle-integration.js"></script>
<div id="container">
<!-- This element's contents will be replaced with your component. -->
</div>
External resources loaded into this fiddle: