vite5+vue3+ import.meta.glob动态导入vue组件

import.meta.glob 是 Vite 提供的一个特殊功能,它允许你在模块范围内动态地导入多个模块。这在处理大量的文件,如组件、页面或其他模块时特别有用,特别是当你需要根据某些条件或模式来动态加载它们时。

1.创建需要动态导入的组件目录

假设你有一个src/pages/DynamicComponents目录,里面包含多个 Vue 组件,你想根据某些条件动态地导入这些组件。

首先,确保你的目录结构是这样的:

src/pages/index.vue文件

<template><div class="DynamicComponentsOutbox"><h1>DynamicComponents</h1></div><div><component v-for="(component, name) in dynamicComponents" :key="name" :is="component" /></div>
</template><script setup>
import { onMounted, reactive,markRaw } from 'vue'
const dynamicComponents = reactive({})
onMounted(async () => {const modules = import.meta.glob('./DynamicComponents/*.vue');for (const path in modules) {const module = await modules[path]();const componentName = path.replace(/^\.\/components\/(.*)\.vue$/, '$1');console.log(`componentName`,componentName );dynamicComponents[componentName] = markRaw(module.default)}console.log(`dynamicComponents`,dynamicComponents);
})
</script><style lang="scss" scoped></style>

 src/pages/DynamicComponents/ComponentA.vue文件

<template><div class=""><h1>ComponentA</h1></div>
</template><script setup></script><style lang="scss" scoped></style>

 src/pages/DynamicComponents/ComponentB.vue文件

<template><div class=""><h1>ComponentB</h1></div></template><script setup></script><style lang="scss" scoped></style>

 App.vue文件

<template><main><HelloWorld msg="You did it!" /><component :is='DynamicComponents'></component></main>
</template>
<script setup>
import HelloWorld from '@/components/HelloWorld.vue'
import DynamicComponents from '@/pages/index.vue'
</script>
<style scoped></style>

index.vue:6 [Vue warn]: Vue received a Component that was made a reactive object. This can lead to unnecessary performance overhead and should be avoided by marking the component with `markRaw` or using `shallowRef` instead of `ref`. 
Component that was made reactive:  
{__hmrId: 'ed2b2297', __file: 'C:/Users/63002/Desktop/codefile/vue3-vite2/src/pages/DynamicComponents/ComponentA.vue', render: ƒ}at <Index> at <App>

刚开始这样写 

 dynamicComponents[componentName] =module.default 

这里报了一个警告:提示你去给组件使用markRaw or shallowRef包起来就好了,我直接使用了markRaw来包起组件 ,就解决这个警告了。

改为:

import { onMounted, reactive,markRaw } from 'vue'
dynamicComponents[componentName] = markRaw(module.default)
<template><div class="DynamicComponentsOutbox"><h1>DynamicComponents</h1></div><div><component v-for="(component, name) in dynamicComponents" :key="name" :is="component" /></div>
</template><script setup>
import { onMounted, reactive,markRaw } from 'vue'
const dynamicComponents = reactive({})
onMounted(async () => {const modules = import.meta.glob('./DynamicComponents/*.vue');for (const path in modules) {const module = await modules[path]();const componentName = path.replace(/^\.\/components\/(.*)\.vue$/, '$1');console.log(`componentName`,componentName );dynamicComponents[componentName] = markRaw(module.default)}console.log(`dynamicComponents`,dynamicComponents);
})
</script><style lang="scss" scoped></style>

 

在上面的代码中,我们首先在onMounted钩子中使用 import.meta.glob 获取 components 目录下所有 .vue 文件的动态导入。然后,我们遍历这些模块,加载它们,并将它们存储在 dynamicComponents 对象中,其中键是组件的名称(从文件路径中提取),值是组件的默认导出。

最后,在模板中,我们使用 v-for 指令遍历 dynamicComponents 对象,并使用 Vue 的动态组件功能 (<component :is="...">) 来渲染每个组件。

注意:由于 import.meta.glob 是在构建时解析的,因此它不会为动态路径或运行时确定的路径工作。它主要用于静态路径模式。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/770804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式—观察者模式与发布订阅

观察者设计模式 观察者设计模式&#xff08;Observer Design Pattern&#xff09;是一种常用的软件设计模式&#xff0c;它是一种行为型模式。该模式用于定义对象之间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都将得到通知…

FTP 文件传输服务

FTP连接 控制连接&#xff1a;TCP 21&#xff0c;用于发送FTP命令信息 数据连接&#xff1a;TCP 20&#xff0c;用于上传、下载数据 数据连接的建立类型&#xff1a; 主动模式&#xff1a;服务端从 20 端口主动向客户端发起连接 被动模式&#xff1a;服务端在指定范围…

flink-connector-redis支持select查询

EN 1 项目介绍 基于bahir-flink二次开发&#xff0c;相对bahir调整的内容有&#xff1a; 1.使用Lettuce替换Jedis,同步读写改为异步读写&#xff0c;大幅度提升了性能 2.增加了Table/SQL API&#xff0c;增加select/维表join查询支持 3.增加关联查询缓存(支持增量与全量) 4…

flask_restful数据解析

参数验证也叫参数解析 Flask-Restful 插件提供了类似 WTForms 来验证提交的数据是否合法 的包&#xff0c;叫做 reqparse 。 # Flask_RESTFUl数据解析 from flask import Flask,render_template from flask_restful import Api,Resource from flask_restful.reqparse import …

项目3-留言板

1.创建项目 记得将project type改为maven 将需要的包引入其中 更改版本号 引入MYSQL相关包记得进行配置&#xff01;&#xff01;&#xff01; spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncodingutf8&useSSLfalseusername: rootpassword:…

