vue:vue2与vue3如何全局注册公共组件(包括涉及到的相关方法函数的讲解)

news2024/11/29 2:39:54

目录

第一章 vue2全局注册公共组件

1.1 方法一:逐个注册

1.2 方法二:批量注册

1.2.1 require.context()方法解释

第二章 vue3全局注册公共组件

1.1 方法一:逐个注册

1.2 方法二:批量注册


第一章 vue2全局注册公共组件

Vue.component() // vue2注册组件的方法

1.1 方法一:逐个注册

import BreadCrumbs from '@/components/BreadCrumbs.vue'
import HomeBanner from '@/components/HomeBanner.vue'
import HomeBottom from '@/components/HomeBottom.vue'
import TabChange from '@/components/TabChange.vue'
import NewTabs from '@/components/NewTabs.vue'
……

export default {
    // vue2自带的方法
    install: function (Vue) {
        // 注册全局容器
        Vue.component('BreadCrumbs', BreadCrumbs)
        Vue.component('HomeBanner', HomeBanner)
        Vue.component('HomeBottom', HomeBottom)
        Vue.component('TabChange', TabChange)
        Vue.component('NewTabs', NewTabs)
        ……
    },
}

// 引入公共主键(上面的方法在该文件下)
import components from '@/plugin/components'

// 使用公共组件
Vue.use(components)

1.2 方法二:批量注册

import Vue from 'vue'

// vue2方法 ——> 自动注册全局组件
const componentsContext = require.context('./', true, /\.vue$/)

componentsContext.keys().forEach((component) => {
    const componentConfig = componentsContext(component)
    /**
     * 兼容 import export 和 require module.export 两种规范
     */
    const ctrl = componentConfig.default || componentConfig
    Vue.component(ctrl.name, ctrl)
})
  • require.context()方法官网:

require-context - npm

1.2.1 require.context()方法解释

const componentsContext = require.context('./', true, /\.vue$/)

console.log('componentConfig', componentsContext)
console.log('require',require.prototype)

  • 通过控制台中打印require,发现require其实就是就是一个函数
  •  通过require的原型,发现require的方法有三个属性:id、key、resolve
  • 属性解释:
  1. resolve:是一个函数,并返回已解析请求的模块id
  2. key:函数是否返回上下文模块可以处理的所有可能请求的数组
  • require.context(directory,useSubdirectories,regExp)参数介绍:
  1. directory:表示要检索的目录
  2. useSubdirectories:表示是否检索目录下的子文件夹
  3. regExp:匹配文件的正则表达式,一般是文件名
  • 例如:
require.context('./', true, /\.vue$/) // 匹配该文件夹下.vue后缀的文件夹

第二章 vue3全局注册公共组件

app.component() // vue3注册组件的方法

1.1 方法一:逐个注册

import BreadCrumbs from '@/components/BreadCrumbs.vue'
import HomeBanner from '@/components/HomeBanner.vue'
import HomeBottom from '@/components/HomeBottom.vue'
import TabChange from '@/components/TabChange.vue'
import NewTabs from '@/components/NewTabs.vue'
……

import { createApp } from 'vue'

const app = createApp(App)

registerVantComponent(app)

export default {
    registerVantComponent: function (app) {
        // 注册全局容器
        app.component('BreadCrumbs', BreadCrumbs)
        app.component('HomeBanner', HomeBanner)
        app.component('HomeBottom', HomeBottom)
        app.component('TabChange', TabChange)
        app.component('NewTabs', NewTabs)
        ……
    },
}

1.2 方法二:批量注册

  • 方案一:

import { defineAsyncComponent } from 'vue'

/**
 * @description 自动将 ./src/components/global 下的组件注册成为全局组件
 * @param  app 当前应用实例
 * @returns {void} void
 */

const components = import.meta.glob('./*.vue')

export function registerGlobalComponent(app) {
    // 组件注册成为全局组件
    for (const [key, value] of Object.entries(components)) {
        const name = key.slice(key.lastIndexOf('/') + 1, key.lastIndexOf('.'))
        app.component(name, defineAsyncComponent(value))
    }
}
  • 方案二: 

/**
 * @description 自动将 ./src/components/global 下的组件注册成为全局组件
 * @param  app 当前应用实例
 * @returns {void} void
 */

