当前位置: 首页 > news >正文

vue3中动态引入组件并渲染组件

在开发中 有时会在打包或者各种可能的情况下 报错或警告提示 模块化打包的问题,
我们需要动态引入组件并渲染组件时,
方法1: 可以使用import引入结合component标签使用
如下举例

import { ref, markRaw } from 'vue'
const childrenComponent = ref();
onMounted(() => {//举例引入一个组件childrenComponent.vueimport('**/..**../childrenComponent.vue').then((module) => {childrenComponent.value = markRaw(module.default);// 确保该赋值操作不会反复触发重新渲染});
});

可以使用component标签和:is 属性来动态创建和使用组件。

  <component :is="childrenComponent" v-if=" childrenComponent"/>

方法2: vue3的defineAsyncComponent

defineAsyncComponent 是 Vue 3 提供的一个功能,它允许你定义一个异步组件。这意味着组件的加载会被延迟,直到它真正需要被渲染到页面上时才会加载。这对于大型应用来说特别有用,因为它可以帮助减小初始加载时间,实现按需加载。

js中

import { defineAsyncComponent } from 'vue';const AsyncComp = defineAsyncComponent(() =>new Promise((resolve, reject) => {// 模拟异步操作setTimeout(() => {// 模拟从服务器动态导入组件import('./children.vue').then(component => {resolve(component);});}, 1000);})
);export default AsyncComp;

vue文件中
你可以像使用普通组件一样 import引入js 后使用 AsyncComp组件:

<template><div><AsyncComp /></div>
</template><script>
import AsyncComp from './path/to/AsyncComp.js';export default {components: {AsyncComp}
}
</script>

defineAsyncComponent 可以接受一个返回 Promise 的工厂函数,如上例所示。
你也可以使用 import() 语法来定义组件:

import { defineAsyncComponent } from 'vue';const AsyncComp = defineAsyncComponent(() =>import('./children.vue')
);

在这个例子中,children.vue 会在需要渲染 AsyncComp 组件时才被加载。
这种方式利用了原生的 ES6 import() 函数来动态导入组件,当异步组件被解析时,Vue 会自动处理组件的注册和渲染。

高级用法
defineAsyncComponent 还接受一个选项对象,允许你配置一些高级特性,比如加载中的组件、错误处理、延迟加载等:

const AsyncComponent = defineAsyncComponent({loader: () => import('./components/AsyncComponent.vue'),loadingComponent: LoadingComponent,errorComponent: ErrorComponent,delay: 200,timeout: 3000
});
  • loader: 返回一个 Promise,该 Promise 应该 resolve 组件定义。
  • loadingComponent: 在组件加载过程中渲染的组件。
  • errorComponent: 如果加载组件失败,则渲染此组件。
  • delay:在显示加载组件之前的延迟时间(毫秒)。
  • timeout: 如果加载组件的时间超过这个时间,则显示错误组件(毫秒)。

注意事项

  • 异步组件对于提高应用的加载速度和性能非常有用,但是需要注意管理它们的加载状态和错误处理。
  • 在使用异步组件时,考虑到组件的加载时间,可能需要为用户提供一些反馈,比如加载指示器。
  • 使用 defineAsyncComponent 时,确保正确处理错误情况,避免应用崩溃。

相关文章:

  • DC00023基于jsp+MySQL新生报到管理系统
  • 聊一聊大模型六小虎生存现状!
  • 8.代码风格调试%结课竞赛
  • 大厂面试真题:简单说下Redis的bigkey
  • Unity3D PostLateUpdate为何突然占用大量时间详解
  • CC-LINK IE Field Basic通讯设置
  • Redis --- redis事务和分布式事务锁
  • 用友U8+CRM leadconversion.php SQL注入复现
  • Linux进程的学习(持续更新)
  • C++:类中的特殊关键字,运算重载符
  • Groupby_SQL和pandas等效例子
  • 数据结构7—树(顺序存储二叉树—堆)含TOPK问题
  • OpenCV视频I/O(1)视频采集类VideoCapture介绍
  • YOLOv9改进,YOLOv9主干网络替换为GhostNetV3(2024年华为提出的轻量化架构,全网首发),助力涨点
  • 作家依靠AI一年内创作120部作品
  • [case10]使用RSQL实现端到端的动态查询
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JavaScript异步流程控制的前世今生
  • JS 面试题总结
  • zookeeper系列(七)实战分布式命名服务
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 一个完整Java Web项目背后的密码
  • 一文看透浏览器架构
  • 在Unity中实现一个简单的消息管理器
  • 积累各种好的链接
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • #define 用法
  • #每天一道面试题# 什么是MySQL的回表查询
  • (02)Hive SQL编译成MapReduce任务的过程
  • (2020)Java后端开发----(面试题和笔试题)
  • (28)oracle数据迁移(容器)-部署包资源
  • (C语言)fread与fwrite详解
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (多级缓存)缓存同步
  • (二)Linux——Linux常用指令
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .Net 执行Linux下多行shell命令方法
  • .NET_WebForm_layui控件使用及与webform联合使用
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .net程序集学习心得
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • @antv/g6 业务场景:流程图
  • @DS 多数据源 + @Transactional(rollbackFor = Exception.class) 导致@DS 多数据源没法使用
  • @RestController注解的使用
  • @WebServiceClient注解,wsdlLocation 可配置
  • []Telit UC864E 拨号上网
  • [16/N]论得趣
  • [Bug]使用gradio创建应用提示AttributeError: module ‘gradio‘ has no attribute ‘inputs‘