深入解析Oracle数据库中的外连接 (OUTER JOIN)

在Oracle数据库中&#xff0c;外连接用于从两个或更多表的连接操作中检索那些在至少一个表中有匹配记录的所有记录。外连接可以确保即使在另一个表中找不到匹配项&#xff0c;指定表中的记录也会出现在结果集中。外连接主要有三种类型&#xff1a; 左外连接 (LEFT OUTER JOIN)&…

sql server用nest typeorm实现索引的方式

针对您提到的索引类型&#xff0c;下面是使用TypeORM库在SQL Server中实现不同类型的索引的代码示例&#xff1a; 普通索引&#xff1a; import { Entity, Column, Index } from typeorm;Entity() Index(idx_name, [name]) export class User {Column()name: string;Column()…

JavaScript快速入门笔记之一(基本概念)

JavaScript快速入门笔记之一&#xff08;基本概念&#xff09; 前端三大语言&#xff1a; HTML&#xff1a;专门编写网页内容的语言CSS&#xff1a;专门美化网页样式的语言JavaScript&#xff1a;专门编写网页交互的语言 名词解释&#xff1a; 交互&#xff1a;输入数据&#…

C++ MFC 只启动一个程序实例 唤醒之前的实例(完整源码)

初级代码游戏的专栏介绍与文章目录-CSDN博客 很多时候我们希望只允许启动一个程序实例&#xff0c;如果再次运行&#xff0c;就唤醒之前的实例。 目录 1 概述 2 相关技术介绍 2.1 互斥对象 2.2 查找窗口 2.3 唤醒窗口 1 概述 技术上并不难&#xff0c;涉及到以下几个技术…

用redis lua脚本实现时间窗分布式限流

需求背景&#xff1a; 限制某sql在30秒内最多只能执行3次 需求分析 微服务分布式部署&#xff0c;既然是分布式限流&#xff0c;首先自然就想到了结合redis的zset数据结构来实现。 分析对zset的操作&#xff0c;有几个步骤&#xff0c;首先&#xff0c;判断zset中符合rangeS…

Java服务器开发的日志:日志的作用和使用方法;日志文件的定期归档、清理和滚动策略;ELK(又称Elastic Stack)

Java服务器开发的日志 Java服务器开发&#xff0c;为什么要使用日志&#xff1f; 应该怎样使用日志&#xff1f; 在Java服务器开发中使用日志是非常关键的一个实践&#xff0c;原因如下&#xff1a; 本文所说的“日志”&#xff0c;主要是指程序运行时生成的技术日志&#xff…

#AngularJS#$sce.trustAsResourceUrl

$sce.trustAsResourceUrl 是 AngularJS&#xff08;一个旧版本的 Angular&#xff09;中的安全上下文&#xff08;Security Context&#xff09;方法&#xff0c;用于信任一个 URL&#xff0c;使其可以作为资源 URL 使用&#xff0c;而不会触发 AngularJS 的安全警告或阻止。 …

使用JMeter进行梯度压测

使用JMeter进行梯度压测 梯度压测配置如下&#xff1a; 使用线程:5&#xff0c;然后循环5000次&#xff0c;共2.5万个样本使用线程:10&#xff0c;然后循环5000次&#xff0c;共5万个样本使用线程:15&#xff0c;然后循环5000次&#xff0c;共7.5万个样本使用线程:20&#xff…

Redis中的事件

事件 概述 Redis服务器是一个事件驱动程序:服务器需要处理以下两类事件: 1.文件事件(file event):Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接&#xff0c;而文件事件就是服务器对套接字操作的抽象。服务器与客户端(或者其他服务器)的通信会产生相应的文件…

上位机图像处理和嵌入式模块部署(qmacvisual自定义插件代码分析)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 qmacvisual里面的第三方插件主要由两部分组成&#xff0c;一部分是ExtensionLibrary&#xff0c;也就是插件的容器&#xff0c;这个是官方提供的&a…

【机器学习】贝叶斯上篇(详解)

深入理解贝叶斯学习&#xff1a;核心原理及应用全解析 在机器学习的领域内&#xff0c;贝叶斯学习作为一种强大的框架&#xff0c;使我们能够在不确定性条件下进行预测和决策。贝叶斯学习源于托马斯贝叶斯的工作&#xff0c;提供了一种概率论的学习方法&#xff0c;与传统的频…

01 React新建开发环境

https://create-react-app.dev/docs/getting-started npx create-react-app my-appJSX使用表达式嵌入 function App() {const count 100;function getSelfName() {return "SelfName"}return (<div>Hello World!<div>{This is Javascript message~!}&l…

荟萃分析R Meta-Analyses 3 Effect Sizes

总结 效应量是荟萃分析的基石。为了进行荟萃分析&#xff0c;我们至少需要估计效应大小及其标准误差。 效应大小的标准误差代表研究对效应估计的精确程度。荟萃分析以更高的精度和更高的权重给出效应量&#xff0c;因为它们可以更好地估计真实效应。 我们可以在荟萃分析中使用…

【Golang星辰图】大数据时代的明星工具:深入了解Go语言数据处理和分析库

高效处理数据&#xff0c;驾驭大数据时代&#xff1a;深入学习Go语言数据处理库 前言 在当今互联网时代&#xff0c;数据处理和分析变得越来越重要。随着数据规模的不断增大&#xff0c;如何高效地处理和分析数据成为了许多企业和开发者面临的挑战。为了满足这一需求&#xf…

面试算法-102-LRU 缓存

题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否则返…