SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

基礎からはじめるReact入門

Reactコンポーネントへの理解を深める

基礎からはじめるReact入門 第2回


  • X ポスト
  • このエントリーをはてなブックマークに追加

イベントハンドリング

 次にイベントのハンドリングの方法について解説します。ここはReactの良さがよく分かる部分だと思います。通常のJavaScriptの場合、以下のようなコードによって、onclickイベントをloginAuthenticaitonメソッドでハンドルします。あるいはjQueryであれば.onを利用するといった具合でしょう。

<button onclick=“loginAuthentication()“> 
    Login
</button>

 このような表記方法では、どこにでもメソッドを記述できてしまうため、アプリが大きくなるにつれて、どうしてもコードが複雑になってしまうという問題がつきまといます。

 Reactを利用することでコンポーネントクラスにイベント処理をまとめることができ、この複雑さ問題を解決できます。以下のサンプルプログラムで確認しましょう。1から30までの数字のルーレットです。

リスト2 RouletteApp/src/index.js
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')
);
図3 実行結果
図3 実行結果

 Reactを使うことで、コンポーネント内にイベントハンドラをまとめることができるため、DOM生成時にリスナーを登録する必要がなくなります。コーディングの注意すべきこととしては、(1)のようにハンドラとなるメソッドをクラスにbindする必要がある点です。bindすることで、toggleButtonメソッドがclickイベントハンドラとして登録可能になります。bindを忘れてしまうとonclickイベントが発生したときに、undefinedとなります。

[構文]constructor内でのイベントハンドラ設定
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を利用して、デザイン性のアプリをクイックに開発する手法を紹介します。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
基礎からはじめるReact入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 飯田 勝也(イイダ カツヤ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/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本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/9928 2017/04/14 21:51

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング