vue3.0 + 动态加载组件 + 全局注册组件

首先 vue 动态加载组件使用的是 component 标签,并通过设置组件的is 属性来指定要渲染的组件。例如:

<component :is="currentComponent"></component>

其中,currentComponent 是一个变量,它的值可以是以下几种:
已注册的组件名
HTML 标签名称
导入的组件对象

使用方法:
父组件

<template><component :is="componentName" :num="num" @changeNum="changeNum"></component>
</template>
<script setup>
import { ref, onMounted } from "vue";
const componentName = ref(null);
const num = ref(0);
onMounted(async () => {// 异步加载组件const moduleName = 'TestOne';loadModule(moduleName);setTimeout(() => {loadModule('TestTwo');}, 3000);
});const loadModule = async (moduleName) => {// import 后面是文件路径const module = await import(`./module/${moduleName}.vue`);componentName.value = module.default;
}const changeNum = () => {num.value++;
}
</script>

子组件TestTwo.vue

<template><div>Test2{{num}}<button @click="changeNum">加</button></div>
</template>
<script setup>
import { defineProps, defineEmits } from 'vue';
defineProps({num: Number
});
const emit = defineEmits(["changeNum"]);
const changeNum = ()=>{emit("changeNum");
}
</script>

这时我们发现每次加载组件都需要 import 去重新加载,比较浪费性能,我们可以采用在 main.js中集中一次全局注册组件。下面介绍的方法4
在这里插入图片描述
在这里插入图片描述

// 引入全局注册组件
import globalComponent from './register.js'
createApp(App).use(ElementPlus).use(globalComponent).mount('#app')

这样我们就可以直接这样用
在这里插入图片描述

全局注册组件有多种方法:

1、在main.js中

// 引入所有需要注册的全局组件
import TestOne from '@/components/module/TestOne.vue'
import TestTwo from '@/components/module/TestTwo.vue'
//定义一个数组结构
const components = [{ name: 'TestOne', component: TestOne },{ name: 'TestTwo', component: TestTwo },
];
//遍历数组进行循环注册
components.forEach(component => {Vue.component(component.name, component.component);
});

2、利用vue的插件模式
1)在register.js中

// 引入所有需要注册的全局组件
import TestOne from './TestOne.vue'
import TestTwo from './TestTwo.vue'
const globalComponents = [TestOne, TestTwo];
export default {install (Vue) {globalComponents.forEach(component => {// 这里用的是组件里面的name// 如果引入的组件没有写name,会报错 : vue.esm.js:100 Uncaught TypeError: Cannot read properties of undefined (reading 'toLowerCase')Vue.component(component.name, component);});}
}

2)在main.js中

// 引入全局注册组件
import globalComponent from './register.js'
Vue.use(globalComponent)

3、使用自动化导入,请注意文件路径
在main.js中

const componentContext = require.context('@/components/module', true, /\.vue$/);componentContext.keys().forEach(fileName => {//获取当前遍历的组件const componentConfig = componentContext(fileName);//获取当前组件的文件名称const componentName = fileName.replace(/^\.\//, '').replace(/\.\w+$/, '');//注册组件Vue.component(componentName, componentConfig.default || componentConfig);
});

上述代码会自动匹配components/module目录下以.vue为后缀的组件文件,并自动注册为全局组件

4、使用Vue插件和组件自动化注册(推荐)
1)在register.js中

const VueAutoRegister = {install (Vue) {//获取所有的vue文件const requireComponent = require.context('@/components/module', true, /\.vue$/);requireComponent.keys().forEach(fileName => {//获取当前遍历的组件const componentConfig = requireComponent(fileName);//获取当前组件的文件名称 vue文件中声明的name属性 || 文件名称const componentName = componentConfig.default.name || fileName.replace(/^\.\/(.*)\.\w+$/, '$1');//把文件名称当成组件名称,全局注册Vue.component(componentName, componentConfig.default || componentConfig);});}
};
export default VueAutoRegister;

2)在main.js中

// 引入全局注册组件
import globalComponent from './register.js';
Vue.use(globalComponent)

5、vite+vue3的方式:
1)在register.js中

