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

微信小程序中的全局事件总线,原生JS编写

在微信小程序里,全局事件总线(Event Bus)是一种常用的实现组件间通信的方式,它能帮助不同页面或组件之间进行消息传递,实现松耦合通信。下面为你详细介绍微信小程序全局事件总线的相关内容:

实现原理

全局事件总线本质上是一个事件管理对象,它维护着一个事件队列,用于存储事件名称和对应的回调函数。当某个组件触发一个事件时,事件总线会遍历该事件对应的回调函数列表,并依次执行这些回调函数,从而实现消息的传递。

实现步骤

1. 创建全局事件总线模块

在小程序项目中创建一个新的 JavaScript 文件,例如 eventBus.js,用于实现全局事件总线的功能。以下是一个简单的实现示例:

// eventBus.js
const eventBus = {
    events: {},
    // 监听事件
    on(eventName, callback) {
        if (!this.events[eventName]) {
            this.events[eventName] = [];
        }
        this.events[eventName].push(callback);
    },
    // 触发事件
    emit(eventName, ...args) {
        if (this.events[eventName]) {
            this.events[eventName].forEach(callback => {
                callback(...args);
            });
        }
    },
    // 移除事件监听
    off(eventName, callback) {
        if (this.events[eventName]) {
            this.events[eventName] = this.events[eventName].filter(cb => cb!== callback);
        }
    }
};

export default eventBus;

上述代码定义了一个 eventBus 对象,包含三个主要方法:

  • on:用于监听指定事件,并将回调函数添加到该事件的回调函数列表中。
  • emit:用于触发指定事件,会遍历该事件的回调函数列表并依次执行。
  • off:用于移除指定事件的某个回调函数。
2. 在需要的页面或组件中引入并使用事件总线

在需要进行事件通信的页面或组件中引入 eventBus.js 文件,并使用其中的方法。

发送事件示例

// 在某个页面或组件中触发事件
import eventBus from './eventBus.js';

// 触发名为 'message' 的事件,并传递参数
eventBus.emit('message', '这是一条消息');

接收事件示例

// 在另一个页面或组件中监听事件
import eventBus from './eventBus.js';

Page({
    onLoad() {
        // 监听名为 'message' 的事件
        eventBus.on('message', (msg) => {
            console.log('接收到消息:', msg);
        });
    },
    onUnload() {
        // 页面卸载时移除事件监听,防止内存泄漏
        eventBus.off('message', this.handleMessage);
    },
    handleMessage(msg) {
        console.log('接收到消息:', msg);
    }
});

注意事项

  • 内存泄漏问题:在组件或页面销毁时,需要及时移除事件监听,避免内存泄漏。可以在组件的 detached 生命周期函数或页面的 onUnload 生命周期函数中调用 off 方法移除监听。
  • 事件命名冲突:在使用事件总线时,要注意事件名称的唯一性,避免不同组件或页面使用相同的事件名称导致冲突。可以采用命名空间或前缀的方式来区分不同模块的事件。
  • 性能问题:如果事件总线中注册的事件和回调函数过多,可能会影响性能。因此,要合理使用事件总线,避免不必要的事件监听和触发。

通过使用全局事件总线,你可以方便地实现微信小程序中不同组件和页面之间的通信。


http://www.kler.cn/a/572772.html

相关文章:

  • Maven入门教程
  • Windows权限维持之利用安全描述符隐藏服务后门进行权限维持(八)
  • 初识Qt · 信号与槽 · 自定义和参数
  • 自然语言处理:文本分类
  • CS144 Lab Checkpoint 5: down the stack (the network interface)
  • Element UI-Select选择器结合树形控件终极版
  • Ruby爬虫如何控制并发数量:爬取京东电子产品
  • 如何在matlab中创建自己的库
  • CSS【实战】模拟 html 的 title 属性(鼠标悬浮显示提示文字)
  • OBOO鸥柏丨LCD液晶室外AI触控屏广告一体机,服务区交互新趋势
  • python:pymunk + pygame 模拟六边形中小球弹跳运动
  • 文件上传漏洞:upload-labs靶场11-20
  • RISCV下Dovetail移植(2)——原子操作
  • TikTok矩阵系统介绍
  • 特辣的海藻!8
  • @PostConstruct注解的作用
  • 【前端学习笔记】Git 原理及面试题
  • 用本地浏览器打开服务器上使用的Tensorboard
  • 自学微信小程序的第十三天
  • 【Spring Boot 应用开发】-04-02 自动配置-数据源-手撸一个最简持久层工具类