微信小程序 自定义全局事件监听实现

一般app页面都需要关联刷新,比如登录后刷新登录前页面,故此,需要一个全局事件监听类,怎么实现呢?

根目录创建文件夹utils,新建文件eventBus.js(致敬java平台的EventBus),码入以下代码:

javascript 复制代码
/**
  by ppg
  1282797911@qq.com
  2023.8.26
**/
const eventBus = {

  post: function ({ // 发送事件
    params: params, // 事件参数
    event: event // 事件名称
  }) {
    for (var eventMap of _map) {
      for (var obj of eventMap[1]) {
        if (obj[0] == event) {
          obj[1](params)
        }
      }
    }
  },

  off: function ({ // 移除使用该key添加的所有监听事件
    key: key, // key,通过newKey()获取
  }) {
    _map.delete(key)
  },

  /**
   * {
   *  'key': {
   *    'event': listener
   *  }
   * }
   * **/
  on: function ({ // 开始监听event事件
    key: key, // key,通过newKey()获取
    event: event, // 事件名称
    listener: listener // 回调
  }) {
    var eventMap = _map[key]
    if (eventMap == null) {
      eventMap = new Map()
      _map.set(key, eventMap)
    }
    eventMap.set(event, listener)
  },

  newKey: function (params) { // 获取key
    _key ++
    return _key
  }

}

var _key = -1 // 根key
const _map = new Map() // 储存key和监听的关联数组

module.exports = {
  eventBus
}

主要就是newKey、on、off、post方法,分别是创建key、开始监听、结束监听、发出事件等功能实现。

来看看用法:

首先是添加调用方式,打开app.js,这里onLaunch方法里添加一下代码,将调用方法添加到wx对象下:

javascript 复制代码
// app.js
App({
  onLaunch() {
    wx.eventBus = require('utils/eventBus.js').eventBus
  }
})

然后在是调用:

javascript 复制代码
Page({
  onLoad() {
    this.key = wx.eventBus.newKey()
    wx.eventBus.on({
      key: this.key,
      event: 'change',
      listener: function (params) {
        console.log('change回调')
        console.log(params)
      }
    })
  },
  onReady() {
    wx.eventBus.post({
      params: {
        tips: '回调的参数'
      },
      event: 'change'
    })
  },
  onUnload() {
    wx.eventBus.off({
      key: this.key
    })
  }
})

说明一下代码:

1.onLoad()里调用newKey()生成key,这个key将作为页面的标识符,添加和移除全部的事件监听时需要;

2.onReady()里调用post()发出事件,并携带了参数;

3.onUnload()里移除了当前页面全部的监听事件。

相关推荐
河北清兮网络科技2 小时前
石家庄做一套企业知识库系统多少钱?2026 报价明细
小程序·短剧app·广告联盟
Ai-_Man3 小时前
Coze扣子还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·1024程序员节
微订校园外卖平台4 小时前
新手做校园外卖平台:小程序启动顺序与订单链路验收
小程序·外卖系统·本地生活·微订
计算机毕设定制辅导-无忧学长5 小时前
《基于物品协同过滤的闲置书换购微信小程序设计开发》
java·vue.js·spring boot·微信小程序·uniapp·闲置书换购微信小程序·物品协同过滤算法
ngaiwe15 小时前
AA我来算小程序实践:把付款人、承担人和结算状态分开建模
微信小程序
FX1317887KP_1 天前
KET口语Part 2看图对话怎么练?“观察—提问—回应”;三步法讲透
小程序·ket口语·pet口语·fce备考·剑桥英语
上线再说1 天前
小程序图片处理从 2.9 秒到 420 毫秒:云函数冷启动的 5 个坑
微信小程序
沃达德软件1 天前
智慧教育教学资源管理系统(PC端+微信小程序)
微信小程序·小程序
阿俊-全栈开发1 天前
LikeShop 小程序商城首页可配置弹窗的设计与实现(Java + uni-app)
小程序·状态模式·likeshop·likeshop开源商城
考拉讲支付2 天前
延迟分账 / 核销分账的技术实现方案:服务完成后再分钱,到底怎么设计?
大数据·运维·人工智能·微信小程序·小程序·系统架构