ダウンロード サンプルファイル (57.5 KB)
イベントハンドリング
次にイベントのハンドリングの方法について解説します。ここはReactの良さがよく分かる部分だと思います。通常のJavaScriptの場合、以下のようなコードによって、onclickイベントをloginAuthenticaitonメソッドでハンドルします。あるいはjQueryであれば.onを利用するといった具合でしょう。
<button onclick=“loginAuthentication()“>
Login
</button>
このような表記方法では、どこにでもメソッドを記述できてしまうため、アプリが大きくなるにつれて、どうしてもコードが複雑になってしまうという問題がつきまといます。
Reactを利用することでコンポーネントクラスにイベント処理をまとめることができ、この複雑さ問題を解決できます。以下のサンプルプログラムで確認しましょう。1から30までの数字のルーレットです。
import React from 'react';
import ReactDOM from 'react-dom';
// Reactコンポーネントの宣言
class Roulette extends React.Component {
constructor(props) {
super(props);
this.state = { number: 1,
isStart: false};
this.toggleButton = this.toggleButton.bind(this); // (1)
}
// state.numberを更新するメソッド
shuffle(){
var rand = Math.floor(Math.random() * 30) + 1;
this.setState({number: rand});
}
// ルーレットを開始するメソッド
startRoulette(){
this.interval = setInterval(() => this.shuffle(), 50);
}
// ルーレットを停止するメソッド
stopRoulette(){
clearInterval(this.interval);
}
// ルーレット開始、または停止とイベントに合わせてボタンのラベルを切り替える
toggleButton(){
if(this.state.isStart){
this.stopRoulette();
} else {
this.startRoulette();
}
this.setState((prevState) => ({
isStart : !prevState.isStart
}));
}
// buttonのonClickイベントにtoggleButtonをバインド
// Reactコンポーネントを返す
render() {
return (
<div>
<p>number : {this.state.number}</p>
<button onClick={this.toggleButton}>
{this.state.isStart ? 'Stop' : 'Start'}
</button>
</div>
);
}
}
// DomにReact要素を挿入
ReactDOM.render(
<Roulette />,
document.getElementById('root')
);
Reactを使うことで、コンポーネント内にイベントハンドラをまとめることができるため、DOM生成時にリスナーを登録する必要がなくなります。コーディングの注意すべきこととしては、(1)のようにハンドラとなるメソッドをクラスにbindする必要がある点です。bindすることで、toggleButtonメソッドがclickイベントハンドラとして登録可能になります。bindを忘れてしまうとonclickイベントが発生したときに、undefinedとなります。
constructor(props) {
super(props);
this.state = { ... };
this.[hadlerName] = this.[functionName].bind(this);
}
handlerName: イベントハンドラ名, functionName: 関数オブジェクト名
create-react-appを使ってアプリを作成した場合は、以下のように記述することで、bindせずにイベントハンドラを設定することもできます。
<button onClick={(e) => this.toggleButton(e)}>
{this.state.isStart ? 'Stop' : 'Start'}
</button>
あとがき
今回は、いくつかのサンプルを交えてコンポーネントに関する重要な概念を紹介しました。
次回はサードパーティー製のコンポーネントセットであるMaterial-UIを利用して、デザイン性のアプリをクイックに開発する手法を紹介します。
この記事は参考になりましたか?
既に会員の方はを行ってください。
- この記事の著者
-
WINGSプロジェクト 飯田 勝也(イイダ カツヤ)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
