defineAsyncComponent【Vue3】

学习是打开未来的大门,今天的积累,将会为明天的你带来无限可能。

目录

  • 引言
  • 基本语法
  • 异步组件的用法场景
  • [defineAsyncComponent 进阶使用:](#defineAsyncComponent 进阶使用:)
  • [如何与 `<component :is="...">` 配合使用](#如何与 <component :is="..."> 配合使用)
  • [异步组件 VS 直接导入组件](#异步组件 VS 直接导入组件)
  • [异步组件和 `<keep-alive>` 一起使用](#异步组件和 <keep-alive> 一起使用)
  • 总结

引言

defineAsyncComponent 是 Vue3 提供的一个 API,用于定义异步组件,它允许你 按需加载 组件。也就是说,只有当你真正需要该组件时,Vue 才会去加载它,而不是在初始加载时就全部引入。这可以大大减小首屏加载的体积,提升性能。

基本语法

javascript 复制代码
import { defineAsyncComponent } from 'vue';

const AsyncComp = defineAsyncComponent(() => import('./AsyncComponent.vue'));

这会返回一个异步组件对象 AsyncComp,只有在渲染时,Vue 才会加载 AsyncComponent.vue。然后你可以像普通组件一样使用它:

javascript 复制代码
<component :is="AsyncComp" />

异步组件的用法场景

  • 按需加载:只有当用户需要某个特定功能时才加载相关的组件。
  • 拆分代码:比如一个页面包含多个较重的部分,可以把它们拆分成不同的异步组件,在用户点击时再加载。
  • 动态内容渲染:基于用户操作、路由切换、权限控制等,动态决定加载哪些组件。

defineAsyncComponent 进阶使用:

除了基本的动态加载,你还可以给异步组件添加一些额外的配置,处理加载状态、错误状态等。

javascript 复制代码
const AsyncComp = defineAsyncComponent({
  loader: () => import('./HeavyComponent.vue'),    // 异步加载
  loadingComponent: Loading,                       // 加载中的组件
  errorComponent: ErrorPage,                       // 加载失败时显示的组件
  delay: 200,                                     // 延迟显示加载组件的时间
  timeout: 3000                                   // 超过这个时间会显示错误组件
});

解读属性:

  • loader:加载组件的函数,通常用 import() 来异步加载。
  • loadingComponent:在异步组件加载时显示的占位组件。
  • errorComponent:如果加载失败(例如超时),显示的组件。
  • delay:延迟多久才显示 loadingComponent,避免组件很快就显示加载状态。
  • timeout:加载超时后显示 errorComponent。

如何与 <component :is="..."> 配合使用

使用 <component :is="..."> 动态渲染多个组件,可以将异步组件作为其中的一部分:

javascript 复制代码
<script setup lang="ts">
import { defineAsyncComponent } from 'vue';

const AsyncTextComp = defineAsyncComponent(() => import('./TextComp.vue'));
const AsyncImageComp = defineAsyncComponent(() => import('./ImageComp.vue'));

const currentComp = ref('text');  // 例如根据条件切换
const compMap = {
  text: AsyncTextComp,
  image: AsyncImageComp
};
</script>

<template>
  <component :is="compMap[currentComp]" />
</template>

在这个例子中,AsyncTextComp 和 AsyncImageComp 是异步加载的组件,只有在需要时才会被加载,提升了性能

异步组件 VS 直接导入组件

直接导入组件

typescript 复制代码
import MyComponent from './MyComponent.vue';
  • 加载方式:当使用 import 导入组件时,Vue 会在页面加载时将所有的组件一起加载到页面中。
  • 优点
    • 简单:用法简单直接,组件在页面加载时就可用。
    • 即时可用:组件在首次渲染时就已经加载并准备好使用,适用于较小的应用或者不需要优化加载时间的场景。
  • 缺点
    • 较大的初始加载:如果应用中有很多组件或者组件很重,初始加载时会把所有的组件都加载进来,这会增加页面的加载时间和内存消耗。
    • 性能开销:一开始就加载所有组件,可能会影响首屏渲染速度。

异步组件

typescript 复制代码
const AsyncComponent = defineAsyncComponent(() => import('./MyComponent.vue'));
  • 加载方式 :异步组件通过动态 import() 来加载组件。只有在需要显示该组件时,Vue 才会去加载它。这样可以大大减少初始加载的体积,提升页面加载速度。
  • 优点
    • 按需加载:只有在需要使用某个组件时才加载它,减少初始页面的资源加载量,提升性能。
    • 代码分割:适用于大型应用,可以将应用拆分成多个小的代码块,按需加载,提高页面响应速度。
  • 缺点
    • 首次显示延迟:如果组件是首次加载,会有一个小的延迟,因为需要从网络加载该组件。
    • 加载失败处理:需要添加处理异步加载失败、加载中的组件等机制,增加了代码复杂性。

异步组件和 <keep-alive> 一起使用

typescript 复制代码
<template>
  <div>
    <button @click="currentComp = 'TextComponent'">Text</button>
    <button @click="currentComp = 'ImageComponent'">Image</button>
    
    <keep-alive>
      <component :is="currentComp" />
    </keep-alive>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const currentComp = ref('TextComponent');

const TextComponent = defineAsyncComponent(() => import('./TextComponent.vue'));
const ImageComponent = defineAsyncComponent(() => import('./ImageComponent.vue'));
</script>

总结

defineAsyncComponent 是一个 Vue3 中用来按需加载组件的工具,它通过动态导入(import())的方式,能有效地拆分代码和减少首屏加载的体积。我们可以配合 loadingComponenterrorComponent 等属性处理加载中的体验和错误状态,非常适用于大型应用和需要按需加载的场景。

需要时,只需要简单地使用 defineAsyncComponent 来包装组件加载,并将其用于 Vue 中的任何地方,就可以实现高效的组件懒加载。

相关推荐
AC赳赳老秦19 分钟前
DeepSeek教育科技应用:智能生成个性化学习规划与知识点拆解教程
前端·网络·数据库·人工智能·学习·matplotlib·deepseek
计算机毕设VX:Fegn08955 小时前
计算机毕业设计|基于springboot + vue在线考试系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
布列瑟农的星空8 小时前
Playwright使用体验
前端·单元测试
卤代烃8 小时前
🦾 可为与不可为:CDP 视角下的 Browser 控制边界
前端·人工智能·浏览器
_XU9 小时前
AI工具如何重塑我的开发日常
前端·人工智能·深度学习
C_心欲无痕9 小时前
vue3 - defineExpose暴露给父组件属性和方法
前端·javascript·vue.js·vue3
鹿人戛9 小时前
HarmonyOS应用开发:相机预览花屏问题解决案例
android·前端·harmonyos
萌萌哒草头将军9 小时前
绿联云 NAS 安装 AudioDock 详细教程
前端·docker·容器
计算机毕设VX:Fegn08959 小时前
计算机毕业设计|基于springboot + vue宠物医院管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
贺今宵10 小时前
安装better-sqlite3报错electron-vite
javascript·sql·sqlite·sqlite3