news 2026/5/3 3:28:23

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/24 15:16:39

前端——前端性能优化核心策略

前端性能优化主要围绕减少资源加载时间和提升运行时效率展开。 重点难点&#xff1a; 关键渲染路径优化&#xff1a;CSS、JS 的加载和执行优化资源懒加载&#xff1a;图片、组件、路由的懒加载实现缓存策略&#xff1a;HTTP 缓存和浏览器缓存的最佳实践 // 图片懒加载实现 cons…

作者头像 李华
网站建设 2026/5/1 10:55:17

Node.js—— Node.js 应用架构与启动流程问题

问题难点 在大型Node.js应用中&#xff0c;如何有效地组织应用架构&#xff0c;管理多个进程&#xff0c;以及优雅地启动和关闭应用是常见难题。 解决方案 Egg.js通过Cluster模式和单进程模式来解决这个问题&#xff0c;提供了灵活的启动机制。 Demo代码&#xff1a; // a…

作者头像 李华
网站建设 2026/5/1 10:13:20

突破ComfyUI下载瓶颈:Aria2加速方案实战指南

突破ComfyUI下载瓶颈&#xff1a;Aria2加速方案实战指南 【免费下载链接】ComfyUI-Manager 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Manager 问题诊断&#xff1a;下载困境的根源剖析 在AI模型训练与推理的工作流中&#xff0c;下载速度往往成为效率瓶颈…

作者头像 李华
网站建设 2026/5/2 19:31:39

Qwen3-14B学术研究:C-Eval 83分模型部署验证教程

Qwen3-14B学术研究&#xff1a;C-Eval 83分模型部署验证教程 1. 为什么Qwen3-14B值得你花10分钟部署验证 你有没有遇到过这样的困境&#xff1a;想在本地跑一个真正能做学术推理的大模型&#xff0c;但Qwen2-72B显存吃不下&#xff0c;Qwen2-7B又总觉得“差点意思”&#xff…

作者头像 李华
网站建设 2026/4/25 20:08:22

BERT模型版权风险?合规使用与商用授权实战指南

BERT模型版权风险&#xff1f;合规使用与商用授权实战指南 1. 什么是BERT智能语义填空服务 你有没有遇到过这样的场景&#xff1a;写文案时卡在某个词上&#xff0c;反复推敲却总找不到最贴切的表达&#xff1b;校对文档时发现一句“今天心情很[MASK]”&#xff0c;却想不起该…

作者头像 李华
网站建设 2026/4/28 3:45:00

帧率卡顿影响操作?解锁工具帮你突破游戏性能限制

帧率卡顿影响操作&#xff1f;解锁工具帮你突破游戏性能限制 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 为什么同样的硬件配置&#xff0c;有人能稳定120帧而你却卡在60帧&#xff1…

作者头像 李华