import { defineAsyncComponent } from "vue";const VueAutoRegister  = {install:(app) => {// import.meta.glob是vite的新apiconst components = import.meta.glob("./**.vue");// 遍历组件模块实现自动注册for (const [path, component] of Object.entries(components)) {// 把文件名称当作组件注册的 nameconst componentName = path.slice(path.lastIndexOf("/") + 1, path.lastIndexOf("."));// 通过 defineAsyncComponent 异步导入指定路径下的组件app.component(componentName, defineAsyncComponent(component));}}
}export default VueAutoRegister;

2)在main.js中

// 引入全局注册组件
import globalComponent from './register.js'
const app = createApp(App)
app.use(globalComponent)

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

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

相关文章

第十二章 软件工程(上午题)

一、CMM( 能力成熟度模型 ) CMM 将软件过程改进分为以下五个级别 初始级&#xff1a;杂乱无章&#xff0c;没有明确定义的步骤 可重复级&#xff1a;建立了基本的项目管理过程和实践&#xff0c;有必要的过程准则来重复以前在同类项目中的成功 已定义级&#xff1a;软件过程文…

bash 5.2中文修订5

Grouping Commands 命令分组 Bash 提供两种方法将要执行的命令列表分组为一个单元。当命令被分组时&#xff0c;重定向可以应用于整个命令列表。例如&#xff0c;列表中所有命令的输出可以被重定向到单个流。 () 圆括号命令分组 ( list ) 将命令列表放在括号之间会强制 she…

搭建幻兽帕鲁需要什么样的服务器

作为一个开放世界生存制造类游戏《幻兽帕鲁》收获了空前绝后的热度&#xff0c;玩家们在游戏中通过在地图上捕捉收集到的“帕鲁”进行训练&#xff0c;合理利用他们的能力进行战斗&#xff0c;建立自己的家园、开辟新的世界、解锁新的冒险情节&#xff0c;获取更多游戏信息增加…

【数据结构 01】栈

一、原理 栈通常从数据结构和内存空间两个角度解释&#xff0c;从数据结构的角度&#xff0c;栈是一种线性结构表&#xff0c;只允许在固定的一端进行插入和删除元素&#xff0c;从内存空间角度&#xff0c;操作系统为函数和变量分配的内存空间通常在栈区&#xff0c;但是无论…

怎么查询鸿蒙真机支持的API版本

1、打开设备的开发者模式与USB调试并通过USB连接上电脑。 2、管理员身份运行cmd。 3、进入hdc.exe所在目录。(鸿蒙OS IDE的SDK下载目录中) 4、输入hdc shell&#xff0c;进入特殊模式 5、输入 getprop hw_sc.build.os.apiversion 查看API版本 6、输入 getprop hw_sc.build…

Codeforces Round 922 (Div. 2)(ABC)

C o d e f o r c e s R o u n d 922 ( D i v . 2 ) \Huge{Codeforces Round 922 (Div. 2)} CodeforcesRound922(Div.2) 文章目录 Problems A. Brick Wall思路标程 Problems B. Minimize Inversions思路标程 Problems C. XOR-distance思路标程 Problems A. Brick Wall 思路 给…

SQL切分字符串

MySQL 本身并没有提供内置的字符串切分函数&#xff0c;但你可以使用一些字符串函数和技巧来实现字符串切分。以下是一些常用的方法&#xff1a; 使用 SUBSTRING_INDEX 函数 SUBSTRING_INDEX 函数可以用来从字符串中提取子字符串。你可以使用它来获取字符串中的特定部分。 语…

第九节HarmonyOS 常用基础组件23-Menu、MenuItem、MenuItemGroup

1、描述 Menu&#xff1a;以垂直列表形式显示的菜单。 MenuItem&#xff1a;用来展示菜单Menu中具体的item菜单项。 MenuItemGroup&#xff1a;该组件用来展示菜单MenuItem的分组。 2、子组件 Menu&#xff1a;包含MenuItem、MenuItemGroup子组件。 MenuItem&#xff1a;…

SQL Server 函数参考手册(SQL Server 数值函数)

目录 SQL Server ABS() 函数 SQL Server ACOS() 函数 SQL Server ASIN() 函数 SQL Server ATAN() 函数 SQL Server ATN2() 函数 SQL Server AVG() 函数 SQL Server CEILING() 函数 SQL Server COUNT() 函数 SQL Server COS() 函数 SQL Server COT() 函数 SQL Server…

