SHOEISHA iD

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

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

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

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

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

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

コンポーネントのプロパティ

 コンポーネントにプロパティを設定して、外部からパラメーターを設定できるようにできます。同じコンポーネントでもプロパティで表示や動作を変えることができます。

基本的なプロパティの利用法

 図2のサンプルで、基本的なプロパティの実装方法を説明します。異なるプロパティを設定した同一種類のコンポーネントを2個、Webページに表示します。

図2:コンポーネントにプロパティを設定するサンプル(p002-property)
図2:コンポーネントにプロパティを設定するサンプル(p002-property)

 図2で表示しているコンポーネントの実装は、リスト3の通りです。

[リスト3]コンポーネントにプロパティを設定する実装(p002-property/components/Smartphone.vue)
<template>
  <div class="component">
    <h2>{{ name }}</h2><!--(1)-->
    <ul>
      <li>ID:{{ id }}</li>
      <li>会社:{{ vendor }}</li>
      <li>価格:{{ price }}</li>
      <li>5G対応:{{ is5G === true ? 'はい' : 'いいえ' }}</li>
    </ul>
  </div>
</template>
<script>
export default {
  props: ['id', 'vendor', 'name', 'price', 'is5G'] // プロパティ ...(2)
}
</script>

 コンポーネントのプロパティは、<script>のprops(2)に設定します。ここではid(ID)、vendor(会社名)、name(商品名)、price(価格)、is5G(5G対応)の5種類のプロパティを設定しています。これらのプロパティはコンポーネント内で変数として参照できます。たとえばnameプロパティは(1)で「{{ name }}」と記述して表示できます。

 コンポーネントを利用するWebページでは、リスト4の通り、コンポーネントタグの属性としてプロパティを設定します。

[リスト4]プロパティの設定方法(p002-property/pages/index.vue)
<h1>プロパティに値を直接設定</h1><!--(1)-->
<Smartphone id="1" vendor="Apple" name="iPhone 11" price="74800" is5G="false"/>
<h1>v-bindで変数を設定</h1><!--(2)-->
<Smartphone
  v-bind:id="phoneId"
  v-bind:vendor="phoneVendor"
  v-bind:name="phoneName"
  v-bind:price="phonePrice"
  v-bind:is5G="phoneIs5G"/>

 プロパティの属性には、値を直接設定する(1)ほか、v-bindディレクティブで変数をプロパティに反映させる(2)こともできます。

[補足]プロパティのデータ型を指定

 リスト3(2)のプロパティ設定ではプロパティ名だけを列挙していましたが、propsをリスト5の通り記述すると、プロパティのデータ型を指定することもできます。リスト5では、idとpriceにNumber、vendorとnameにString、is5GにBooleanの型を指定しています。

[リスト5]プロパティにデータ型を指定(p002a-property-typed/components/Smartphone.vue)
props: {
  'id': Number,
  'vendor': String,
  'name': String,
  'price': Number,
  'is5G': Boolean
}

 データ型が一致しない値がプロパティに設定された場合、JavaScriptコンソールに警告が表示されます。詳細はサンプルコード(p002a-property-typed)を参照してください。

JavaScriptオブジェクトをプロパティにする方法

 コンポーネントのプロパティには、文字や数字だけではなく、配列やJavaScriptオブジェクトも利用できます。ここでは、JavaScriptオブジェクトを利用する例を、図3のサンプルで説明します。JavaScriptオブジェクトをプロパティにする2パターンの方法に対応した、2個のコンポーネントが画面に表示されます。

図3:JavaScriptオブジェクトをプロパティにするサンプル(p003-property-object)
図3:JavaScriptオブジェクトをプロパティにするサンプル(p003-property-object)

 コンポーネントを表示するWebページの実装はリスト6の通りです。

[リスト6]JavaScriptオブジェクトをコンポーネントのプロパティに利用するWebページ(p003-property-object/pages/index.vue)
<template>
  <div class="container">
    <h1>オブジェクトをそのまま設定</h1><!--(1)-->
    <Smartphone1 v-bind:spec="phoneSpec"/>
    <h1>オブジェクトのプロパティを設定</h1><!--(2)-->
    <Smartphone2 v-bind="phoneSpec"/>
  </div>
</template>
<script>
import Smartphone1 from '~/components/Smartphone1'
import Smartphone2 from '~/components/Smartphone2'
export default {
  components: {
    Smartphone1,
    Smartphone2
  },
  data() {
    return {
      phoneSpec: { // コンポーネントに設定するJavaScriptオブジェクト...(3)
        id: 1,
        vendor: 'Samsung',
        name: 'Galaxy Note10+ 5G',
        price: 111000,
        is5G: true
      }
    }
  }
}
</script>

 コンポーネントに設定するJavaScriptオブジェクトは、(3)のphoneSpec変数です。このJavaScriptオブジェクトを、Smartphone1、Smartphone2の2種類のコンポーネントに設定して画面表示させます。

 (1)では、「v-bind:spec="phoneSpec"」記述で、phoneSpec変数のJavaScriptオブジェクトを、Smartphone1コンポーネントのspecプロパティに設定します。Smartphone1コンポーネントでは、リスト7の通りpropsを設定して、specプロパティでJavaScriptオブジェクトを受け取り、内容を画面に表示します。

[リスト7]Smartphone1コンポーネントのプロパティ設定(p003-property-object/components/Smartphone1.vue)
props: ['spec']

 一方、(2)の通り「v-bind="phoneSpec"」と、プロパティ名なしでv-bindディレクティブを記述すると、JavaScriptオブジェクトの各プロパティを、コンポーネントの同名プロパティにそれぞれ設定します。Smartphone2コンポーネントのprops設定がリスト8の場合、phoneSpec.idプロパティがコンポーネントのidプロパティに、phoneSpec.vendorがコンポーネントのvendorプロパティに、それぞれ渡されます。name以降のプロパティも同様です。

[リスト8]Smartphone2コンポーネントのプロパティ設定(p003-property-object/components/Smartphone2.vue)
props: ['id', 'vendor', 'name', 'price', 'is5G']

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

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

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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー