news 2026/4/15 13:16:10

Vue—— Vue3全局组件注册机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue—— Vue3全局组件注册机制

背景问题:
需要全局注册常用组件,避免重复导入。

方案思考:
在应用初始化时批量注册全局组件。

具体实现:
创建自动注册全局组件的工具函数:

// utils/global-components.jsimport{App}from'vue'// 手动导入需要全局注册的组件importGlobalButtonfrom'@/components/GlobalButton.vue'importGlobalInputfrom'@/components/GlobalInput.vue'importBaseDialogfrom'@/components/BaseDialog.vue'importBaseTablefrom'@/components/BaseTable.vue'constglobalComponents={GlobalButton,GlobalInput,BaseDialog,BaseTable}// 注册所有全局组件exportfunctionregisterGlobalComponents(app){Object.entries(globalComponents).forEach(([name,component])=>{app.component(name,component)})}

更高级的自动导入方式:

// utils/auto-import.jsimport{App}from'vue'// 自动导入全局组件exportfunctionsetupGlobalComponents(app){// 自动导入 components 目录下的全局组件constcomponents=import.meta.glob('../components/Global*.vue')Object.entries(components).forEach(([path,component])=>{// 从路径中提取组件名constcomponentName=path.split('/').pop().replace('.vue','')// 动态注册组件component().then(module=>{app.component(componentName,module.default)})})}

创建一个全局按钮组件示例:

<!-- components/GlobalButton.vue --> <template> <button :class="[buttonClass, sizeClass, typeClass]" :disabled="disabled || loading" @click="handleClick" > <el-icon v-if="icon || loading" class="button-icon"> <component :is="loading ? 'Loading' : icon" /> </el-icon> <span v-if="$slots.default" class="button-text"> <slot /> </span> </button> </template> <script setup> import { computed } from 'vue' const props = defineProps({ type: { type: String, default: 'default', validator: (value) => [ 'default', 'primary', 'success', 'warning', 'danger', 'info' ].includes(value) }, size: { type: String, default: 'medium', validator: (value) => [ 'medium', 'small', 'mini' ].includes(value) }, icon: String, disabled: Boolean, loading: Boolean }) const emits = defineEmits(['click']) const buttonClass = computed(() => { return [ 'global-button', props.disabled ? 'is-disabled' : '', props.loading ? 'is-loading' : '' ].filter(Boolean).join(' ') }) const sizeClass = computed(() => `button-${props.size}`) const typeClass = computed(() => `button-${props.type}`) const handleClick = (event) => { if (!props.disabled && !props.loading) { emits('click', event) } } </script> <style scoped> .global-button { display: inline-flex; justify-content: center; align-items: center; line-height: 1; height: 32px; padding: 6px 12px; border: 1px solid #dcdfe6; border-radius: 4px; cursor: pointer; outline: none; transition: all 0.2s; } .global-button:not(.is-disabled):not(.is-loading):hover { border-color: #c6e2ff; background-color: #ecf5ff; color: #409eff; } .global-button.button-primary { background-color: #409eff; border-color: #409eff; color: #fff; } .global-button.button-success { background-color: #67c23a; border-color: #67c23a; color: #fff; } .global-button.button-danger { background-color: #f56c6c; border-color: #f56c6c; color: #fff; } .global-button.is-disabled { opacity: 0.6; cursor: not-allowed; } .button-icon { margin-right: 4px; } </style>

在 main.js 中使用:

// main.jsimport{createApp}from'vue'importAppfrom'./App.vue'import{registerGlobalComponents}from'@/utils/global-components'constapp=createApp(App)// 注册全局组件registerGlobalComponents(app)app.mount('#app')

在任意组件中使用全局组件:

<template> <div class="example-page"> <GlobalButton type="primary" @click="handleClick">点击我</GlobalButton> <GlobalButton type="success" icon="Check" :loading="isLoading"> 加载中 </GlobalButton> <GlobalInput v-model="inputValue" placeholder="输入内容" /> </div> </template> <script setup> import { ref } from 'vue' const inputValue = ref('') const isLoading = ref(false) const handleClick = () => { console.log('按钮被点击') } </script>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/7 19:35:54

企业级应用服务器连接失败的5个真实案例解析

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个案例库应用&#xff0c;收集整理常见的Application Server Not Connected错误案例。每个案例应包括&#xff1a;环境配置、错误现象、诊断过程、解决方案和验证结果。支持…

作者头像 李华
网站建设 2026/4/13 23:23:36

Node.js——Node.js插件系统集成与管理问题

问题难点 随着业务增长&#xff0c;应用需要引入越来越多的插件&#xff0c;如何有效管理和配置这些插件成为一大挑战。 解决方案 Egg.js提供了强大的插件系统&#xff0c;支持自动加载、依赖关系管理以及按需启用/禁用。 Demo代码&#xff1a; // config/plugin.js - 插件…

作者头像 李华
网站建设 2026/4/10 18:21:24

零基础入门:5分钟学会使用VIT模型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 设计一个面向初学者的VIT模型体验项目&#xff1a;1.提供10个预训练好的常见物体分类模型 2.拖拽上传图片即可查看分类结果 3.用颜色标记模型关注的图像区域 4.内置教学动画解释VI…

作者头像 李华
网站建设 2026/4/14 10:22:27

MongoDB Compass 结合AI:智能查询与数据可视化新体验

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个基于MongoDB Compass的AI插件&#xff0c;能够自动分析查询性能&#xff0c;提供优化建议&#xff0c;并生成可视化报告。功能包括&#xff1a;1. 查询模式识别与自动索引…

作者头像 李华
网站建设 2026/4/13 11:25:33

AI自动生成MC指令:解放你的创造力

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个AI辅助的Minecraft指令生成器&#xff0c;用户输入自然语言描述&#xff08;如生成一个自动熔炉系统或创建彩色烟花效果&#xff09;&#xff0c;系统自动转换为可执行的M…

作者头像 李华
网站建设 2026/4/15 13:08:42

Navicat Premium Lite 实战:企业级数据库管理案例

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个企业级数据库管理应用&#xff0c;支持数据迁移、备份恢复和性能监控。应用应集成Navicat Premium Lite的核心功能&#xff0c;并提供可视化界面展示数据库性能指标。使用…

作者头像 李华