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,一经查实,立即删除!

相关文章

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

作为一个开放世界生存制造类游戏《幻兽帕鲁》收获了空前绝后的热度&#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…

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

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

安全测试-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. 拷贝构造函…

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

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

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

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

HBase表结构

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

【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; 多线程代码案例之单例模式 单例…

【数据结构 04】单链表

一、链表简介 链表是一种物理存储结构上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表在结构上的分类&#xff1a; 1. 带头结点或无头结点 2. 单向或双向 3. 循环或非循环 虽然链表有多种结构类型&#xff0c;但是我么在实际开发中…

【RT-DETR有效改进】Bi-FPN高效的双向特征金字塔网络(附yaml文件+完整代码)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进机制是BiFPN双向特征金字塔网络,其是一种特征融合层的结构,也就是我们本文改进RT-DETR模型中的Neck部分,它的主要思想是通过多层级的特征金字塔和双向信息传递来提高精度。本文给大家带…

甘肃推动“安全石窟”建设,新技术助力文物预防性保护

一、甘肃用“智能化”技术让文物“重获新生” 文物保护与历史遗产和文化瑰宝的安全相关。甘肃有莫高窟、麦积山、炳灵寺等石窟寺&#xff0c;背负着历史的沧桑。但是&#xff0c;岁月侵蚀使这些文物状态变得令人堪忧。环境的微妙变化和温度和湿度的波动会对其导致不可逆转的伤…

浮点数加、减运算步骤

一、浮点数介绍 1.1 浮点数格式&#xff1a; 精度位数格式单精度 float4个字节32位符号位1位&#xff0c;阶码8位&#xff0c;尾数23位双精度 double8个字节64位符号位1位&#xff0c;阶码11位&#xff0c;尾数52位 1.2 浮点的表示方法 浮点数在机器中的形式如下所示&#x…

C++数据结构与算法——链表

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

Linux初始相关配置

前言 在学完了Linux的相关基础命令后&#xff0c;在正式使用Linux系统之前&#xff0c;我觉得配置一些东西是很有意义的。 文章目录 前言1.权限配置&#xff0c;普通用户无法sudo提权2.vim配置3.vim其他操作4.动静态库5.gcc/g6.程序翻译的过程7.make/makefile8.cmake/CMakeLis…

【Unity3D小功能】Unity3D中设置Text行首不出现标点符号

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中会遇到Text的文本内容行首出现标点符号的情况&#xf…

《动手学深度学习(PyTorch版)》笔记4.8

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过。…