首页 > 其他分享 >第二十二篇 vue - 深入组件 - 异步组件 - defineAsyncComponent

第二十二篇 vue - 深入组件 - 异步组件 - defineAsyncComponent

时间:2023-04-01 11:59:55浏览次数:47  
标签:vue defineAsyncComponent Promise 组件 import 加载

基本用法 defineAsyncComponent

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

import { defineAsyncComponent } from 'vue'

const AsyncComp = defineAsyncComponent(() => {
  return new Promise((resolve, reject) => {
    // ...从服务器获取组件
    resolve(/* 获取到的组件 */)
  })
})

// ... 像使用其他一般组件一样使用 `AsyncComp`


defineAsyncComponent 方法接收一个返回 Promise 的加载函数。这个 Promise 的 resolve 回调方法应该在从服务器获得组件定义时调用。你也可以调用 reject(reason) 表明加载失败

ES 模块动态导入也会返回一个 Promise,所以多数情况下我们会将它和 defineAsyncComponent 搭配使用

类似 Vite 和 Webpack 这样的构建工具也支持此语法 (并且会将它们作为打包时的代码分割点),因此我们也可以用它来导入 Vue 单文件组件

import { defineAsyncComponent } from 'vue'

const AsyncComp = defineAsyncComponent(() =>
  import('./components/MyComponent.vue')
)

也可以在局部注册组件时使用 defineAsyncComponent

<script>
import { defineAsyncComponent } from 'vue'

export default {
  components: {
    AdminPage: defineAsyncComponent(() =>
      import('./components/AdminPageComponent.vue')
    )
  }
}

</script>

<template>
  <AdminPage />
</template>

加载与错误状态

异步操作不可避免地会涉及到加载和错误状态,因此 defineAsyncComponent() 也支持在高级选项中处理这些状态

const AsyncComp = defineAsyncComponent({
  // 加载函数
  loader: () => import('./Foo.vue'),

  // 加载异步组件时使用的组件
  loadingComponent: LoadingComponent,
  // 展示加载组件前的延迟时间,默认为 200ms
  delay: 200,

  // 加载失败后展示的组件
  errorComponent: ErrorComponent,
  
  // 如果提供了一个 timeout 时间限制,并超时了
  // 也会显示这里配置的报错组件,默认值是:Infinity
  timeout: 3000
})

如果提供了一个加载组件,它将在内部组件加载时先行显示。在加载组件显示之前有一个默认的 200ms 延迟——这是因为在网络状况较好时,加载完成得很快,加载组件和最终组件之间的替换太快可能产生闪烁,反而影响用户感受

如果提供了一个报错组件,则它会在加载器函数返回的 Promise 抛错时被渲染。你还可以指定一个超时时间,在请求耗时超过指定时间时也会渲染报错组件

搭配 Suspense 使用

异步组件可以搭配内置的 <Suspense> 组件一起使用

标签:vue,defineAsyncComponent,Promise,组件,import,加载
From: https://www.cnblogs.com/caix-1987/p/17278333.html

相关文章

  • 第二十四篇 vue - 深入组件 - 内置组件 - TransitionGroup
    TransitionGroup<TransitionGroup>是一个内置组件,用于对v-for列表中的元素或组件的插入、移除和顺序改变添加动画效果和的区别<TransitionGroup>支持和<Transition>基本相同的props、CSS过渡class和JavaScript钩子监听器,但有以下几点区别:默认情况下,它不会渲染......
  • 第二十三篇 vue - 深入组件 - 内置组件 - Transition
    动画组件Transition和TransitionGroupVue提供了两个可以帮助你制作基于状态变化的过渡和动画内置组件1、<Transition>会在一个元素或组件进入和离开DOM时应用动画2、<TransitionGroup>会在一个v-for列表中的元素或组件被插入,移动,或移除时应用动画除了这两个组件,我......
  • 第二十五篇 vue - 深入组件 - 内置组件 - keepAlive
    keepAlive<KeepAlive>是一个内置组件,它的功能是在多个组件间动态切换时缓存被移除的组件实例在平常开发中,有部分组件没有必要多次初始化,这时,我们需要将组件进行持久化,使组件的状态维持不变,在下一次展示时,也不会进行重新初始化组件kee-alive是Vue内置的一个组件,可以使被包含......
  • 第二十七篇 vue - 深入组件 - 内置组件 - Suspense
    Suspense<Suspense>是一个内置组件,用来在组件树中协调对异步依赖的处理。它让我们可以在组件树上层等待下层的多个嵌套异步依赖项解析完成,并可以在等待时渲染一个加载状态<Suspense>是一项实验性功能。它不一定会最终成为稳定功能,并且在稳定之前相关API也可能会发生变化异......
  • 第二十六篇 vue - 深入组件 - 内置组件 - Teleport
    Teleport<Teleport>是一个内置组件,它可以将一个组件内部的一部分模板“传送”到该组件的DOM结构外层的位置去基本用法有时我们可能会遇到这样的场景:一个组件模板的一部分在逻辑上从属于该组件,但从整个应用视图的角度来看,它在DOM中应该被渲染在整个Vue应用外部的其他地方......
  • 第二十八篇 vue - 深入组件 - 动态组件 - component
    component动态组件就是动态变化的组件,和动态样式一样,通过用户的操作来确定是什么类型的组件。动态样式是绑定:style,动态组件则是绑定:is在vue中,实现Tab切换主要有三种方式:使用动态组件,使用vue-router路由,使用第三方插件。本文将详细介绍Vue动态组件所谓动态组件就是让多......
  • [vue3]npm创建环境
    1.npm安装vuecli[root@Python20230401VUE3]#npminstall-g@vue/cli2.查看vue版本[root@Python20230401VUE3]#vue--version@vue/cli5.0.83.创建项目[root@Python20230401VUE3]#vuecreatehello-world4.执行项目$cdhello-world$npmrunserve......
  • 第二十一篇 vue - 深入组件 - 依赖注入 - provide 和 inject
    Prop逐级透传问题provide和inject可以帮助我们解决这一问题。[1]一个父组件相对于其所有的后代组件,会作为依赖提供者任何后代的组件树,无论层级有多深,都可以注入由父组件提供给整条链路的依赖Prop逐级透传问题通常情况下,当我们需要从父组件向子组件传递数据时,会使用pr......
  • vue2 + sass + sass-loader
    本地vue脚手架版本:5.0.8本地node版本:v18.13.0项目创建:vueinitwebpackdemo由于项目本身不支持sass,需要首先安装:npminstallsasssass-loader-D,记住:此处无需安装node-sass,安装后报错。由于sass和sass-loader版本不兼容会出现报错(TypeError:this.getOptionsisnotafunc......
  • vue (一)
     vue是一套构建用户界面的前端框架。 构建用户界面指的是用vue往html中填充数据。 框架指的是一套现成的解决方案,程序员只能遵守框架的规范,去编写自己的业务功能。 vue指令、组件(ui的复用)、路由、vuex、vue组件库 只有把上面罗列的内容掌握之后才有开发vue项目的能力。......