export function registerGlobalComponent(app) {
    // 组件注册成为全局组件
    const components = import.meta.globEager('./*')

    for (const path in components) {
        if (path.includes('.vue')) {
            let componentName = path.match(/(.*)\.vue$/)[1]
            if (componentName.includes('./')) {
                componentName = componentName.replace('./', '')
            }
            const component = components[path].default
            app.component(componentName, component)
        }
    }
}
  • 针对于vue3的批量注册小编提供了两种方案(注意vue3不支持require方法了),思路与vue2注册是一致的,都可行的,但是小编更推荐方案一,因为方案二小编在项目上线的过程中遇到了低版本手机不兼容导致项目不兼容跑不动的bug
  • import.meta.glob()是一个 ES 模块的特殊属性,用于动态导入多个模块,该方法接受一个模式字符串作为参数,并返回promise,该Promise 析为一个对象,该对象包含匹配该模式的所有模块的键值对
  • 该例子中:import.meta.glob('./*.vue') —— './' 表示同目录下(也可以自定义其他目录)'*' 表示任意名称'.vue' 后缀
  • import.meta.globEager() 是 Webpack 5 和 Deno 这样的现代 JavaScript 环境中引入的一个特性,用于异步加载模块和文件。meta 属性是 ES2020 中引入的,它允许直接访问到 import 语句的元信息,包括导入路径列表。globEager 是对 import.meta.glob 的增强版本,它提供了立即同步加载所有匹配给定模式(如 **/*.js)的模块的能力。但是这个特性并非浏览器原生支持,而是由一些工具如 Vite 或 Deno 提供的扩展在使用浏览器环境中尝试使用它,可能会遇到兼容性问题。

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

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

相关文章

Golang并发控制的三种方案

Channel Channel是Go在语言层面提供的一种协程间的通信方式&#xff0c;我们可以通过在协程中向管道写入数据和在待等待的协程中读取对应协程的次数来实现并发控制。 func main() {intChan : make(chan int, 5)waitCount : 5for i : 0; i < waitCount; i {go func() {intC…

【计算机网络体系结构】计算机网络体系结构实验-FTP实验

1. 2. 3. wireshark 第一行&#xff1a;帧Frame 545&#xff1a;要发送的数据块&#xff0c;所抓帧的序号为545&#xff0c;捕获字节数等于传送字节数&#xff1a;451字节第二行&#xff1a;源Mac地址为a4:bb:6d:6e:28:9a&#xff1b;目标Mac地址为24:00:fa:e4:df:d8第三行&…

安卓逆向案例——X酷APP逆向分析

X酷APP逆向分析 这里介绍一下两种不同的挂载证书的方法。 chls.pro/ssl无法在浏览器中下载证书是什么原因解决方法&#xff1a; 法一 1. 挂载系统分区为读写 使用正确的挂载点来挂载系统分区为读写&#xff1a; su mount -o remount,rw /dev/uijISjR/.magisk/block/syste…

Spring Boot连接Redis集群

1、问题写在前面 1.1、问题描述&#xff1a;Redis集群节点地址发现失败 Unable to connect to [172.17.0.4:7303]: connection timed out: /172.17.0.4:7303 1.2、解决方案&#xff1a; redis.conf 中添加配置 cluster-announce-ip 192.168.56.11 1.3、方案出处&#xff1a;…

何在 Vue3 中使用 Cytoscape.js 创建交互式网络图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Cytoscape.js集成到Vue应用中 应用场景介绍 Cytoscape.js是一个用于可视化复杂网络数据的JavaScript库。它提供了丰富的功能&#xff0c;包括节点和边的创建、布局算法、交互式操作等。本文将介绍如何在Vue应…

如何将办公文档压缩成rar格式文件?

压缩包格式是我们生活工作中常用到的文件格式&#xff0c;那么如何得到一个rar格式的压缩文件&#xff1f;或者说如何将文件压缩成rar格式而不是zip格式呢&#xff1f;今天我们来了解一下如何压缩为rar格式文件。 首先&#xff0c;下载并安装WinRAR&#xff0c;然后用鼠标选择需…

Flat Ads:互动广告助力开发者高效流量变现

Flat Ads作为掌握7亿独家开发者流量的全球化营销推广平台,始终致力于为全球广告主提供高效、精准的效果营销和品牌宣传服务,同时为发布商提供高效变现、最大化收益的一站式解决方案。 Flat Ads旗下的互动广告平台作为高效能广告媒介,通过丰富的广告形式和变现场景有效地提升开…

【Ubuntu下 qmqtt6.2编译及使用】

这里写自定义目录标题 一、编译二、使用 背景&#xff1a;最近用QT编写简单的HMI软件&#xff0c;mqtt通信&#xff0c;记录下编译过程&#xff0c;供参考。 一、编译 QT6.5.3 qmqtt6.2&#xff08;源码地址&#xff1a;https://github.com/qt/qtmqtt/tree/6.5.3&#xff09; …

工具与技术:如何使用工具创建和实现导航栏图标动效

这篇教程的目的主要是带领大家做UI交互的入门引导,让大家理解做交互动效的一些基本逻辑思维,利用原型交互动画做导航栏icon动画效果。 导航栏icon动效的详细教程&#xff1a; 即时设计 - 可实时协作的专业 UI 设计工具即时设计是一款支持在线协作的专业级 UI 设计工具&#x…

Linux入门攻坚——26、Web Service基础知识与httpd配置-2

http协议 URL&#xff1a;Uniform Resource Locator&#xff0c;统一资源定位符 URL方案&#xff1a;scheme&#xff0c;如http://&#xff0c;https:// 服务器地址&#xff1a;IP&#xff1a;port 资源路径&#xff1a; 示例&#xff1a;http://www.test.com:80/bbs/…

【mysql 安装启动失败】 没有网下 libssl.so.10 not found 如何解决?

问题描述&#xff1a; libssl.so.10 > not found libcrypto.so.10 > not found [rootmysql tools]# ls -l /usr/sbin/mysqld -rwxr-xr-x. 1 root root 64290024 Sep 14 2022 /usr/sbin/mysqld [rootmysql tools]# ldd /usr/sbin/mysqldlinux-vdso.so.1 (0x00007fff97105…

网络流量 数据包length计算

MTUMSSIP header(20 bytes)tcp header(20 bytes) lengthMTUEthernet header(14bytes) 其中MSS为Maximum Segment Size&#xff0c;即最大报文段长度&#xff0c;其受MTU大小影响&#xff0c;这里的MTU指的是三层的&#xff0c;二层的MTU固定为1500&#xff0c;不能修改。 MT…

SFF2004A-ASEMI无人机专用SFF2004A

编辑&#xff1a;ll SFF2004A-ASEMI无人机专用SFF2004A 型号&#xff1a;SFF1006A 品牌&#xff1a;ASEMI 封装&#xff1a;ITO-220AC 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;20A 最大循环峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;400V 最…

一种快速设计PCB外壳的方法

设计PCB外壳比较好用的工具是SW但是有时候需要快速设计外壳的情况下使用立创EDA的外壳设计功能很好用&#xff0c;设计完成之后可以直接导出STL文件&#xff1a; 可以看到设计的外壳还是蛮精美的&#xff1a; 特别注意&#xff0c;设计外壳的时候要考虑如何把PCB放进壳子中&…

市值3万亿英伟达的崛起:技术、坚持与市场的力量,厚积薄发的经典案例

在科技领域&#xff0c;英伟达&#xff08;NVIDIA&#xff09;的故事无疑是一个厚积薄发的经典案例。作为一家专注于图形处理单元&#xff08;GPU&#xff09;的公司&#xff0c;英伟达用31年的时间证明了技术的价值、计算的价值和坚持的价值。本文将详细探讨英伟达如何从一家市…

第7周作业——单片机定时器与串口通信的学习与应用

一、蜂鸣器 &#xff08;一&#xff09;蜂鸣器介绍 蜂鸣器是一种将电信号转换为声音信号的器件&#xff0c;常用来产生设备的按键音、报警音等提示信号&#xff0c;按照驱动方式可以分为如下两种&#xff1a; 1、有源蜂鸣器&#xff1a;内部自带振荡源&#xff0c;将正负极接上…

自动化测试:Autorunner的使用

自动化测试&#xff1a;Autorunner的使用 一、实验目的 1、掌握自动化测试脚本的概念。 2、初步掌握Autorunner的使用 二、Autorunner的简单使用 autoRunner使用方法 新建项目 a) 在项目管理器空白区域,右键鼠标,选择新建项目 b) 输入项目名后,点击[确定]. 在初次打开aut…

[java]集合类stream的相关操作

1.对list中的map进行分组 下面例子中&#xff0c;根据高度height属性进行分组 List<Map<String, Float>>originalList new ArrayList<>();originalList.add(new HashMap<String,Float>() {{put("lng", 180.0f);put("lat",90f);…

Eclipse使用TFS(Team Foundation Server) 超详细

Eclipse使用TFS 1、什么是TFS2、TFS和Git的区别3、签出代码4、签入代码4.1、签出以进行编辑4.2、修改本地代码4.3、签入挂起的更改4.4、签入 如果不能 签入挂起的更改&#xff0c;则先 签出以进行编辑如果 签入挂起的更改不可选中&#xff0c;则 如下操作 1、什么是TFS Team F…

阿里云使用域名访问部署网站【2024 详细版】

目录 一、注册域名 1.创建信息模板 2.查询注册域名 二、域名设置 1.SSL证书 2.域名解析 3.宝塔设置 一、注册域名 1.创建信息模板 点击右上角【三】-【域名】-【信息模板】-【创建信息模板】- 填写信息 模板分为个人和企业两种&#xff0c;根据情况进行创建即可&…