首页 > 编程语言 >如何在微信小程序中使用事件总线进行组件通信?

如何在微信小程序中使用事件总线进行组件通信?

时间:2024-10-24 19:18:52浏览次数:3  
标签:微信 总线 callbacks 事件 组件 eventBus event

  1. 创建事件总线(Event Bus)模块

    • 目的
      • 事件总线是一个独立的模块,用于管理事件的发布和订阅。它提供了一个集中的机制,使得组件之间可以通过发布和订阅事件来进行通信,而不需要依赖组件之间的父子关系或其他复杂的层级结构。
    • 代码实现
      • 创建一个名为event - bus.js的文件,在这个文件中定义事件总线的基本功能。以下是一个简单的事件总线示例:
      const eventBus = {
        callbacks: {},
        on(eventName, callback) {
          if (!this.callbacks[eventName]) {
            this.callbacks[eventName] = [];
          }
          this.callbacks[eventName].push(callback);
        },
        emit(eventName, data) {
          const callbacks = this.callbacks[eventName] || [];
          callbacks.forEach(callback => {
            callback(data);
          });
        }
      };
      export default eventBus;
      
      • 在这个事件总线中,callbacks是一个对象,用于存储不同事件名称对应的回调函数数组。on方法用于订阅事件,将回调函数添加到对应的事件数组中。emit方法用于发布事件,遍历相应事件的回调函数数组,并执行每个回调函数,同时传递数据。
  2. 在组件中使用事件总线进行通信

    • 订阅事件(组件A)
      • 目的
        • 组件A需要接收其他组件发布的事件消息,因此需要订阅相关事件。当事件被发布时,组件A中订阅的回调函数将会被执行,从而实现接收消息的功能。
      • 代码实现
        • 首先,在组件A的.js文件中引入事件总线模块。假设组件A和event - bus.js文件在同一目录下,可以这样引入:
        const eventBus = require('../../event - bus.js');
        Component({
          attached() {
            eventBus.on('custom - event - name', this.handleEvent);
          },
          detached() {
            eventBus.off('custom - event - name', this.handleEvent);
          },
          methods: {
            handleEvent(data) {
              console.log('Received data:', data);
            }
          }
        });
        
        • attached生命周期方法中,组件A通过eventBus.on方法订阅了名为custom - event - name的事件,并指定handleEvent方法作为回调函数。当该事件被发布时,handleEvent方法将会被调用,接收并处理传递的数据。在detached生命周期方法中,使用eventBus.off方法取消订阅,这是一个良好的实践,可以避免内存泄漏等问题。
    • 发布事件(组件B)
      • 目的
        • 组件B需要向其他组件发送消息,通过在组件B中发布事件来实现。发布的事件会被已经订阅该事件的组件(如组件A)接收到。
      • 代码实现
        • 同样在组件B的.js文件中引入事件总线模块:
        const eventBus = require('../../event - bus.js');
        Component({
          methods: {
            triggerEvent() {
              let data ='message from ComponentB';
              eventBus.emit('custom - event - name', data);
            }
          }
        });
        
        • triggerEvent方法中,组件B使用eventBus.emit方法发布了名为custom - event - name的事件,并传递了一个数据message from ComponentB。当这个事件被发布后,所有订阅了custom - event - name的组件(如组件A)将会收到这个数据,并执行相应的回调函数。

标签:微信,总线,callbacks,事件,组件,eventBus,event
From: https://blog.csdn.net/alankuo/article/details/143196269

相关文章

  • 如何避免在微信小程序中使用事件总线进行组件通信时出现内存泄漏?
    理解内存泄漏问题的产生原因在微信小程序中使用事件总线进行组件通信时,内存泄漏可能是由于组件在销毁后仍然被事件总线持有引用,导致无法被垃圾回收机制正常回收。例如,组件订阅了事件总线的某个事件,当组件被销毁时,如果没有正确地取消订阅,那么事件总线中仍然保存着对该组件......
  • Genymotion 模拟器上安装最新版本的微信并正常运行
    安装Genymotion安装步骤1安装虚拟机VirtualBox https://www.virtualbox.org/wiki/Downloads2注册Genymotion帐号 https://www.genymotion.com/account/create/3登录,下载并安装Genymotion https://www.genymotion.com/download/ android9版本的:  Genymotion-ARM-Tran......
  • element-ui 时间组件date-picker 去掉“此刻”二字
    用element-ui的时间组件时,想去掉“此刻”二字官方文档没有提供去掉这个的属性,网上查了一下,主要是通过给这个标签添加css属性,display:none,来隐藏。但是我在组件内的<el-col:span="span"><el-form-item:label="$t('historicalDataRetransmission.taskBeginTime')......
  • Zabbix添加企业微信机器人告警
    环境查看系统环境#cat/etc/redhat-releaseCentOSStreamrelease9#uname-aLinuxCentOSStream9Zabbix2035.14.0-391.el9.x86_64#1SMPPREEMPT_DYNAMICTueNov2820:35:49UTC2023x86_64x86_64x86_64GNU/Linux软件环境#zabbix_server--versionzabbix_......
  • KubeSphere 社区双周报|KubeSphere v4 添加 KubeEdge 扩展组件
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2024.10.11-10.24。贡献者名单近期重要更新KubeSphere......
  • 基于微信小程序的外卖点餐餐厅点餐美食点餐系统的设计与开发
    基于微信小程序的外卖点餐餐厅点餐美食点餐系统的设计与开发视频介绍:基于微信小程序的外卖点餐餐厅点餐美食点餐系统的设计与开发具体贴图链接:贴图链接缩略图如下:开发环境及工具:大等于jdk1.8,大于mysql5.5,idea,微信开发者工具技术说明:vue.js小程序java......
  • 基于微信小程序的健康生活运动社交系统的设计与开发
    基于微信小程序的健康生活运动社交系统的设计与开发视频介绍基于微信小程序的健康生活运动社交系统的设计与开发具体贴图链接:项目贴图缩略图如下:开发环境及工具:大等于jdk1.8,大于mysql5.5,idea,微信开发者工具技术说明:vue.js小程序javaspringbootmybatis......
  • 基于微信小程序的校园二手交易闲置二手交易系统的设计与开发
    基于微信小程序的校园二手交易闲置二手交易系统的设计与开发视频介绍基于微信小程序的校园二手交易闲置二手交易系统的设计与开发具体贴图链接:贴图链接缩略图如下:开发环境及工具:大等于jdk1.8,大于mysql5.5,idea,微信开发者工具技术说明:thymeleaf小程序java......
  • 微信小程序input框onfocus获取焦点的延迟问题
    今天敲代码,原本想实现的效果是:input框有placeholder,点击input,placeholder清空。好比上图,点击输入框,框内的“请输入四位XX”就会消失。原本想着是,给input框添加@focus,当input框获取到焦点的时候,清空placeholder。但是实际运行时候发现,placeholder清空......
  • Django中的ModelForm组件
    昨天开发项目的时候,发现在表单创建时,流程很繁琐,想这有没有简易方式去创建表单,结果查资料,发现django提供了一个非常简单实用且人性化的组件modelform,用起来贼快,还能做表单校验,很爽,记录一下。在Django中,modelform是一个非常有用的功能,它允许你基于Django的模型(Model)自动......