首页 > 其他分享 >【vue3入门】-【22】 动态组件&组件保持存活&异步组件

【vue3入门】-【22】 动态组件&组件保持存活&异步组件

时间:2024-05-14 22:52:04浏览次数:28  
标签:tabComponent vue ComponentA 22 ComponentB components vue3 组件

动态组件

有些场景下会需要在两个组件之间来回切换,比如tab页面

App.vue

<template>

  <!--组件标签-->
  <component :is="tabComponent"></component>
  <button @click="changeHandle">切换组件</button>
</template>
<script>
import ComponentA from "./components/ComponentA.vue";
import ComponentB from "./components/ComponentB.vue";
export default {
  data() {
    return {
      tabComponent:"ComponentB" // 不是字符串时console会有告警
    }
  },
  components:{
    ComponentA,
    ComponentB
  },
  methods:{
    changeHandle(){

      // 如果后面的this.tabComponent的值等于ComponentA,则将ComponentB赋给前面的this.tabComponent
      // === 是严格相等,包括类型和值, == 是非严格的相等,通常用在不同类型的值对比
      // this.tabComponent = this.tabComponent=="ComponentA" ?"ComponentB":"ComponentA"
      // 上面的表达式等价于:
      if(this.tabComponent=="ComponentA"){
        this.tabComponent="ComponentB"
      }else{
        this.tabComponent="ComponentA"
      }
    }
  }
}
</script>

ComponentA.vue

<template>
    <h3>ComponentA</h3>
</template>

ComponentB.vue

<template>
    <h3>ComponentB</h3>
</template>

组件保持存活

当使用<component :is="...">来在多个组件间切换时,被切换掉的组件会被“卸载”。我们可以通过<keep-alive>组件强制被切换掉的组件仍然保持“存活状态”

涉及到组件生命周期中的beforUnmounted unmounted

App.vue

<template>

  <!--组件标签-->
  <!--在切换组件后会进入组件卸载的生命周期,原组件的更新信息不会被保存,再次切换时会看见原始的数据-->
  <!-- <component :is="tabComponent"></component> -->

  <!--放在keep-alive中后,则不会进入组件卸载的生命周期,原组件的更新信息会被保存,再次切换时会看见更新过的数据-->
  <keep-alive>
    <component :is="tabComponent"></component>
  </keep-alive>
  
  <button @click="changeHandle">切换组件</button>
</template>
<script>
import ComponentA from "./components/ComponentA.vue";
import ComponentB from "./components/ComponentB.vue";

export default {
  data() {
    return {
      tabComponent:"ComponentB"
    }
  },
  components:{
    ComponentA,
    ComponentB
  },
  methods:{
    changeHandle(){

      // 如果后面的this.tabComponent的值等于ComponentA,则将ComponentB赋给前面的this.tabComponent
      // === 是严格相等,包括类型和值, == 是非严格的相等,通常用在不同类型的值对比
      // this.tabComponent = this.tabComponent=="ComponentA" ?"ComponentB":"ComponentA"
      // 上面的表达式等价于:
      if(this.tabComponent=="ComponentA"){
        this.tabComponent="ComponentB"
      }else{
        this.tabComponent="ComponentA"
      }
    }
  }
}
</script>

ComponentA.vue

<template>
    <h3>ComponentA</h3>
    <p>{{ message }}</p>
    <button @click="updateHandle">更新数据</button>
</template>
<script>

export default{
    data(){
        return{
            message:"更新前的数据"
        }
    },
    methods:{
        updateHandle(){
            this.message="更新后的数据"
        }
    },
    beforeUnmount(){
        console.log("组件被卸载前");
    },
    unmounted(){
        console.log("组件被卸载后");
    }
}
</script>

异步组件

在大型项目中,我们可能需要拆分应用为更小的块,并仅在需要时再从服务器加载相关的组件。vue提供了defineAsyncComponent方法来实现

App.vue

<template>

  <!--组件标签-->
  <!--在切换组件后会进入组件卸载的生命周期,原组件的更新信息不会被保存,再次切换时会看见原始的数据-->
  <!-- <component :is="tabComponent"></component> -->

  <!--放在keep-alive中后,则不会进入组件卸载的生命周期,原组件的更新信息会被保存,再次切换时会看见更新过的数据-->
  <keep-alive>
    <component :is="tabComponent"></component>
  </keep-alive>

  <button @click="changeHandle">切换组件</button>
</template>
<script>
import { defineAsyncComponent } from "vue";
import ComponentA from "./components/ComponentA.vue";
// import ComponentB from "./components/ComponentB.vue";

// 异步加载组件
// 需要手动从vue中引入异步方法defineAsyncComponent,实现在需要ComponentB组件的时候再去请求相关资源
const ComponentB=defineAsyncComponent(()=>
  import("./components/ComponentB.vue")
)

