Vue入門の第13回(第1回はこちら)です。今回は、コンポーネントにデータを受け渡す際に使用する props について学びます。
index.htmlを書き換える
前回作成したHTMLファイル index.html を以下のように書き換えます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Vueサンプル</title>
<script src="https://unpkg.com/vue"></script>
</head>
<body>
<div id="app">
<item catchcopy="再入荷しました!"></item>
<item></item>
<item></item>
</div>
<script src="main.js"></script>
</body>
</html>
前回は、 <item></item>というタグを3つ記述して、 3つのitemコンポーネントを作成しました。
今回の書き換えでは、そのうちのひとつにcatchcopy=”再入荷しました!”というカスタム属性を指定しています。
このカスタム属性 catchcopy の値を、itemコンポーネントにpropsとして受け渡します。
main.jsを書き換える
前回作成したJSファイルmain.jsを以下のように書き換えます。
Vue.component('item', {
props: {
catchcopy: {
type: String,
default: '定番商品'
}
},
template: `
<div class="item">
<div class="item-image">
<img v-bind:src="itemImage" />
</div>
<div class="item-info">
<h2>{{ itemFullName }}</h2>
<ul><li v-for="itemInfo in itemInfos">{{ itemInfo }}</li></ul>
<p>※{{ catchcopy }}</p>
<p v-if="zaiko > 2">在庫あり</p>
<p v-else-if="zaiko <= 2 && zaiko > 0">残りわずか!</p>
<p v-else>在庫なし</p>
<div
v-for="itemColor in itemColors"
v-on:click="changeColor(itemColor.cImage, itemColor.cName)"
v-bind:style="{ backgroundColor: itemColor.cCode }"
style="width:30px; height:30px; margin-bottom:20px;"
>
</div>
<button
v-on:click="addCart"
v-bind:disabled="soldout"
>買い物かごの中身を増やす</button>
<div class="cart">
<p>買い物かごの中身 {{ cart }}</p>
</div>
</div>
</div>
`,
data() {
return {
itemName: 'キッズ靴下',
itemColorName: 'ピンク',
itemImage: './images/socks-pink.png',
itemInfos: ["子供向け靴下", "コットン100%", "人気商品!"],
itemColors: [
{cName:"ピンク", cCode:"#ee6699", cImage:"./images/socks-pink.png"},
{cName:"ブルー", cCode:"#33aaee", cImage:"./images/socks-blue.png"}
],
zaiko: 5,
cart: 0,
soldout: false
}
},
methods: {
addCart: function () {
this.cart += 1
this.zaiko -= 1
if (this.zaiko <= 0) {this.soldout = true}
},
changeColor (cImage, cName) {
this.itemImage = cImage,
this.itemColorName = cName
}
},
computed: {
itemFullName() {
return this.itemName + '(' + this.itemColorName + ')'
}
}
})
var app = new Vue({
el: '#app'
})
このmain.jsの書き換えでは、propsプロパティ、つまりprops: { ~ }と記述した部分が追加されています。
また、templateプロパティのなかに <p>※{{ catchcopy }}</p> の一行が追加されています。それ以外は、前回と同じです。
今回の書き換えで追加された propsプロパティの部分に注目してみましょう。
props: {
catchcopy: {
type: String,
default: '定番商品'
}
}
上記のpropsプロパティでは、catchcopyという名前のpropについて、タイプはString型で、初期値は ‘定番商品’ と指定しています。
表示を確認してみる
ここまで出来たら、 index.htmlとmain.jsを上書き保存して表示を確認してみましょう。以下は、今回作成したサンプルページです。
https://programming-world.net/sample/vue_sample/13/index.html
<item catchcopy=”再入荷しました!”></item> と指定したitemコンポーネントで、「※再入荷しました!」というキャッチコピーが表示されれば成功です。
<item></item> とだけ指定した2つのitemコンポーネントでは、特にキャッチコピーは指定していないので、初期値の「定番商品」が表示されているはずです。
まとめ
今回は、 コンポーネントにデータを受け渡す際に使用する props について学びました。
- propsとは、外からコンポーネントにデータを渡す際に利用する変数のことです。
- propsを受け取るコンポーネント側では、 propsプロパティ、つまりprops: { ~ }と記述した部分で、どのようなpropsを利用するのかを指定します。
- propsプロパティでは、利用するpropsについてtype、defaultなどの値を指定できます。
次回へ続きます。