当前位置: 首页 > news >正文

全局动态组件uniapp(vue)

全局动态组件uniapp(vue)

在我们很多项目中,我们需要创建一个组件,使其他在所有的路由页都存在,比如手机上的悬浮在屏幕上的圆形快捷按钮,那么我们就需要创建一个全局组件。
创建组件时我们所考虑的主要是两个点,一个是组件的创建和销毁,第二个是组件的通信。

1.组件的创建和销毁uniapp(vue)

使用 Vue.extend() 来扩展组件构造器,并手动挂载,目前有一个组件MzFloatingBox,直接调用createCustomerService就可以实现组件创建。

import MzFloatingBox from './components/MzFloatingBox.vue';
export function createCustomerService() {
  // 扩展 MzFloatingBox 组件构造器
  const CustomerServiceConstructor = Vue.extend(MzFloatingBox);
  // 创建组件实例
  const instance = new CustomerServiceConstructor();
  // 手动挂载到一个新的 div 元素上
  instance.$mount();
  // 将组件的 DOM 元素添加到页面上
  document.body.appendChild(instance.$el);
  // 返回组件实例(可以操作组件中的方法或数据)
  return instance;
}

组件销毁时,使用组件实例的 $destroy() 方法,然后移除组件的 DOM 元素。

export function destroyCustomerService(instance) {
  instance.$destroy();  // 销毁组件实例
  document.body.removeChild(instance.$el);  // 移除 DOM 元素
}

如果当前版本为vue3版本的话,那么需要使用createApp()来创建组件实例,并且需要使用unmount()方法来销毁组件实例。

  import { createApp } from 'vue';
  import MzFloatingBox from './components/MzFloatingBox.vue';

  export function createCustomerService() {
    const app = createApp(MzFloatingBox); // 创建 Vue 实例

    const instance = app.mount(document.createElement('div')); // 挂载到一个新的 DOM 元素上
    document.body.appendChild(instance.$el); // 将挂载后的 DOM 添加到页面上

    // 可以通过 instance 调用组件中的方法或数据
    return instance; 
  }

销毁功能同上一样。

2.组件的通信uniapp

如果在uniapp中时,可以直接使用uni.eventBus来实现组件的通信,但是需要注意的是,在uniapp中,eventBus是一个全局变量,所以不需要在组件中引入,直接使用即可. 详细文档请点击传送门查看,具体代码如下:

// 触发自定义事件
uni.$emit('mzFloatingBox', true)
// 监听自定义事件
uni.$on('mzFloatingBox', data => {
  // do something
})
// 销毁自定义事件
uni.$off('mzFloatingBox', callback)

如果在vue中(vue2和vue3都支持),可以使用mitt来作为事件总线,具体可点击传送门查看,具体代码如下:

  1. 安装mitt
  npm install mitt
  1. 创建一个 eventBus.js 来封装 mitt 的功能
 // src/eventBus.js
 import mitt from 'mitt';

 const eventBus = mitt();

 export default eventBus;
  1. 在组件中使用 EventBus
    发送事件(emit)
  // 组件1: 发送事件
  <template>
    <button @click="sendEvent">发送事件</button>
  </template>

  <script>
  import eventBus from '@/eventBus';

  export default {
    name: 'Component1',
    methods: {
      sendEvent() {
        eventBus.emit('customEvent', 'Hello from Component1');
      }
    }
  }
  </script>
监听事件(on)
  // 组件2: 监听事件
  <template>
    <div>{{ message }}</div>
  </template>

  <script>
  import { onMounted, ref, onUnmounted } from 'vue';
  import eventBus from '@/eventBus';

  export default {
    name: 'Component2',
    setup() {
      const message = ref('');

      const handleEvent = (msg) => {
        message.value = msg;
      };

      onMounted(() => {
        eventBus.on('customEvent', handleEvent);
      });

      onUnmounted(() => {
        eventBus.off('customEvent', handleEvent);
      });

      return {
        message
      };
    }
  }
  </script>
  • eventBus.emit(‘customEvent’, data):在组件 1 中,发送一个名为 customEvent 的事件,并传递数据(如 “Hello from Component1”)。
  • eventBus.on(‘customEvent’, handler):在组件 2 中,监听 customEvent 事件并接收数据,通过 handler 函数来处理。
  • eventBus.off(‘customEvent’, handler):在组件销毁时,取消事件监听,防止内存泄漏。
  • 除了 mitt,你还可以使用 Vuex 或 provide/inject 等官方推荐的方式来进行跨组件通信.但是provide/inject局限于父子/爷孙组件通信

相关文章:

  • ubuntu22.04离线安装nginx
  • 用promptfoo做大模型安全性测评
  • P8598 [蓝桥杯 2013 省 AB] 错误票据
  • 深入理解ES6核心特性:现代JavaScript开发的基石
  • 用WebSocket改造优化若依在线用户实时监控
  • WLAN无线2.4G/5G频段划分和可用信道
  • 基于微信小程序的电影院订票选座系统的设计与实现,SSM+Vue+毕业论文+开题报告+任务书+指导搭建视频
  • 使用useVModel简化 Vue 组件中 v-model 的实现
  • 如何创建自定义权限的kubeconfig
  • springboot399-中文社区交流平台(源码+数据库+纯前后端分离+部署讲解等)
  • http状态码503之解决方法(Solution to HTTP Status Code 503)
  • 微信小程序通过http通信控制庐山派
  • [RabbitMQ] 常见面试题汇总 | 工作流程 | 消息可靠性 | 消息顺序性 | 幂等性 | 高级特性 | 延迟队列 | 仲裁队列 | 工作模式 | 消息积压 | 推拉模式
  • 实时图像与视频超分辨率:高效子像素卷积网络(ESPCN)解析
  • CLIP论文学习
  • 985本硕,网络安全方向,走算法还是走开发?
  • 【会议预告】人工智能与材料国际学术会议
  • 沃丰科技大模型标杆案例 | 索尼大模型智能营销机器人建设实践
  • 短视频矩阵碰一碰发视频源码技术开发,支持OEM
  • bypy的依赖库版本问题
  • 美国调整对华加征关税
  • 赖清德为“临阵脱逃”作准备,国台办:绝不会任“台独”祸首逍遥法外
  • 国台办:80年前台湾重归中国版图,80年后不可能让台湾分裂出去
  • 中美日内瓦经贸会谈联合声明
  • 1至4月我国汽车产销量首次双超千万辆
  • 来伊份:已下架涉事批次蜜枣粽产品,消费者可获额外补偿,取得实物后进一步分析