VUE组件--动态组件、组件保持存活、异步组件

动态组件

有些场景可能会需要在多个组件之间进行来回切换,在vue中则使用<component :is="..."> 来实现组件间的来回切换

// App.vue
<template>
    <component :is="tabComponent"></component>
    <button @click="changeHandler">切换组件</button>
</template>

<script >
    import Component1 from './components/Component1.vue'
    import Component2 from './components/Component2.vue'
    export default {
        data(){
            return{
                tabComponent:"Component1"
            }
        },
        methods:{
            changeHandler(){
                this.tabComponent = this.tabComponent == "Component1" ? "Component2" : "Component1"
                console.log(this.tabComponent)
            }
        },
        components:{
            Component1,
            Component2
        }
    }
</script>

 changeHandler()使用三目运算符,来实现Component1和Component2之间的相互切换

// Component1.vue
<template>
    <h2>组件1</h2>
</template>
//Component2.vue
<template>
    <h2>组件2</h2>
</template>

 默认为组件1

 

组件保持存活

当组件1切换到组件2时,组件1会被强行销毁

// App.vue
<!--html代码(模块展示 显示在页面上的内容)-->
<template>

    <component :is="tabComponent"></component>

    <button @click="changeHandler">切换组件</button>

</template>

<!--vue代码-->
<script >
    import Component1 from './components/Component1.vue'
    import Component2 from './components/Component2.vue'
    export default {
        data(){
            return{
                tabComponent:"Component1"
            }
        },
        methods:{
            changeHandler(){
                this.tabComponent = this.tabComponent == "Component1" ? "Component2" : "Component1"
                console.log("切换至组件:")
                console.log(this.tabComponent)
            }
        },
        components:{
            Component1,
            Component2
        }
    }
</script>
// Component1.vue
<template>
    <h2>组件1</h2>
    <p>{{ msg }}</p>
    <button @click="updateHandler">更新数据</button>
</template>
<script>
    export default {
        data(){
            return {
                msg: "老数据"
            }
        },
        methods:{
            updateHandler(){
                this.msg = "新数据"
            }
        },
        beforeUnmount() {
            console.log("组件1被销毁前")
        },
        unmounted() {
            console.log("组件1被销毁")
        }
    }
</script>
// Component2.vue
<template>
    <h2>组件2</h2>
</template>
<script>
    export default {
        beforeUnmount() {
            console.log("组件2被销毁前")
        },
        unmounted() {
            console.log("组件2被销毁")
        }
    }
</script>

初始态: 

点击“更新数据”:

点击“切换组件”:

再次点击“切换组件”:

据上面的图可以发现在切换组件的过程中,更改过后的数据又变回老数据,则说明在组件的切换中,发生了组件的销毁及重建,若想要阻止切换组件时组件的销毁发生,可加上<keep-alive> (强制将被切换的组件使之仍然保持存活状态)

//App.vue 中的 template
<template>
    <keep-alive>
    <component :is="tabComponent"></component>
    </keep-alive>
    <button @click="changeHandler">切换组件</button>
</template>

 

 此时,在组件切换的过程中,组件不再被销毁重建


异步组件

当有多个组件存在时,项目的运行时,组件默认会被同步加载

当组件过多时,采用同步加载组件会大大降低运行速度,所以vue提出了异步加载组件的方法:defineAsyncComponent 方法进行实现

 实现组件的切换时,没有出现新的网络请求,则说明组件1和组件2一开始就已经被加载

将组件2的导入方式改为以下形式即可实现异步组件的加载:

// App.vue 中的<script>
import Component1 from './components/Component1.vue'
import {defineAsyncComponent} from "vue"
    const Component2 = defineAsyncComponent( () =>
        import("./components/Component2.vue")
    )

可以发现,此时出现了网络请求,说明Component2已实现了异步加载

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值