Vueは、ひとつのインスタンスにつき、ひとつのテンプレートにしか適用されない仕様です。
インスタンスを再利用するときは、コンポーネントを使用します。
コンポーネント登録の方法
グローバル登録とローカル登録があります。
グローバル登録
グローバル登録は、全てのルートVueインスタンスのテンプレート内で使用ができます。
Vue.component()で呼び出し、第1引数にコンポーネント名、第2引数にオブジェクトを入れる。
第1引数のコンポーネント名には、HTMLタグとの衝突を避けるため、命名ルールに従う。
Vue.component('第1引数 コンポーネント名', {第2引数 オブジェクト})
componentでdataを用いる際は、関数(function)を使わなければならない。returnで値を返す。
<dataがなぜ関数にする必要があるかのメモ>
オブジェクトにした場合、ひとつのメモリを参照してしまうため、他のコンポーネントにも影響を及ぼす。
関数を使う事で、それぞれのコンポーネントのメモリーを別々に置き、他のコンポーネントへの影響を防ぐ。
Vue.component('component-1', { data:function(){ return { number:100 } }, template: '<p>{{number}}</p>' })
テンプレート(HTML)上には、コンポーネント名 <component-1></component-1> を使って表示させる。
<div id="app"> <component-1></component-1> <component-1></component-1> <component-1></component-1> <component-1></component-1> </div>
ローカル登録
特定のVueインスタンスのみにコンポーネント使う場合、ローカル登録を用いる。
コンポーネントを変数に格納する。
var component = { data: function () { return { number: 0 } }, template: '<p>{{number}}<button @click="count">up</button></p>', methods: { count: function () { this.number += 1; } } }
変数に格納したコンポーネントを使いたいインスタンス上で呼び出す。
new Vue({ el: '#app2', components: { 'component-1': component } })
components のオブジェクト内は、下記のように定義する。
‘コンポーネント名’:呼び出したいコンポーネント名
‘component-1’: component
単一ファイルコンポーネント
テンプレート(HTML)、CSS、Vueをひとつのパーツにまとめ、.vueというファイルで扱う方法。
Count.vueファイルの作成。
<template> <div> <p>ただいまのカウント:({{number}})</p> <button @click="count">カウンター</button> </div> </template> <script> export default { data() { return { number: 0 }; }, methods:{ count(){ this.number += 1; } } }; </script>
main.js上で先ほど作成したCount.vueファイルをimportをする。
import Count from './Count.vue'
同じくmain.jsでコンポーネントをグローバル登録する。
Vue.component('Count',Count);
App.vue上で、コンポーネントを呼び出し。
<template> <Count></Count> </template>
単一ファイルコンポーネントをローカル登録する
main.jsでimportしなくともApp.vueで使用できるようにする。
今回は、「CountHeader.vue」ファイルを作成済み。
App.vue上でimportをする。
<template> <div> <CountHeader></CountHeader> <Count></Count> </div> </template> <script> import CountHeader from "./CountHeader.vue"; export default { components: { CountHeader } }; </script>
コンポーネントの命名規則
ケバブケースかパスカルケースにする。
どちらを使用してもいいが、統一した方が良い。
ブラウザーは大文字と小文字の区別がつけられないため、DOMテンプレート(※1)ではケバブケースが推奨される。
※1:htmlに直接書き込む場合。VueCLIを使用している場合は問題なし。
ケバブケース
単語の間に「-」ハイフンを用いる書き方。
count-header
パスカルケース
単語の一文字目を大文字にした書き方。
CouontHeader
コンポーネントにcssを追加する
対象のコンポーネントのみにstyleを適用したい場合、styleタグの中にscopedを追加する。
<style scoped> div { background: blue; } </style>
scopedを追加する事によって、CSSに属性指定を持たせる事ができる。