<script src="https://facebook.github.io/react/js/jsfiddle-integration-babel.js"></script>
<div class="container">
<div id="hello">
</div>
</div>
var Hello = React.createClass({
propTypes: {
value: React.PropTypes.string
},
getDefaultProps: function() {
return {
value: "@tercel_s"
};
},
getInitialState: function() {
return {
name: this.props.value
};
},
// 描画処理
render: function() {
return (
<div>
<h3>コンポーネント分割の練習</h3>
<NameInputForm value={this.state.name}
onChange={this.handleChanged} />
<MessageField name={this.state.name} />
</div>
);
},
// テキストエリア変更時のイベント処理
//(子コンポーネントから呼ばれるよ!)
handleChanged: function(value) {
this.setState({name: value});
}
});
// ----------------------------------------
// 子コンポーネント1: テキストエリア
var NameInputForm = React.createClass({
propTypes: {
value: React.PropTypes.string.isRequired,
onChange: React.PropTypes.func.isRequired
},
getInitialState: function() {
return {
name: this.props.value
};
},
render: function() {
return (
<form className="form-inline">
<div className="form-group">
<label>お名前:</label>
<input name="name"
className="form-control"
value={this.state.name}
placeholder="名前を入力してください"
onChange={this.handleChange} />
</div>
</form>
);
},
handleChange: function(event) {
var newValue = event.target.value;
this.setState({name: newValue});
this.props.onChange(newValue);
}
});
// ----------------------------------------
// 子コンポーネント2: メッセージ領域
var MessageField = React.createClass({
propTypes: {
name: React.PropTypes.string.isRequired
},
render: function() {
var name = this.props.name;
var isEmpty = !name;
var innerContent = isEmpty ?
<span>名前が入力されていません</span> :
<span>ようこそ {name} さん</span>;
return (
<div className={isEmpty ?
'alert alert-warning' :
'alert alert-info'}>
{innerContent}
</div>
);
}
});
ReactDOM.render(
<Hello />,
document.getElementById('hello')
);
External resources loaded into this fiddle: