首页 > 其他分享 >vue3异步组件

vue3异步组件

时间:2023-11-08 16:37:28浏览次数:43  
标签:异步 vue defineAsyncComponent Promise vue3 组件 import 加载

父组件中,子组件的加载一般是按照先后顺序加载的,子组件加载后才会加载父组件。

一个页面的子组件很多,由于会先加载子组件,那么父组件可能会出现比较长的白屏等待时间

大型项目,可能需要拆分应用为更小的块,并仅在需要时再从服务器加载相关组件Vue 提供defineAsyncComponent方法:

import { defineAsyncComponent } from 'vue';

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

使用import导入组件

得到的 AsyncComp 是一个包裹组件,仅在页面需要它渲染时才调用加载函数。另外,它还会将 props 传给内部的组件,所以你可以使用这个异步的包裹组件无缝地替换原始组件,同时实现延迟加载

import { defineAsyncComponent } from 'vue';

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

处理加载与错误的状态

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

const AsyncComp = defineAsyncComponent({
  // 加载函数 需要返回一个Promise,可以使用动态import的方式,也可以自己new Promise()
  loader: () => import('./Foo.vue'),
  // 加载异步组件时使用的组件,该组件会在异步组件加载时显示,如果异步组件加载很快,可能不会出现loading组件
  loadingComponent: LoadingComponent,
  // 展示加载组件前的延迟时间,默认为 200ms
  delay: 200,
  // 加载失败后展示的组件,可以通过Promise的reject来测试
  errorComponent: ErrorComponent,
  // 如果提供了一个 timeout 时间限制,并超时了
  // 也会显示这里配置的报错组件,默认值是:Infinity
  timeout: 3000
});

如果提供了一个加载组件,它将在内部组件加载时先行显示。在加载组件显示之前有一个默认的 200ms 延迟——这是因为在网络状况较好时,加载完成得太快,导致最终组件的替换可能看起来像是闪烁。

如果提供了一个报错组件,当加载器函数返回的 Promise 被 reject 时,它将被显示出来。你还可以指定一个超时时间,在请求耗时过长时显示报错组件。

动态加载函数方式导入组件

import默认导入的模块是静态的,如果我们将import用于动态导入模块,那么将放回一个 Promise,也就是说我们可以在defineAsyncComponent的加载函数中直接使用import来动态导入一个模块。

若非必要,请不要滥用动态导入

import { defineAsyncComponent } from 'vue';
const VmdContent = defineAsyncComponent(() => {
  return import('@/components/editor/VmdContent.vue');
});
<VmdContent :loading="state.spinning" :result="state.resultData.text"></VmdContent>

示例

new Promise方式

script setup

// app.vue
import { onMounted, defineAsyncComponent } from 'vue';
import Child from './child.vue';
const AsyncChild = defineAsyncComponent(() => new Promise((resolve, reject) => resolve(Child)));
onMounted(() => {
  console.log('app');
});
<template>
  <AsyncChild />
</template>

对象的方式创建

script setup

// app.vue
import {ref, onMounted, defineAsyncComponent } from 'vue'
import LoadingComp from './LoadingComp.vue' //加载中
import ErrorComp from './ErrorComp.vue' //加载错误
const AsyncChild = defineAsyncComponent({
    loader: () => (new Promise((resolve, reject) => reject())),
    loadingComponent: LoadingComp,
    delay: 200,
    errorComponent: ErrorComp,
    timeout: 2000
})
onMounted(() => {
    console.log('app')
})
let isShowAsyncComp = ref(false)
const loader = () => {
  isShowAsyncComp.value = true
}
<template>
    <button @click="loader">加载异步组件</button>
    <AsyncChild v-if="isShowAsyncComp" />
</template>

标签:异步,vue,defineAsyncComponent,Promise,vue3,组件,import,加载
From: https://blog.51cto.com/u_12828212/8256113

相关文章

  • vuejs3.0 从入门到精通——Element Plus 组件库
    ElementPlus组件库一、ElementPlus 基于Vue3,面向设计师和开发者的组件库。二、完整导入https://element-plus.org/zh-CN/guide/quickstart.html#完整引入 如果你对打包后的文件大小不是很在乎,那么使用完整导入会更方便。//main.tsimport{createApp}from'vu......
  • 最全面的移动端UI组件设计详解:下篇
    上一期给大家讲解了《最全面的移动端UI组件设计详解:中篇》,主要分享了:基础组件、表单组件和反馈组件3个部分;这次给大家带来:数据展示组件和其他组件详解,希望你在设计APP、小程序、H5页面中,能熟练使用和理解各种的UI组件,今天给大家总结了关于移动端UI组件,希望可以在工作中帮到你。......
  • 最全面的移动端 UI组件设计详解:上篇
    作为一名UI设计师,我们经常要进行PC端和移动端的设计任务,上一次给大家分享了:《最全Web端UI组件设计详解》,这次给大家带来移动端UI组件设计详情,尤其在我们APP、小程序、H5页面设计中,我们要使用和熟知各种的UI组件,今天给大家总结了关于移动端UI组件,希望可以在工作中帮到你。什么......
  • vue3中使用Pinia
    Pinia是一个用于Vue的状态管理库,类似Vuex,是Vue的另一种状态管理方案三大核心:state(存储的值),getters(计算属性),actions也可支持同步(改变值的方法,支持同步和异步)npminstallpinia@nextoryarnaddpinia@next模块化封装创建实例新建store/index.ts(src目录下新建store......
  • 6、Flutter 列表组件
    列表有以下分类:1、垂直列表classMyAppextendsStatelessWidget{constMyApp({super.key});@overrideWidgetbuild(BuildContextcontext){returnCenter(child:ListView(children:const[Icon(Icons.search,color:Colors.red,size:50),......
  • probability calculator 商业和免费的组件
    p-ValueCalculatorfortheStudentt-Test(Probability,p-value)http://www.danielsoper.com/statcalc/calc08.aspxStatsarstatisticslibraryhttp://www.simplexar.com/Statsar/Product.aspxProbabilityandStatisticsfor.NETv3.6http://www.webcabcomponents.com/......
  • C#截图 开源组件库ShareX
    ShareX支持以下几种截图方式,其中全屏功能是指自动截取主屏幕桌面区域的截图(可以配置是否隐藏ShareX窗口、隐藏屏幕虚拟区域等),窗口功能是指截取屏幕中的指定进程的窗口截图(ShareX程序通过调用Windows系统的EnumWindows函数枚举屏幕中的顶层窗口,并动态生成窗口菜单的子菜单)、显示器......
  • InBody 组件 将dom挂载到body
    <template><div><transitionv-bind:name="transName"appear><slot></slot></transition></div></template><script>exportdefault{data(){return{......
  • DevExpress WinForms桑基图组件,开创大数据流可视化新方式!
    界面控件DevExpressWinForms能帮助开发者创建信息丰富的WinForms应用程序,使用其SankeyDiagram(桑基图)控件,您可以非常轻松地可视化大数据的数据流。DevExpressWinForms有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。同时能完美构建流畅、美观且易于使用......
  • SpringBoot集成文件 - 大文件的上传(异步,分片,断点续传和秒传)
    1.知识准备大文件的上传技术手段和普通文件上传是有差异的,主要通过基于分片的断点续传和秒传和异步上传解决。#1.1大文件面临的问题上传速度慢--应对: 分块上传上传文件到一半中断后,继续上传却只能重头开始上传--应对: 断点续传相同文件未修改再次上传,却只能重......