這次寫的內容是之前都沒使用過的,所以就盡量讓自己有概念,希望之後能使用到。
使用 v-bind:is
來切換模組
切換模組的基本語法
1
| <component :is="currentComponent"></component>
|
currentComponent
是用來決定目前使用的模組是哪一個。
透過全域註冊來設定模組
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <button v-for="tab of tabs" :key="tab" @click="currentTabComponent = tab">{{ tab }}</button> <component :is="currentTabComponent"></component> <script> Vue.component('home',{ template:`<div>I am home!</div>` }) Vue.component('shop',{ template:`<div>I am shop!</div>` }) Vue.component('rate',{ template:`<div>I am rate!</div>` }) const vm = new Vue({ el:'#vm', data:{ tabs:['home','shop','rate'], currentTabComponent:'home' } }) </script>
|
在 data
中設定的 currentTabComponent
為當前欲顯示的模組, currentTabComponent
值為模組名,並透過 <component :is="currentTabComponent"></component>
中的 Attribute is
綁定 currentTabComponent
,指定顯示的模組內容。
透過在 data
設定物件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <button v-for="tab of tabs" :key="tab.name" @click="currentTabComponent = tab">{{ tab.name }}</button> <component :is="currentTabComponent"></component> <script> const tabs = [{ name: 'home', template: `<div>I am home!</div>` }, { name: 'shop', template: `<div>I am shop!</div>` }, { name: 'rate', template: `<div>I am rate!</div>` }]
const vm = new Vue({ el:'#vm', data:{ tabs: tabs, currentTabComponent: tabs[0] } }) </script>
|
透過物件處理模組的資料(如模組名及模板),並且 currentTabComponent
的值為模組資料,而非模組名。
使用 <keep-alive>
建立動態模組緩存
在一般情況下,Vue 是透過建立新的模組,來執行模組的切換(動態模組),但這樣一來,當我們在 A 模組點選或寫下東西後,切換到 B 模組,在執行別的事情後,再返回 A 模組,會發現原本在 A 模組點選或寫下的東西都會消失(回復成初始的模組狀態)。
這樣的情況可以透過 <keep-alive>
來解決, <keep-alive>
主要是用來將沒使用到的模組緩存起來(就是將模組最後一次出現的狀態儲存起來),也因此在切換的過程中,模組的狀態不會因為切換而消失。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| <button v-for="tab of tabsC" :key="tab" @click="keepAliveComponent=tab">{{tab}}</button>
<keep-alive> <component :is="keepAliveComponent"></component> </keep-alive> <script> Vue.component("A", { template: `<div>I am A!</div>` }); Vue.component("B", { template: `<div>I am B!</div>` }); Vue.component("C", { template: `<div>I am C!</div>` });
Vue.component("posts", { template: `<div> <button v-for="title of titles" :key="title" @click="currentPostComponent=title">{{title}}</button> <component :is="currentPostComponent"></component> </div>`, data() { return { titles: ["A", "B", "C"], currentPostComponent:'A' }; } });
Vue.component("archives", { template: `<div> <input type="text"> </div>` });
const vm = new Vue({ el: "#vm", data: { tabs: ["posts", "archives"], keepAliveComponent: "posts" } }); </script>
|
<keep-alive>
屬性 include
及 exclude
v-bind:include="/reg/"
:值為正規表達式,只有符合該值的模組才能被緩存。
include="string"
:值為字符串,只有符合該值的模組才能被緩存。
v-bind:exclude="/reg/"
:值為字符串或正規表達式,只有不符合該值的模組才能被緩存。
exclude="string"
:值為字符串或正規表達式,只有不符合該值的模組才能被緩存。
提醒:如果值為字符串的話,就不需使用 v-bind
來綁定了!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| <button v-for="tab of tabsC" :key="tab" @click="keepAliveComponent=tab">{{tab}}</button>
<keep-alive :include="posts"> <component :is="keepAliveComponent"></component> </keep-alive> <script> Vue.component("A", { template: `<div>I am A!</div>` }); Vue.component("B", { template: `<div>I am B!</div>` }); Vue.component("C", { template: `<div>I am C!</div>` });
Vue.component("posts", { template: `<div> <button v-for="title of titles" :key="title" @click="currentPostComponent=title">{{title}}</button> <component :is="currentPostComponent"></component> </div>`, data() { return { titles: ["A", "B", "C"], currentPostComponent:'A' }; } });
Vue.component("archives", { template: `<div> <input type="text"> </div>` });
const vm = new Vue({ el: "#vm", data: { tabs: ["posts", "archives"], keepAliveComponent: "posts" } }); </script>
|
因為對於異步模組的部分研究的還不夠,看起來還可以加上 webpack 的使用,但對於 webpack 的研究也還不夠,所以這一塊就先不寫出來了!
Demo:
See the Pen
DAY15 | 跟 Vue.js 認識的30天 - Vue 動態模組(Dynamic Components) by Celeste6666 (@celeste6666)
on CodePen.
參考資料:
Vue.js - 动态组件 & 异步组件
Vue.js -keep-alive