前面的話
讓多個組件使用同一個掛載點,并動態(tài)切換,這就是動態(tài)組件。本文將詳細介紹Vue動態(tài)組件
概述
通過使用保留的 <component> 元素,動態(tài)地綁定到它的 is 特性,可以實現(xiàn)動態(tài)組件
<div id="example"> <button @click="change">切換頁面</button> <component :is="currentView"></component></div><script>var home = {template:'<div>我是主頁</div>'};var post = {template:'<div>我是提交頁</div>'};var archive = {template:'<div>我是存檔頁</div>'};new Vue({ el: '#example', components: { home, post, archive, }, data:{ index:0, arr:['home','post','archive'], }, computed:{ currentView(){ return this.arr[this.index]; } }, methods:{ change(){ this.index = (++this.index)%3; } }})</script>也可以直接綁定到組件對象上
<div id="example"> <button @click="change">切換頁面</button> <component :is="currentView"></component></div><script>new Vue({ el: '#example', data:{ index:0, arr:[ {template:`<div>我是主頁</div>`}, {template:`<div>我是提交頁</div>`}, {template:`<div>我是存檔頁</div>`} ], }, computed:{ currentView(){ return this.arr[this.index]; } }, methods:{ change(){ this.index = (++this.index)%3; } }})</script>緩存
<keep-alive> 包裹動態(tài)組件時,會緩存不活動的組件實例,而不是銷毀它們。和 <transition> 相似,<keep-alive> 是一個抽象組件:它自身不會渲染一個 DOM 元素,也不會出現(xiàn)在父組件鏈中
【基礎(chǔ)用法】
<div id="example"> <button @click="change">切換頁面</button> <keep-alive> <component :is="currentView"></component> </keep-alive></div><script>new Vue({ el: '#example', data:{ index:0, arr:[ {template:`<div>我是主頁</div>`}, {template:`<div>我是提交頁</div>`}, {template:`<div>我是存檔頁</div>`} ], }, computed:{ currentView(){ return this.arr[this.index]; } }, methods:{ change(){ let len = this.arr.length; this.index = (++this.index)% len; } }})</script>【條件判斷】
如果有多個條件性的子元素,<keep-alive> 要求同時只有一個子元素被渲染
<div id="example"> <button @click="change">切換頁面</button> <keep-alive> <home v-if="index===0"></home> <posts v-else-if="index===1"></posts> <archive v-else></archive> </keep-alive></div><script>new Vue({ el: '#example', components:{ home:{template:`<div>我是主頁</div>`}, posts:{template:`<div>我是提交頁</div>`}, archive:{template:`<div>我是存檔頁</div>`}, }, data:{ index:0, }, methods:{ change(){ let len = Object.keys(this.$options.components).length; this.index = (++this.index)%len; } }})</script>
新聞熱點
疑難解答
圖片精選