React フォームとイベント
この章では、React でフォームを使用する方法について説明します。
HTML フォーム要素は React の他の DOM 要素とは異なります。フォーム要素は本来、内部状態を保持するからです。
HTML では、<input>、<textarea>、<select> などのフォーム要素は自身の状態を維持し、ユーザーの入力に応じて更新されます。しかし React では、可変状態は通常コンポーネントの state プロパティに保存され、setState() メソッドでのみ更新できます。
簡単な例
この例では、入力ボックス input の値を設定します。value = {this.state.data}入力ボックスの値が変更されたときに state を更新できます。次のものを使用できます。onChangeイベントを使用して input の変更を監視し、state を変更します。
React 実例
class HelloMessage extends React.Component {
constructor(props) {
super(props);
this.state = {value: 'Hello サンプル!'};
this.handleChange = this.handleChange.bind(this);
}
handleChange(event) {
this.setState({value: event.target.value});
}
render() {
var value = this.state.value;
return <div>
<input type="text" value={value} onChange={this.handleChange} />
<h4>{value}</h4>
</div>;
}
}
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<HelloMessage />
);
試してみる »
上記のコードは、値が Hello サンプル! の input 要素をレンダリングし、onChange イベントでユーザー入力の値を更新して応答します。
実例 2
次の例では、子コンポーネントでフォームを使用する方法を説明します。onChangeメソッドは state の更新をトリガーし、更新された値を子コンポーネントの入力ボックスのvaluevalue に渡して画面を再レンダリングします。
親コンポーネントでイベントハンドラ(handleChange)を作成し、prop(updateStateProp)として子コンポーネントに渡す必要があります。
React 実例
class Content extends React.Component {
render() {
return (
<div>
<input type="text" value={this.props.myDataProp} onChange={this.props.updateStateProp} />
<h4>{this.props.myDataProp}</h4>
</div>
);
}
}
class HelloMessage extends React.Component {
constructor(props) {
super(props);
this.state = { value: 'Hello サンプル!' };
this.handleChange = this.handleChange.bind(this);
}
handleChange(event) {
this.setState({ value: event.target.value });
}
render() {
var value = this.state.value;
return (
<div>
<Content myDataProp={value} updateStateProp={this.handleChange} />
</div>
);
}
}
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<HelloMessage />);
試してみる »
Select ドロップダウンメニュー
React では、selected 属性を使用せず、ルートの select タグで value 属性を使用して選択項目を表します。
React 実例
class FlavorForm extends React.Component {
constructor(props) {
super(props);
this.state = {value: 'coconut'};
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(event) {
this.setState({value: event.target.value});
}
handleSubmit(event) {
alert('Your favorite flavor is: ' + this.state.value);
event.preventDefault();
}
render() {
return (
<form onSubmit={this.handleSubmit}>
<label>
お気に入りのウェブサイトを選択
<select value={this.state.value} onChange={this.handleChange}>
<option value="gg">Google</option>
<option value="rn">サンプル</option>
<option value="tb">Taobao</option>
<option value="fb">Facebook</option>
</select>
</label>
<input type="submit" value="送信" />
</form>
);
}
}
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<FlavorForm />
);
試してみる »
複数のフォーム
複数の input 要素を処理する場合、各要素に name 属性を追加することで、処理関数がevent.target.nameの値に基づいて何を行うかを選択できます。
React 実例
class Reservation extends React.Component {
constructor(props) {
super(props);
this.state = {
isGoing: true,
numberOfGuests: 2
};
this.handleInputChange = this.handleInputChange.bind(this);
}
handleInputChange(event) {
const target = event.target;
const value = target.type === 'checkbox' ? target.checked : target.value;
const name = target.name;
this.setState({
[name]: value
});
}
render() {
return (
<form>
<label>
離れるかどうか:
<input
name="isGoing"
type="checkbox"
checked={this.state.isGoing}
onChange={this.handleInputChange} />
</label>
<br />
<label>
訪問者数:
<input
name="numberOfGuests"
type="number"
value={this.state.numberOfGuests}
onChange={this.handleInputChange} />
</label>
</form>
);
}
}
試してみる »
React イベント
次の例では、onClick イベントを使用してデータを変更する方法を示します。
React 実例
class HelloMessage extends React.Component {
constructor(props) {
super(props);
this.state = {value: 'Hello サンプル!'};
this.handleChange = this.handleChange.bind(this);
}
handleChange(event) {
this.setState({value: 'サンプル'})
}
render() {
var value = this.state.value;
return <div>
<button onClick={this.handleChange}>クリック</button>
<h4>{value}</h4>
</div>;
}
}
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<HelloMessage />
);
試してみる »
子コンポーネントから親コンポーネントのstateを更新する必要がある場合、親コンポーネントでイベントハンドラ(handleChange)を作成し、prop(updateStateProp)として子コンポーネントに渡す必要があります。例は次のとおりです。
React 実例
class Content extends React.Component {
render() {
return <div>
<button onClick = {this.props.updateStateProp}>クリック</button>
<h4>{this.props.myDataProp}</h4>
</div>
}
}
class HelloMessage extends React.Component {
constructor(props) {
super(props);
this.state = {value: 'Hello サンプル!'};
this.handleChange = this.handleChange.bind(this);
}
handleChange(event) {
this.setState({value: 'サンプル'})
}
render() {
var value = this.state.value;
return <div>
<Content myDataProp = {value}
updateStateProp = {this.handleChange}></Content>
</div>;
}
}
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<HelloMessage />
);
試してみる »
その他の拡張