安全测试-pikachu靶场搭建

pikachu靶场搭建 文章目录 pikachu安装步骤 pikachu pikachu是一个自带web漏洞的应用系统&#xff0c;在这里包含了常见的web安全漏洞&#xff0c;也就是练习的靶场。 练习内容包括&#xff1a; 1.暴力破解 2.XSS 3.CSRF 4.SQL注入 5.RCE 6.文件包含 7.不安全的文件下载 8.不安…

【C++】类和对象(二)——构造/析构/拷贝构造函数

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读1. 默认成员函数2. 构造函数2.1 引入2.2 特性2.3 默认构造函数 3. 析构函数3.1 概念3.2 特性3.3 默认析构函数 4. 拷贝构造函…

2024 高级前端面试题之 Vue 「精选篇」

该内容主要整理关于 Vue 模块的相关面试题&#xff0c;其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。 Vue模块精选篇 1. 谈谈你对MVVM的理解2. 谈谈你对SPA单页面的理解3. Vue2.x 响应式数据原理4. Vue3.x 响应式数据原理5. Vue中如何检测数组变化6. Vue中如何进…

大数据 - Spark系列《二》- 关于Spark在Idea中的一些常用配置

上一篇&#xff1a; 大数据 - Spark系列《一》- 从Hadoop到Spark&#xff1a;大数据计算引擎的演进-CSDN博客 目录 1. &#x1f959;Idea中配置Live Templates来快速生成代码片段 2. &#x1f959;Idea中配置文件模板自定义初始代码 3.&#x1f959;设置spark-submit提交程…

[NAND Flash 7.1] 闪存系统性能优化方向集锦?AC timing? Cache? 多路并发?

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< ​ 传送门 >>> 总目录 主页: 元存储的博客_CSDN博客 依公开知识及经验整理,如有误请留言。 个人辛苦整理,付费内容,禁止转载。 内容摘要 优…

【排序算法】C语言实现随机快排,巨详细讲解

文章目录 &#x1f680;前言&#x1f680;快排的核心过程partition&#xff08;划分过程&#xff09;&#x1f680;快排1.0&#x1f680;随机快速排序&#x1f680;稳定性 &#x1f680;前言 铁子们好啊&#xff01;继续我们排序算法今天要讲的是快排&#xff0c;通常大家所说…

HBase表结构

HBase是非关系型数据库&#xff0c;是高可靠性、高性能、面向列、可伸缩、实时读写的分布式数据库。 HBase使用场景 大规模数据存储&#xff1a;如日志记录、数据库备份等。实时数据访问&#xff1a;如实时搜索、实时分析等。高性能读写&#xff1a;如高并发、低延迟的读写操…

【Java之HTML】

HTML 概念 互联网的产生&#xff1a;w3c的成立&#xff0c; ​ 互联网最开始设计的目的&#xff1a;看论文 ---->浏览器&#xff0c;HTML ​ 网络三要素&#xff1a;HTML HTTP URL HTML描述论文的格式 HTTP标记这个论文在网络上怎么传输 URL:指示这个论文在互联网的哪…

【SHUD】Windows下安装rSHUD

目录 说明一、安装R二、安装rSHUD自动安装依赖手动安装依赖安装rShud说明 rSHUD官网 rSHUD功能: 空间数据分析和操作。处理矢量和栅格数据,建立非结构三角网络。读/写SHUD模型的输入文件读取SHUD模型输出文件自动化模型调参水文数据时间序列分析二维三维数据可视化GIS空间数…

oj赛(双周赛第二十次)

目录 碰碰车 小码哥与机器人 小码哥的跳棋游戏 竖直打印机 排队 邮箱地址 碰碰车 难度:钻石 占用内存:128 M时间限制:1秒 游乐园玩碰碰车&#xff0c;其中有一种碰碰车是在一条直线上行驶。该碰碰车有一个初始朝向和初始位置&#xff0c;并且以每秒一个单位的速度向初始方…

多线程代码案例之单例模式

作者简介&#xff1a; zoro-1&#xff0c;目前大二&#xff0c;正在学习Java&#xff0c;数据结构&#xff0c;javaee等 作者主页&#xff1a; zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; 多线程代码案例之单例模式 单例…