组件(6):动态组件

组件的动态切换

父组件可以通过<component></component>元素,在其特性is上绑定一个属性,该属性的值表示了一个子组件,可以是一个对象,或字符串(子组件名称)。

页面绑定:<component v-bind:is="currentView">
父组件组件内定义:currentView:"childName|childObj"

这样父组件就可以通过一个方法,在一个挂载点上动态的切换多个子组件的显示。

var external = {
    template: '<div>refer external object </div>'
}
new Vue({
    el: '#app-1',
    data: {
        currentView: external
    },
    methods: {
        switchCpt: function(){
            var arr = [external,'home','posts','archive']
            var index = arr.indexOf(this.currentView)
            if(index < 4){
                this.currentView = arr[index+1]
            }else{
                this.currentView = arr[0]
            }
        }
    },
    components: {
        home: {
            template: '<div>component home</div>'
        },
        posts: {
            template: '<div>component posts</div>'
        },
        archive: {
            template: '<div>component archive</div>'
        }
    }
})
<div id="app-1">
    <button @click="switchCpt">动态切换</button>
    <component v-bind:is="currentView"></component>
    <div>内存中保留的组件个数:{{$children.length}}</div>
</div>

clipboard.png

点击按钮,在不同的子组件之间切换显示。
可以发现,使用$children属性观察可用组件个数时始终不超过1,这是因为每次切换,旧的组件将被直接移除,下次切换时要重新渲染。如果要在内存中保留所有组件,需要使用keep-alive元素。

keep-alive

如果把切换出去的组件保留在内存中,可以保留它的状态或避免重新渲染,为此就需要使用keep-alive
javascript代码不变,修改html,使用<keep-alive></keep-alive>包围组件。

<div id="app-2">
    <button @click="switchCpt" class="btn-primary">动态切换</button>
    <keep-alive>
        <component v-bind:is="currentView"></component>
    </keep-alive>
    <div>内存中保留的组件个数:{{$children.length}}</div>
</div>

clipboard.png

结果是渲染过的组件都被保留了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值