SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

JavaScriptフレームワーク「Vue.js」と「Nuxt.js」の活用

画面要素を再利用できる、Vue.jsのコンポーネント機能を学ぼう

JavaScriptフレームワーク「Vue.js」と「Nuxt.js」の活用 第4回

コンポーネントのカスタムイベント

 コンポーネントでカスタムイベントを発生させる方法を、図4のサンプルで説明します。各コンポーネントの「この商品を買う」ボタンをクリックすると、対応したメッセージが表示されます。

図4:コンポーネントのカスタムイベントを利用するサンプル(p004-event)
図4:コンポーネントのカスタムイベントを利用するサンプル(p004-event)

 カスタムイベントを発生するコンポーネントをリスト9に示します。

[リスト9]カスタムイベントを発生するコンポーネント(p004-event/components/Smartphone.vue)
export default {
  props: ['spec'], // プロパティ ...(1)
  methods: {
    onClickButton() { // ボタンのイベントハンドラー ...(2)
      this.$emit('phoneSelected', this.spec) // カスタムイベント発生 ...(3)
    }
  }
}

 (1)はプロパティの定義です。(2)はコンポーネントのボタンがクリックされたときのイベントハンドラーで、(3)のthis.$emitメソッドでカスタムイベントを発生させます。第1引数の「phoneSelected」はカスタムイベントのイベント名で、第2引数にはイベント変数(ここではspecプロパティの内容)を設定できます。

 コンポーネントを利用する側では、カスタムイベント名を設定した「v-on:phoneSelected」ディレクティブで、イベント発生時に実行するメソッド(ここではonPhoneSelecedメソッド)を設定します。

[リスト10]コンポーネントのカスタムイベントを利用する実装(p004-event/pages/index.vue)
<Smartphone v-bind:spec="phone" v-on:phoneSelected="onPhoneSelected"/>

 onPhoneSelecedメソッドの実装はリスト11の通りです。引数eventには、リスト9(3)で設定したイベント変数(specプロパティの内容)が渡されます。ここではeventから会社名(event.vendor)と商品名(event.name)を取得してメッセージを表示します。

[リスト11]カスタムイベントのイベントハンドラー(p004-event/pages/index.vue)
onPhoneSelected(event) {
  alert(`${event.vendor} ${event.name}を購入します。`)
}

コンポーネントの切り替え表示

 複数のコンポーネントを切り替え表示させる方法を、図5のサンプルで説明します。3つのボタンをクリックすると、対応したコンポーネントが切り替え表示されます。

図5:コンポーネントを切り替え表示するサンプル(p005-change)
図5:コンポーネントを切り替え表示するサンプル(p005-change)

 コンポーネントを切り替え表示するWebページの実装をリスト12に示します。

[リスト12]コンポーネントを切り替え表示するWebページ(p005-change/pages/index.vue)
<template>
  <div class="container">
    <h1>コンポーネントの切り替え表示</h1>
      <button v-on:click="onClickApple">Apple</button>
      <button v-on:click="onClickSamsung">Samsung</button>
      <button v-on:click="onClickSHARP">SHARP</button>
    <div v-bind:is="currentComponent"/><!-- コンポーネント表示 ...(1)-->
  </div>
</template>
<script>
import Apple from '~/components/Apple'
import Samsung from '~/components/Samsung'
import SHARP from '~/components/SHARP'
export default {
  components: { // コンポーネント ...(2)
    Apple,
    Samsung,
    SHARP
  },
  data() {
    return {
      currentComponent: 'Apple' // コンポーネント名 ...(3)
    }
  },
  methods: {
    // ボタン押下時にコンポーネント名を変更 ...(4)
    onClickApple() {
      this.currentComponent = 'Apple'
    },
    onClickSamsung() {
      this.currentComponent = 'Samsung'
    },
    onClickSHARP() {
      this.currentComponent = 'SHARP'
    }
  }
}
</script>

 切り替え表示するコンポーネントは(2)のApple、Samsung、SHARPです。コンポーネントを表示する場所は(1)で、「v-bind:is="currentComponent"」とディレクティブを設定すると、currentComponent変数(3)に設定された名前のコンポーネントが表示されます。ボタンクリック時の処理(4)で、currentComponent変数の内容を更新すると、対応するコンポーネントが切り替え表示されます。

まとめ

 本記事では、Nuxt.jsで利用できるVue.jsのコンポーネント機能について説明しました。コンポーネントを利用することで、開発効率や品質の向上、部品としての再利用が期待できます。

 次回は、Vue.jsのWebページで単一の状態を管理する状態管理パターン「Vuex」を利用する方法を説明します。

参考資料

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
JavaScriptフレームワーク「Vue.js」と「Nuxt.js」の活用連載記事一覧

もっと読む

この記事の著者

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編 」他、著書多数

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/11856 2019/12/12 11:00

イベント

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

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

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

メールバックナンバー