export default {
  data() {
    return {
      tabComponent:"ComponentA"
    }
  },
  components:{
    ComponentA,
    ComponentB
  },
  methods:{
    changeHandle(){

      // 如果后面的this.tabComponent的值等于ComponentA,则将ComponentB赋给前面的this.tabComponent
      // === 是严格相等,包括类型和值, == 是非严格的相等,通常用在不同类型的值对比
      // this.tabComponent = this.tabComponent=="ComponentA" ?"ComponentB":"ComponentA"
      // 上面的表达式等价于:
      if(this.tabComponent=="ComponentA"){
        this.tabComponent="ComponentB"
      }else{
        this.tabComponent="ComponentA"
      }
    }
  }
}
</script>

以上内容出自
【【2023最新版】Vue3从入门到精通,零基础小白也能听得懂,写得出,web前端快速入门教程】 https://www.bilibili.com/video/BV1Rs4y127j8/?share_source=copy_web&vd_source=94c3d5330a46438059359e8dd2494fe9

标签:tabComponent,vue,ComponentA,22,ComponentB,components,vue3,组件
From: https://www.cnblogs.com/T-Ajie/p/18192456

相关文章

  • 广东各高校2023/2022/2021近三年录取分数线(excel文件下载)
    为了帮助考生更好地进行志愿填报,更好的对数据筛选,故整理广东各高校2023/2022/2021三年录取分数excel文件,部分数据及文件见下图,数据根据历年录取分数线汇总,仅供参考,详细请登陆各高校网站查询。如有需要,可根据步骤下载文件:文件列表及数据如下图所示,真实有效。关注上述公众......
  • 鸿蒙HarmonyOS实战-Stage模型(UIAbility组件)
    ......
  • Vue3 列表渲染以及key值的状态管理 的学习
    列表渲染使用v-for指令来进行一个数组的渲染,基于iteminitems其中item是迭代名,items是源数据的数组且迭代名称也可以自由定义,只需要与后面插值表达式的一致即可v-for也可以支持第二个参数进行位置的索引(item,index)initems还有一个小的注意点in也可以换成of一样的用......
  • P9175 [COCI2022-2023#4] Mreža 题解
    P9175[COCI2022-2023#4]Mreža题解前言我发现,有整体二分与主席树的地方总有莫队(不是那个莫队,是那个莫队)。知识点(树上)倍增,(树上)莫队,树状数组(“树”含量满满),分块。题意分析给定一棵树,每条边有一个权值\(v\),以及可以用一个花费\(c\)将它变成更大的权值\(s\)。再给定一......
  • @react-navigation/native 在组件外使用路由跳转功能
    首先,创建一个NavigationService.js文件来管理导航引用。//NavigationService.jsimport{createNavigationContainerRef}from'@react-navigation/native';exportconstnavigationRef=createNavigationContainerRef();exportfunctionnavigate(name,params){i......
  • vue3 多服务器域名跨域代理和请求配置
    多服务器域名的跨域配置:同样是在vue.config.js文件中对devServer.proxy进行配置,如下:const{defineConfig}=require('@vue/cli-service')module.exports=defineConfig({transpileDependencies:true,lintOnSave:false,//关闭eslint检查,devServer:{......
  • macOS Ventura 13.6.7 (22G720) 正式版发布,ISO、IPSW、PKG 下载
    macOSVentura13.6.7(22G720)正式版发布,ISO、IPSW、PKG下载5月14日凌晨,macOSSonoma14.5发布,同时带来了macOSVentru13.6.7安全更新。macOSVentura13.6及更新版本,如无特殊说明皆为安全更新,不再赘述。请访问原文链接:https://sysin.org/blog/macOS-Ventura/,查看最......
  • macOS Monterey 12.7.5 (21H1222) 正式版发布,ISO、IPSW、PKG 下载
    macOSMonterey12.7.5(21H1222)正式版发布,ISO、IPSW、PKG下载5月13日凌晨,macOSSonoma14.5发布,同时带来了macOSVentru13.6.7和macOSMonterey12.7.5安全更新。本站下载的macOS软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者......
  • macOS Ventura 13.6.7 (22G720) Boot ISO 原版可引导镜像下载
    macOSVentura13.6.7(22G720)BootISO原版可引导镜像下载5月14日凌晨,macOSSonoma14.5发布,同时带来了macOSVentru13.6.7安全更新。macOSVentura13.6及更新版本,如无特殊说明皆为安全更新,不再赘述。本站下载的macOS软件包,既可以拖拽到Applications(应用程序)下......
  • macOS Monterey 12.7.5 (21H1222) Boot ISO 原版可引导镜像下载
    macOSMonterey12.7.5(21H1222)BootISO原版可引导镜像下载5月13日凌晨,macOSSonoma14.5发布,同时带来了macOSVentru13.6.7和macOSMonterey12.7.5安全更新。本站下载的macOS软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在......