プログラミングライフスタイル

「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>

のようになります。このプログラムを実行すると、

→グローバルミックスイン

のようになります。

ただし、「グローバルミックスイン」は影響が大きいため、利用する場合は注意が必要です。

ここまで「ミックスイン」について学んできましたが、「便利」な側面もある一方「ミックスイン」を増やし過ぎると管理が大変になるかもしれません。

→(前へ)「Vue.js」の「Vue Router」について学ぶ

→(次へ)「Vue.js」の「カスタムディレクティブ」について学ぶ

HOMEへ