動的にコンポーネントを切り替える方法
componentタグとv-bind:is を使って切り替えを実装する
切り替えを行いたいコンポーネントをインポートしてcomponentsで定義させる。
import Aloha from "./components/Aloha.vue";
import Hello from "./components/Hello.vue";
// 中略
components: {
CountHeader,
Hello,
Aloha,
}
今回はボタンを設けて、それぞれのボタンが押された時にそれぞれのコンポーネントを表示する仕組みにします。
<button @click="changeComponent = 'Hello'">hello</button> <button @click="changeComponent = 'Aloha'">aloha</button>
クリックイベントの初期値を定義。
export default {
data() {
return {
changeComponent:"Hello"
};
}
// 省略
}
クリックイベントが発生した際に、表示の切り替えをするテンプレートを追記。
ifで書いていくのが一般的ですが、Vueは一行で書くことができます。
ここで登場するのがcomponentタグとv-bind:isです。
v-bind:は「:」に省略可能なため、下記では省略型で書いています。
<component :is="changeComponent"></component>
テンプレートの全体像はこんなかんじ
<button @click="changeComponent = 'Hello'">hello</button> <button @click="changeComponent = 'Aloha'">aloha</button> <component :is="changeComponent"></component>
動的コンポーネントは切り替える度にdestroyされるので、データを残したい場合は、注意が必要。
destroyされる動的コンポーネントを保持する~keep-alive~
データを保持して動的コンポーネントを利用したい場合は、keep-aliveタグでcomponentタグを囲む。
<keep-alive> <component :is="changeComponent"></component> </keep-alive>
切り替えの処理は、 deactivated と activated のライフサイクルフックが走る。
アクティブな時 = activated
切り替えられた時(表示されていない時) = deactivated
export default {
deactivated(){
// 処理を書き込む
},
activated(){
// 処理を書き込む
}
};
