#はじめに
Vue.jsを最近勉強し始めたので学んだ文法などを備忘録としてメモしていこうと思います。
今回の記事では動的コンポーネント
を用いてコンポーネントを入れかえる方法を記載します。
##componentタグを利用する
動的にコンポーネントを入れかえる場合はcomponent
タグを用いると便利です。
記法は以下の通りでis
という属性を用いて任意のコンポーネントを指定します。
<template>
<component v-bind:is="任意のコンポーネント名"></component>
</template>
###注意点
しかしながらコンポーネントを入れかえた際に切り替わる前のデータは消えてしまうため、フォームに使用するタグinput
やtextarea
等を利用する場合にはkeep-alive
コンポーネントを用いる必要があります。
<template>
<keep-alive>
<component v-bind:is="任意のコンポーネント名"></component>
</keep-alive>
</template>
###ライフサイクルフック
上記で記載したkeep-alive
コンポーネントで囲んだコンポーネントではactivated
とdeactivated
というライフサイクルフックが呼び出されます。
activated
は対象のコンポーネントがアクティブになったときに動き、deactivated
は対象のコンポーネントが非アクティブになったときに動きます。
##以上を用いてサンプルを作ってみる
以上をふまえて、それらを利用した簡単なサンプルを作ってみます。
今回は「おはようボタン」「こんにちはボタン」を作り、それらのボタンを押すとそれぞれのコンポーネントが出力されるという感じにしたいと思います。
ライフサイクルフックの動きも見ておきたかったので、「こんにちはコンポーネント」がアクティブになった場合と非アクティブになった場合にアラートが呼び出されるようにしてみました。
<template>
<div>
<button @click="greetComponent = 'Morning'">おはようコンポーネント</button>
<button @click="greetComponent = 'Afternoon'">こんにちはコンポーネント</button>
<keep-alive>
<component v-bind:is="greetComponent"></component>
</keep-alive>
</div>
</template>
<script>
import Morning from "./components/Morning.vue";
import Afternoon from "./components/Afternoon.vue";
export default {
data() {
return {
greetComponent: "Morning",
};
},
components: {
Morning,
Afternoon,
},
};
</script>
<template>
<div>おはよう!</div>
</template>
<template>
<div>こんにちは!</div>
</template>
<script>
export default {
activated() {
alert("こんにちはコンポーネントが開きました!");
},
deactivated() {
alert("こんにちはコンポーネントが閉じました。");
},
};
</script>
##結果
デフォルトはおはようコンポーネント
が出力されるようにしています。
「こんにちはコンポーネント」ボタンをクリックするとライフサイクルフックのactivated
が呼び出されていることが分かります。
アラートを閉じた後、コンポーネントがこんにちはコンポーネント
に変更されていることが分かります。
次に「おはようコンポーネント」ボタンをクリックするとライフサイクルフックのdeactivated
が呼び出されていることが分かります。
アラートを閉じた後、コンポーネントがおはようコンポーネント
に変更されていることが分かります。
#おわりに
今回は動的にコンポーネントを入れかえる方法を学びました。
これがSPAを作る上での基礎なのかな・・・と思ったり。
だいぶ楽しいフィールドへ入ってきた感じがするので引き続きしっかり学んでいこうと思います!