「Vue.js」の「ミックスイン」を学ぶ
今回は「Vue.js」の「ミックスイン」について学んでいきたいと思います。
「ミックスイン」は「コンポーネントの共通部分」を抜き出してさまざまな「コンポーネント」で利用できる機能です。
「コンポーネント間」で「共通部分」がある時に活躍してくれそうな機能ですね。
「ミックスイン」の仕組み
「ミックスイン」の仕組みは下図のようになります。
それぞれの「コンポーネント」から「ミックスイン」で定義されたオプションを利用することができます。
プログラムを書いてみると、
<div class="scripts"> <div id="app"> <component-a></component-a> </div> <script> const mixin = { data() { return { common: 'mixin data', } }, } const app = Vue.createApp({}); app.component('component-a', { mixins: [mixin], data: function () { return { name: 'componentA' } }, template: '<button @click="displayData">HOME</button>', methods: { displayData: function () { alert(`${this.common}-${this.name}`); } } }); app.mount('#app'); </script> </div>
のようになります。このプログラムを実行すると、
のようになります。
今回のプログラム作成で気付いたのですが、「Vue2」で利用できていた「Vue.component」は「Vue3」で使えないそうです。
理由は「Vue2」にあった「Vue.component」が「Vue3」で削除されためなんだそうです。
そのため「Vue3」では「Vue.createApp」を使う必要があります。
コンポーネントの「mixins」に「利用するミックスイン」を設定します。
1つのコンポーネントに「複数のミックスイン」を設定することもできます。
例えば、
<div class="scripts"> <div id="app"> <component-a></component-a> </div> <script> const mixin = { data() { return { common: 'mixin data', } }, } const mixin2 = { data() { return { common2: 'mixin2 data', } }, } const app = Vue.createApp({}); app.component('component-a', { mixins: [mixin, mixin2], data: function () { return { name: 'componentA' } }, template: '<button @click="displayData">HOME</button>', methods: { displayData: function () { alert(`${this.common}-${this.common2}-${this.name}`); } } }); app.mount('#app'); </script> </div>
のようになります。このプログラムを実行すると、
のようになります。
コンポーネントの共有
複数のコンポーネントから1つのミックスインを共有して使うこともできます。
例えば、
<div class="scripts"> <div id="app"> <component-a></component-a> <span>|</span> <component-b></component-b> </div> <script> const mixin = { data() { return { common: 'mixin data', } }, } const app = Vue.createApp({}); app.component('component-a', { mixins: [mixin], data: function () { return { name: 'componentA' } }, template: '<button @click="displayData">HOME</button>', methods: { displayData: function () { alert(`${this.common}-${this.common2}-${this.name}`); } } }); app.component('component-b', { mixins: [mixin], data: function () { return { name: 'componentB' } }, template: '<button @click="displayData">HOME2</button>', methods: { displayData: function () { alert(`${this.common}-${this.name}`); } } }); app.mount('#app'); </script> </div>
のようになります。このプログラムを実行すると、
のようになります。
「コンポーネントA」と「コンポーネントB」のどちらも「mixin」を利用していますね。
このように「共通機能」を「ミックスイン」として作成することで、複数のコンポーネントで「ミックスイン」の機能を利用することができます。
グローバルミックスイン
コンポーネントではなく、「グローバル環境」に「ミックスイン」を適用することもできます。
プログラムを作成してみると、
<div id="app"> <my-component></my-component> </div> <script> const myMixin = { created() { console.log('call from myMixin'); } } const app = Vue.createApp({ mixins: [myMixin] }); app.component('my-component', { created() { console.log('call from my-component'); }, template: ` <div> <p>MyComponent</p> </div> ` }); app.mount('#app'); </script>
のようになります。このプログラムを実行すると、
のようになります。
ただし、「グローバルミックスイン」は影響が大きいため、利用する場合は注意が必要です。
ここまで「ミックスイン」について学んできましたが、「便利」な側面もある一方「ミックスイン」を増やし過ぎると管理が大変になるかもしれません。