前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微信小程序全局事件订阅

微信小程序全局事件订阅

作者头像
前端小书童
发布2023-09-02 10:14:11
2990
发布2023-09-02 10:14:11
举报
文章被收录于专栏:前端小书童前端小书童

在Vue开发中,我们可能用过eventBus来解决全局范围内的事件订阅及触发逻辑,在微信小程序的开发中我们可能也也会遇到同样的需求,那么我们尝试下在小程序(原生小程序开发)中实现类似eventBus的事件订阅功能。

全局事件订阅

全局实例 在Vue中我们有new Vue得到的全局对象,小程序中对应的则是app对象,在小程序组件或者页面中可以通过getApp()获取;

事件订阅 声明对象存储事件,示例中使用map存储eventMap,向存储器中存放需要被触发的事件

代码语言:javascript
复制
// 注意 开发阶段热跟新时,eventMap的声明和触发可能存在异步问题,需要阻断eventMap声明在触发之后的情况,这个问题仅限开发阶段存在
on(action, event) {
 if (eventMap && !eventMap.has(action)) {
  eventMap.set(action, event)
 }
}

事件触发 当业务逻辑需要触发时,调用emit触发指定事件

代码语言:javascript
复制
emit(action, arg) {
 if (eventMap && eventMap.has(action)) {
  eventMap.get(action) && eventMap.get(action)(arg)
 }
}

事件卸载 当订阅的事件过多或者确定事件不在被触发时,及时卸载事件可以减少内存压力

代码语言:javascript
复制
off(action) {
 if (eventMap && eventMap.has(action)) {
  eventMap.delete(action)
 }
}

整体代码如下(文件:app.js):

代码语言:javascript
复制
const eventMap = new Map()
App({
 globalData: {
  count: 1
 },
  // 事件订阅
 on(action, event) {
  if (eventMap && !eventMap.has(action)) {
   eventMap.set(action, event)
  }
   },
  // 事件卸载
 off(action) {
  if (eventMap && eventMap.has(action)) {
   eventMap.delete(action)
  }
   },
  // 事件触发
 emit(action, arg) {
  if (eventMap && eventMap.has(action)) {
   eventMap.get(action) && eventMap.get(action)(arg)
  }
 }
})
页面或者组件中使用
  1. 订阅on,订阅自定义事件countAdd(自定义事件名),并且传入事件被触发后需要被触发的逻辑,这里的changeCount就是在事件被触发是订阅触发的数据,当然触发事件的参数可以来自emit也可以无参数
代码语言:javascript
复制
const app = getApp()
Page({
 data: {
  count: app.globalData.count,
 },
 created() {
  // 注册事件
  app.on('countAdd', this.changeCount.bind(this))
 },
 changeCount(count) {
  this.setData({
   count
  })
 }
})
  1. 发布emit,发布自定义事件countAdd(自定义事件名)来触发所有监听该事件的订阅者(既注册了on的组件或者页面),emit携带的参数也会被传递给自定义事件
代码语言:javascript
复制
const app = getApp()
Component({
 data: {
  count: app.globalData.count,
 },
 // 触发事件
 bindEvent() {
  app.emit('countAdd', this.data.count++)
 }
})

这里changeCount是最终被触发的事件,countAdd是在订阅服务中自定义的事件名,之所以不使用相同的事件名,主要是区分下。

整体事件触发逻辑如下:
  1. 先订阅事件 changeCount
  2. 业务需要触发的时候触发bindEvent
  3. emit到全局来调用监听的事件
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-08-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端小书童 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 全局事件订阅
    • 页面或者组件中使用
    • 整体事件触发逻辑如下:
    相关产品与服务
    云开发 CloudBase
    云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档