Vue3动态组件和defineAsyncComponent异步组件

此时我们点击上方三个按钮,下面内容需要与之对应切换对应的组件。

1、最简单的方式是通过v-if来判断,从而显示不同的组件。 

//App.vue
<template>
  <div>
    <button v-for="item in tabs" :key="item"
            @click="itemClick(item)"
            :class="{active: currentTab === item}">
      {{item}}
    </button>

    <!-- 1.v-if的判断实现 -->
    <template v-if="currentTab === 'home'">
      <home></home>
    </template>
    <template v-else-if="currentTab === 'about'">
      <about></about>
    </template>
    <template v-else>
      <category></category>
    </template>
  </div>
</template>

<script>
  import Home from './pages/Home.vue';
  import About from './pages/About.vue';
  import Category from './pages/Category.vue';

  export default {
    components: {
      Home,
      About,
      Category
    },
    data() {
      return {
        tabs: ["home", "about", "category"],
        currentTab: "home"
      }
    },
    methods: {
      itemClick(item) {
        this.currentTab = item;
      },
    }
  }
</script>

<style scoped>
  .active {
    color: red;
  }
</style>

2、通过动态组件的方式

动态组件是使用component组件,通过一个特殊的attribute is来实现:

//App.vue
<template>
  <div>
    <button v-for="item in tabs" :key="item"
            @click="itemClick(item)"
            :class="{active: currentTab === item}">
      {{item}}
    </button>

    <!-- 2.动态组件 -->
    component :is="currentTab"</component>
</template>

currentTab === item动态的选择点击的组件名称,然后:is="currentTab"动态切换到对应组件。如果我们需要给动态组件传参和监听事件,我们需要将属性和监听事件放到component上来使用。

<component :is="currentTab"
                 name="pp"
                 :age="18"
                 @pageClick="pageClick">
</component>

动态组件这样写完之后就能实现点击按钮跳转对应组件的事件,但是开发时,我们通常会在跳转到这个组件之后用户对组件内部做了一些更改,并且希望是默认保存:即切换了别的组件又切换回来时这个改过的数据依旧存在。这样我们就可以通过keep-alive属性来实现:

例如:对About组件增加一个点击按钮,点击可以递增。

//About.vue
<template>
  <div>
    About组件
    <button @click="counter++">{{counter}}</button>
  </div>
</template>

<script>
  export default {
    name: "about",  
    data() {
      return {
        counter: 0
      }
    },
  }
</script>
<style scoped></style>

此时我们将数字点击到10,切换到home组件后,about组件就会被销毁,再次点击about组件切换回来时会重新创建组件,即之前点到10的about组件不会被保存,重新变成了0. 

在开发中某些情况我们希望继续保持组件的状态,而不是销毁掉,这个时候我们就可以 使用一个内置组件: keep-alive
//App.vue
<keep-alive include="home,about">
      <component :is="currentTab"
                 name="pp"
                 :age="18"
                 @pageClick="pageClick">
      </component>
</keep-alive>
keep-alive有一些属性:
include: 只有名称匹配的组件会被缓 存;
exclude:任何名称匹配的组件都不会被缓存;
max: 最多可以缓存多少组件实例,一旦达 到这个数字,那么缓存组件中最近没有被访问的实例会被销毁;
对于缓存的组件来说,再次进入时,我们是 不会执行created或者mounted等生命周期函数 的:
      但是有时候我们确实希望监听到何时重新进入到了组件,何时离开了组件;
      这个时候我们可以使用 activated 和 deactivated 这两个生命周期钩子函数来监听;
//About.vue
<script>
  export default {
    name: "about",  
    data() {
      return {
        counter: 0
      }
    },
    created() {
      console.log("about created");
    },
    unmounted() {
      console.log("about unmounted");
    },
    activated() {
      console.log("about activated");
    },
    deactivated() {
      console.log("about deactivated");
    }
  }
</script>
Vue中实现异步组件
如果我们的项目过大了,对于 某些组件 我们希望 通过异步的方式来进行加载 (目的是可以对其进行分包处理),那么Vue中给我们提供了一个函数:defineAsyncComponent
defineAsyncComponent接受两种类型的参数:
类型一:工厂函数,该工厂函数返回一个Promise对象:
<template>
  <div>
    App组件
    <async-category></async-category>
  </div>
</template>

<script>
  import { defineAsyncComponent } from 'vue';
  const AsyncCategory = defineAsyncComponent(() => import("./AsyncCategory.vue"))
  export default {
    components: {
      AsyncCategory,
    }
  }
</script>
<style scoped></style>

类型二:接受一个对象类型,对异步函数进行配置:

<script>
  import { defineAsyncComponent } from 'vue';  

  import Loading from './Loading.vue';
  const AsyncCategory = defineAsyncComponent({
    loader: () => import("./AsyncCategory.vue"),
    //加载过程中显示的组件
    loadingComponent: Loading,
    //加载失败时显示的组件
    // errorComponent:Error,
    // 在显示loadingComponent组件之前, 等待多长时间
    delay: 2000,
    //定义组件是否可挂起|默认值:true
    suspensible:true
    /**
     * err: 错误信息,
     * retry: 函数, 调用retry尝试重新加载
     * attempts: 记录尝试的次数
     */
    onError: function(err, retry, attempts) {

    }
  })
</script>
异步组件和Suspense

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3中,异步组件可以使用defineAsyncComponent函数进行定义。它会返回一个组件对象,可以在需要时进行动态加载。而Suspense组件则是用于处理异步组件加载时的“等待”状态,它可以显示一个自定义的“等待中”组件,直到异步组件加载完成并渲染出来。 具体来说,在使用defineAsyncComponent定义异步组件时,可以在组件选项中添加loading选项,用于指定Suspense组件中的“等待中”组件。这样,在异步组件加载完成前,Suspense组件会显示loading选项指定的组件,等异步组件加载完成后,再渲染出异步组件。 举个例子,假设我们有一个异步组件如下: ```vue <template> <div>异步组件内容</div> </template> <script> export default { name: 'AsyncComponent', // ... 异步加载组件 } </script> ``` 我们可以使用defineAsyncComponent函数来定义它,并添加loading选项: ```js import { defineAsyncComponent } from 'vue' const AsyncComponent = defineAsyncComponent({ name: 'AsyncComponent', loader: () => import('./AsyncComponent.vue'), loading: { template: '<div>加载中...</div>' } }) ``` 然后,在需要使用异步组件的地方,我们可以用Suspense组件包裹: ```vue <template> <Suspense> <template #default> <AsyncComponent /> </template> <template #fallback> <div>等待中...</div> </template> </Suspense> </template> ``` 这样,在异步组件加载完成前,Suspense组件会显示loading选项中的内容;加载完成后,就会渲染出异步组件的内容。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值