vue动态子组件的两种实现方式

2020-06-12 21:15:11易采站长站整理

文章目录

方式一:局部注册所需组件
使用缓存
方式二:动态注册组件实现

让多个组件使用同一个挂载点,并动态切换,这就是动态组件。

通过使用保留的

 <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;
}