写一个 EventBus 实现微信小程序的发布订阅,支持全局消息通知、跨页面通信,高效好用!

eventBus.js

在微信小程序中实现发布/订阅模式可以通过创建一个简单的事件管理器来实现。这个事件管理器将负责注册事件监听器、触发事件以及移除监听器。下面是一个具体的实现示例:

1. 创建事件管理器

首先,我们创建一个单独的文件 eventBus.js 来管理事件的发布和订阅。

// eventBus.js
class EventBus {constructor() {this.events = {};}// 订阅事件on(eventName, callback) {if (!this.events[eventName]) {this.events[eventName] = [];}this.events[eventName].push(callback);}// 触发事件emit(eventName, ...args) {const callbacks = this.events[eventName];if (callbacks) {callbacks.forEach((callback) => callback(...args));}}// 移除事件监听器off(eventName, callback) {if (this.events[eventName]) {this.events[eventName] = this.events[eventName].filter((cb) => cb !== callback);}}
}const eventBus = new EventBus();export default eventBus;

2. 在 app.js 中使用事件管理器

app.js 中,我们可以使用事件管理器来触发用户信息更新的事件。

// app.js
import eventBus from "./utils/eventBus";App({globalData: {userInfo: null,},onLaunch: function () {// 模拟异步请求用户信息wx.request({url: "your-api-url",method: "GET",success: (res) => {this.globalData.userInfo = res.data; // 更新全局数据eventBus.emit("userInfoUpdated", res.data); // 触发用户信息更新事件},fail: () => {// 错误处理},});},
});

3. 在页面中订阅事件

在页面中,我们可以订阅 userInfoUpdated 事件,并在事件触发时更新页面数据。

// pages/index/index.js
import eventBus from "../../utils/eventBus";Page({data: {userInfo: null,},onLoad: function () {const app = getApp();this.setData({ userInfo: app.globalData.userInfo }); // 初始化数据this.subscribeToUserInfoUpdate();},subscribeToUserInfoUpdate: function () {eventBus.on("userInfoUpdated", (userInfo) => {this.setData({ userInfo });});},onUnload: function () {// 移除事件监听器,防止内存泄漏eventBus.off("userInfoUpdated", this.handleUserInfoUpdate);},handleUserInfoUpdate: function (userInfo) {this.setData({ userInfo });},
});

解释

  1. 事件管理器 (eventBus.js)

    • on(eventName, callback):注册一个事件监听器。
    • emit(eventName, ...args):触发一个事件,所有注册的回调函数都会被执行。
    • off(eventName, callback):移除一个事件监听器。
  2. app.js

    • onLaunch 中发起请求获取用户信息。
    • 当请求成功时,更新 globalData 并触发 userInfoUpdated 事件。
  3. 页面 (index.js)

    • onLoad 中初始化用户信息。
    • 订阅 userInfoUpdated 事件,并在事件触发时更新页面数据。
    • onUnload 中移除事件监听器,防止内存泄漏。

通过这种方式,你可以实现一个简单的发布/订阅模式,使得不同页面之间能够高效地通信和同步数据。

⚠️ 注意

务必记得在离开页面的时候,移出事件监听器,不然不只是什么性能问题,而是会触发所有未移出的回调方法

可以参考下面这段伪代码:

// chat.js - 这是需要监听的页面逻辑/*** 生命周期函数--监听页面加载*/
onLoad() {// 订阅消息通知this.initEventBus();
},/*** 生命周期函数--监听页面卸载*/
onUnload() {// 取消订阅this.closeEventBus();
},/** 订阅消息通知 */
initEventBus() {// 监听聊天好友消息eventBus.on("chatMsgResponse", this.chatMsgResponseCb);
},/** 取消订阅 */
closeEventBus() {// 监听聊天好友消息eventBus.off("chatMsgResponse", this.chatMsgResponseCb);
},/** 监听事件的回调函数 */
chatMsgResponseCb(response) {console.log('[chatMsgResponseCb] 当前聊天中的好友消息 response:', response);// todo ...
},

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/58766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

东胜物流软件 AttributeAdapter.aspx SQL 注入漏洞复现

0x01 产品简介 东胜物流软件是青岛东胜伟业软件有限公司一款集订单管理、仓库管理、运输管理等多种功能于一体的物流管理软件。该公司初创于2004年11月(前身为青岛景宏物流信息技术有限公司),专注于航运物流相关环节的产品和服务。东胜物流信息管理系统货代版采用MS-SQLser…

PVE纵览-备份与快照指南

PVE纵览-备份与快照指南 文章目录 PVE纵览-备份与快照指南摘要1 备份与快照概述定义与区别备份与快照在PVE中的应用场景 2 PVE 备份功能详解备份类型与策略配置备份任务自动化备份管理 3 PVE 快照功能详解快照的工作原理快照的创建与恢复机制快照对系统性能的影响快照的使用场景…

Mac如何实现最简单的随时监测实时运行状态的方法

Mac book有着不同于Windows的设计逻辑与交互设计,使得Mac book有着非常棒的使用体验,但是在Mac电脑的使用时间过长时,电脑也会出现响应速度变慢或应用程序崩溃的情况,当发生的时候却不知道什么原因导致的,想要查询电脑…

JavaWeb合集23-文件上传

二十三 、 文件上传 实现效果&#xff1a;用户点击上传按钮、选择上传的头像&#xff0c;确定自动上传&#xff0c;将上传的文件保存到指定的目录中&#xff0c;并重新命名&#xff0c;生成访问链接&#xff0c;返回给前端进行回显。 1、前端实现 vue3AntDesignVue实现 <tem…

Leetcode 34 Find First and Last Position of Element in Sorted Array

题意&#xff1a;找到非严格递增的数组中和target相等的左右边界 https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/description/ 解答&#xff1a; 经典二分&#xff0c;找左右边界&#xff0c;要查看l是否满足题意 class Solution …

LinkedList和单双链表。

java中提供了双向链表的动态数据结构 --- LinkedList&#xff0c;它同时也实现了List接口&#xff0c;可以当作普通的列表来使用。也可以自定义实现链表。 单向链表&#xff1a;一个节点本节点数据下个节点地址 给定两个有序链表的头指针head1和head2&#xff0c;打印两个链表…

实现简易开屏弹窗

要实现一个简易的开屏弹窗&#xff0c;并展示一些文章内容&#xff0c;以下是一个简单的HTML和CSS实现。这个弹窗会在页面加载时显示&#xff0c;并包含一个标题和一些文章内容。用户可以点击按钮关闭弹窗&#xff0c;关闭后&#xff0c;弹窗的状态会保存在浏览器的 sessionSto…

WPF之iconfont(字体图标)使用

1&#xff0c;前文&#xff1a; WPF的Xaml是与前端的Html有着高度相似性的标记语言&#xff0c;所以Xaml也可同Html一般轻松使用阿里提供的海量字体图标&#xff0c;从而有效的减少开发工作度。 2&#xff0c;下载字体图标&#xff1a; 登录阿里图标库网iconfont-阿里巴巴矢量…

图神经网络(GNN)入门笔记(2)——从谱域理解图卷积,ChebNet和GCN实现

一、谱域图卷积&#xff08;Spectral Domain Graph Convolution&#xff09; 与谱域图卷积&#xff08;Spectral Domain Graph Convolution&#xff09;对应的是空间域&#xff08;Spatial Domain&#xff09;图卷积。本节学习的谱域图卷积指的是通过频率来理解卷积的方法。 …

leetcode92:反转链表||

给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#xff1a;[1,4,3,2…

知识图谱是如何通过数据集构建的,比如通过在MSCOCO和Flickr30k数据集和Visual Genome数据集

系列博客目录 文章目录 系列博客目录1. 数据准备与实体识别2. 关系抽取3. 图结构构建4. 图嵌入学习5. 知识图谱存储与查询示例&#xff1a;通过 Visual Genome 构建一个简单的知识图谱 构建知识图谱通常涉及从数据集中提取实体和关系&#xff0c;并将其结构化为图的形式。在 MS…

Python-安装与PyCharm的安装配置(1)

目录 安装 打开运行 PyCharm的安装 新建项目 安装 找到官网下载对应的电脑对应的版本 Welcome to Python.org -- 官网 下载稳定版的 安装记得勾选配置环境&#xff0c;这样自己就不需要再配置环境了 安装成功 至此python的运行环境就安装好了 打开运行 在开始菜单中可以…

XGBoost算法Python代码实现(单棵树类)

### XGBoost单棵树类 class XGBoost_Single_Tree(BinaryDecisionTree):# 结点分裂方法def node_split(self, y):# 中间特征所在列feature int(np.shape(y)[1]/2)# 左子树为真实值&#xff0c;右子树为预测值y_true, y_pred y[:, :feature], y[:, feature:]return y_true, y_p…

python的编程基础分支,循环与函数的应用知识

编程基础是学习任何编程语言的必备知识之一。在Python中&#xff0c;分支、循环和函数是常用的编程概念&#xff0c;它们可以让我们编写出更复杂、更灵活的程序。 分支 分支是根据条件来决定程序执行的不同路径。在Python中&#xff0c;我们使用if语句来实现分支。 if 条件:# …

营业执照OCR识别API接口如何用C#调用

服务器和计算设备的性能不断提升&#xff0c;为 OCR 识别提供了更强大的计算能力支持。更快的 CPU、GPU 以及分布式计算技术的应用&#xff0c;使得营业执照图片的处理速度大幅加快&#xff0c;能够在更短的时间内完成大量营业执照的识别工作。 研发人员不断对 OCR 识别算法进…

qt QLocale详解

1、概述 QLocale是Qt框架中的一个类&#xff0c;用于处理与本地化相关的操作。它能够方便地实现日期、时间、数字和货币的格式化和解析&#xff0c;支持不同的语言、区域设置和字符集。QLocale提供了一种跨平台的方式来获取当前系统的语言设置&#xff0c;并返回该语言的本地化…

微服务架构面试内容整理-Eureka

Spring Cloud Netflix 是一个为构建基于 Spring Cloud 的微服务应用提供的解决方案,利用 Netflix 的开源组件来实现常见的分布式系统功能。以下是 Spring Cloud Netflix 的一些主要组件和特点: 服务注册与发现:Eureka 是一个 RESTful 服务,用于注册和发现微服务。服务实例在…

缓存、注解、分页

一.缓存 作用&#xff1a;应用查询上&#xff0c;内存中的块区域。 缓存查询结果&#xff0c;减少与数据库的交互&#xff0c;从而提高运行效率。 1.SqlSession 缓存 1. 又称为一级缓存&#xff0c;mybatis自动开启。 2. 作用范围&#xff1a;同一…

uniapp vue3 使用echarts-gl 绘画3d图表

我自己翻遍了网上&#xff0c;以及插件市场&#xff0c;其实并没有uniapp 上使用echarts-gl的样例&#xff0c;大多数都是使用插件市场的echarts的插件 开始自己尝试直接用echartsgl 没有成功&#xff0c;后来尝试使用threejs 但是也遇到一些问题&#xff0c;最后我看官网的时…

【言语理解】片段阅读整体概述

1.1 题型分类 片段阅读一般有以下六种&#xff1a; 中心理解题 “这段文字意在说明&#xff1a;” “这段文字意在强调&#xff1a;” “这段文字主要介绍了&#xff1a;” “下列对文意概括最恰当的是&#xff1a;”标题拟定题 “最适合做这段文字标题的是&#xff1a;”下文…