uniapp使用全局组件,

在 Uniapp 中,如果你的组件是应用层组件 (例如全局悬浮按钮、全局通知栏等),并且希望它自动出现在所有页面而无需在每个页面模板中手动添加组件标签,可以通过以下两种方案实现:


方案一:通过 app.vue 挂载全局组件(推荐)

核心思路 :将组件直接写入 app.vue 的模板中,使其作为应用的根组件的一部分,覆盖所有页面。

步骤
  1. 在 app.vue 中引入组件:

    复制代码
    <!-- app.vue -->
    <template>
      <!-- 包裹所有页面 -->
      <view>
        <!-- 全局组件(通过 CSS 固定定位覆盖在所有页面上) -->
        <global-component />
        <!-- 页面内容 -->
        <page-container />
      </view>
    </template>
    
    <script>
    import GlobalComponent from '@/components/GlobalComponent.vue'
    
    export default {
      components: {
        GlobalComponent
      }
    }
    </script>
    
    <style>
    /* 通过固定定位让组件全局可见 */
    global-component {
      position: fixed;
      z-index: 9999;
      bottom: 20px;
      right: 20px;
    }
    </style>
  2. 组件特性:

    • 组件会持续存在于所有页面(即使切换页面也不会销毁)

    • 适合全局 UI 组件(如悬浮菜单、音乐播放器控件)


方案二:通过 main.js 全局注册 + 动态挂载

核心思路:将组件注册为全局组件,并通过 Vue 动态挂载到根节点,实现自动渲染。

步骤
  1. 在 main.js 中全局注册并挂载:

    复制代码
    import Vue from 'vue'
    import App from './App'
    import GlobalComponent from '@/components/GlobalComponent.vue'
    
    // 全局注册组件
    Vue.component('global-component', GlobalComponent)
    
    // 创建根实例
    const app = new Vue({
      ...App
    })
    
    // 动态挂载到根节点(确保组件在 DOM 中)
    const GlobalComponentInstance = new Vue({
      render: h => h(GlobalComponent)
    }).$mount()
    
    document.body.appendChild(GlobalComponentInstance.$el)
    
    // 挂载到 Vue.prototype,方便在任何组件内访问
    Vue.prototype.$globalComponent = GlobalComponentInstance.$children[0];
    
    app.$mount()

    组件代码:

复制代码
   <template>
   	<view>
   		<view class="GlobalBlock" @click="showShareBoom=false" v-if="showShareBoom">
   			<view class="GlobalBg"></view>
   			<img class="share_tips" :src="share_tips" alt="" srcset="" />
   		</view>
   	</view>
   </template>

   <script>
   	export default {
   		props: {
   		},
   		data() {
   			return {
   				share_tips: this.$ossPath + 'share_tips.png',
   				showShareBoom: false,
   			}
   		},
   		mounted() {},
   		methods: {
   			close() {
   				this.$emit('cancel')
   			}
   		}
   	}
   </script>

   <style lang="scss" scoped>
   	.share_tips {
   		position: fixed;
   		right: 30rpx;
   		top: 30rpx;
   		width: 460rpx;
   		z-index: 999999;
   	}

   	.GlobalBlock {
   		width: 100vw;
   		height: 100vh;
   		position: fixed;
   		top: 0;
   		left: 0;
   		right: 0;
   		bottom: 0;
   		z-index: 999998;

   		.GlobalBg {
   			width: 100vw;
   			height: 100vh;
   			position: fixed;
   			top: 0;
   			left: 0;
   			right: 0;
   			bottom: 0;
   			background: rgba(0, 0, 0, .1);
   		}

   	}
   </style>
  1. 在页面修改组件的data值:

    复制代码
     	// 显示
     	this.$globalComponent.showShareBoom = true;
     	
     	// 隐藏
     	// this.$globalComponent.showShareBoom = false;
  2. 组件特性:

    • 组件独立于页面结构,直接插入到 DOM 根节点

    • 需通过 CSS 控制位置(如 position: fixed)


方案对比

方案 适用场景 优点 缺点
app.vue 挂载 需要与页面交互的全局组件 ✅ 组件生命周期与 App 同步 ✅ 可通过 Props 传递全局数据 ❌ 需手动控制样式定位
动态挂载 完全独立于页面的全局组件 ✅ 无需修改页面结构 ✅ 适合插件式组件 ❌ 需要手动管理 DOM 节点

注意事项

  1. 样式穿透 :如果组件需要覆盖页面内容,使用 position: fixed 或 position: absolute 控制位置。

  2. 数据通信:通过 Vuex 或事件总线(Event Bus)实现全局组件与页面的数据交互。

  3. 性能优化:避免在全局组件中频繁操作 DOM 或加载过重逻辑。


最终选择

  • 如果是覆盖全屏的 UI 组件 (如全局弹窗、Loading 动画),选择 app.vue 挂载。

  • 如果是完全独立的全局功能组件 (如埋点统计、全局事件监听),选择 动态挂载。

按需选择方案后,你的组件将无需在任何页面手动引入或添加标签,真正实现应用层级的全局使用! 🚀

相关推荐
郑州光合科技余经理17 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
遗憾随她而去.2 天前
uniApp跨端开发: 解决不同平台显示差异问题
uni-app
程序鉴定师5 天前
2026年深圳小程序/App开发公司技术选型指南:从架构设计到交付标准全维度评估
java·小程序·uni-app·php·objective-c
Q26433650235 天前
【有源码】基于uni-app的旅游行程规划小程序-基于微信小程序的智慧文旅综合服务平台
java·微信小程序·小程序·uni-app·毕业设计·springboot·源代码
qq_316837756 天前
阿里云百炼 fun-asr-realtime uniapp vue3 调用
javascript·vue.js·uni-app
特创数字科技6 天前
uniapp 图片全能处理|全平台支持(鸿蒙、安卓、苹果、web),实现九宫格、水印、滤镜、压缩、拼图
uni-app
2501_916007476 天前
苹果应用商店App Store上架费用标准及原因解析
android·ios·小程序·https·uni-app·iphone·webview
00后程序员张7 天前
苹果App Store上架指南:费用、原理与步骤详解
android·ios·小程序·https·uni-app·iphone·webview
特创数字科技7 天前
【uni-app x】告别系统相机限制!三端通用自定义相机组件:任意布局、静默拍照、录像、水印叠加、连拍回图一次搞定
前端·数码相机·uni-app
Martin -Tang7 天前
uniapp app嵌套webview 弹窗方式
android·ios·uni-app