文章目錄
方式一:局部注冊所需組件 使用緩存 方式二:動態注冊組件實現讓多個組件使用同一個掛載點,并動態切換,這就是動態組件。
通過使用保留的 <component>元素,動態地綁定到它的 is 特性,可以實現動態組件。
方式一:局部注冊所需組件
<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>使用<keep-alive>緩存
<keep-alive> 包裹動態組件時,會緩存不活動的組件實例,而不是銷毀它們。和 <transition>相似,<keep-alive> 是一個抽象組件:它自身不會渲染一個 DOM 元素,也不會出現在父組件鏈中。
基本用法:
<div id="example"> <button @click="change">切換頁面</button> <keep-alive> <component :is="currentView"></component> </keep-alive></div>
條件判斷
如果有多個條件性的子元素,<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>activated 和 deactivated
activated 和 deactivated 在 <keep-alive> 樹內的所有嵌套組件中觸發:
<div id="example"> <button @click="change">切換頁面</button> <keep-alive> <component :is="currentView" @pass-data="getData"></component> </keep-alive> <p>{{msg}}</p></div><script>new Vue({ el: '#example', data:{ index:0, msg:'', arr:[ { template:`<div>我是主頁</div>`, activated(){ this.$emit('pass-data','主頁被添加'); }, deactivated(){ this.$emit('pass-data','主頁被移除'); }, }, {template:`<div>我是提交頁</div>`}, {template:`<div>我是存檔頁</div>`} ], }, computed:{ currentView(){ return this.arr[this.index]; } }, methods:{ change(){ var len = this.arr.length; this.index = (++this.index)% len; }, getData(value){ this.msg = value; setTimeout(()=>{ this.msg = ''; },500) } }})</script>
新聞熱點
疑難解答
圖片精選