微信小程序全局事件訂閱eventBus

微信小程序全局事件訂閱

在Vue開發中,我們可能用過eventBus來解決全局范圍內的事件訂閱及觸發邏輯,在微信小程序的開發中我們可能也也會遇到同樣的需求,那么我們嘗試下在小程序(原生小程序開發)中實現類似eventBus的事件訂閱功能。

全局事件訂閱

  1. 全局實例
    在Vue中我們有new Vue得到的全局對象,小程序中對應的則是app對象,在小程序組件或者頁面中可以通過getApp()獲取;
  2. 事件訂閱
    聲明對象存儲事件,示例中使用map存儲eventMap,向存儲器中存放需要被觸發的事件
    // 注意 開發階段熱跟新時,eventMap的聲明和觸發可能存在異步問題,需要阻斷eventMap聲明在觸發之后的情況,這個問題僅限開發階段存在
    on(action, event) {if (eventMap && !eventMap.has(action)) {eventMap.set(action, event)}
    }
    
  3. 事件觸發
    當業務邏輯需要觸發時,調用emit觸發指定事件
    emit(action, arg) {if (eventMap && eventMap.has(action)) {eventMap.get(action) && eventMap.get(action)(arg)}
    }
    
  4. 事件卸載
    當訂閱的事件過多或者確定事件不在被觸發時,及時卸載事件可以減少內存壓力
    off(action) {if (eventMap && eventMap.has(action)) {eventMap.delete(action)}
    }
    

整體代碼如下(文件:app.js):

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也可以無參數
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攜帶的參數也會被傳遞給自定義事件
const app = getApp()
Component({data: {count: app.globalData.count,},// 觸發事件bindEvent() {app.emit('countAdd', this.data.count++)}
})

這里changeCount是最終被觸發的事件,countAdd是在訂閱服務中自定義的事件名,之所以不使用相同的事件名,主要是區分下。

整體事件觸發邏輯如下:

  1. 先訂閱事件 changeCount
  2. 業務需要觸發的時候觸發bindEvent
  3. emit到全局來調用監聽的事件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41306.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41306.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41306.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大模型技術實踐(一)|ChatGLM2-6B基于UCloud UK8S的創新應用

近半年來,通過對多款主流大語言模型進行了調研,我們針對其訓練方法和模型特點進行逐一分析,方便大家更加深入了解和使用大模型。本文將重點分享ChatGLM2-6B基于UCloud云平臺的UK8S實踐應用。 01各模型結構及特點 自從2017年6月谷歌推出Transf…

FlexTools plugin and 3dWindow plugin for SketchUp Crack

FlexTools v2.3.6 plugin for SketchUp 3dWindow v.4.5 plugin for SketchUp 建筑師和3D藝術家使用FlexTools創建SketchUp門、窗、樓梯和其他建筑元素,具有卓越的速度和控制水平。 SketchUp功能強大但易于使用的擴展。對于在施工圖或建筑圖中使用SketchUp的每個人…

數學建模:論文排版技巧及圖表公式規范制作

Excel 論文樣式提前設置利用題注和表注能夠自動排序mac m1 mathtype沒有永久版,淘寶價格比官網低 編輯公式注意事項: 1、公式居中,標號為英文狀態輸入并右對齊。 2、中英文狀態下,對應字母的狀態不同,請合理選擇。 3、…

034_小馳私房菜_[問題復盤] Qcom平臺,某些三方相機拍照旋轉90度

全網最具價值的Android Camera開發學習系列資料~ 作者:8年Android Camera開發,從Camera app一直做到Hal和驅動~ 歡迎訂閱,相信能擴展你的知識面,提升個人能力~ 【一、問題】 某些三方相機,預覽正常,拍照旋轉90度 【二、問題排查】 1 ) HAL這邊Jpeg編碼數據在哪個地方…

C# 隨機法求解線性規劃問題 蒙特卡洛

線性規劃問題: max3x12x2 x12x2<5 2x1x2<4 4x13x2<9 x1>0 x2>0 正確的結果:x11.5; x21, max z6.5 Random random1 new Random(DateTime.Now.Millisecond);Random random2 new Random(DateTime.Now.Millisecond*DateTime.Now.Millisecond);double max-9999,x1…

Pycharm與Anaconda Python的開發環境搭建

目錄 一&#xff1a;下載 二&#xff1a;安裝python 三&#xff1a;設置Pycharm 一&#xff1a;下載 下載Anaconda&#xff1a; Anaconda | The World’s Most Popular Data Science Platform 安裝好以后&#xff0c;設置一下環境變量&#xff1a; 打開命令行&#xff0c…

UI界面設置

文章目錄 1. 修改 share.html 內容如下&#xff1a;2. 修改 html 文件格式為 utf-83.保存&#xff0c;運行程序4. 訪問頁面 1. 修改 share.html 內容如下&#xff1a; <!DOCTYPE html><html> <head><meta charset"utf-8"><title>1v1屏…

uniapp 官方擴展組件 uni-combox 實現:只能選擇不能手寫(輸入中支持過濾顯示下拉列表)

uniapp 官方擴展組件 uni-combox 實現&#xff1a;只能選擇不能手寫&#xff08;輸入中支持過濾顯示下拉列表&#xff09; uni-comboxuni-combox 原本支持&#xff1a;問題&#xff1a; 改造源碼參考資料 uni-combox uni-combox 原本支持&#xff1a; 下拉選擇。輸入關鍵字&am…

【002】學習筆記之typescript的【任意類型】

任意類型 頂級類型&#xff1a;any類型和 unknown 類型 any類型 聲明變量的時候沒有指定任意類型默認為any任意類型都可以賦值給any&#xff0c;不需要檢查類型。也是他的弊端如果使用any 就失去了TS類型檢測的作用 unknown 類型 TypeScript 3.0中引入的 unknown 類型也被認為…

WSL2 ubuntu子系統換源

文章目錄 1.直接編輯/etc/apt/sources.list文件&#xff08;需要使用 sudo&#xff09;:2.將文件中的內容刪除&#xff0c;將以下對應版本鏡像源復制到里面。ubuntu的鏡像源 3.更新 1.直接編輯/etc/apt/sources.list文件&#xff08;需要使用 sudo&#xff09;: 將原文件做備份…

Leetcode Top 100 Liked Questions(序號53~74)

53. Maximum Subarray 題意&#xff1a;一個數組&#xff0c;找到和最大的子串 我的思路 我記得好像On的動態規劃來做的&#xff1f;但是想不起來了&#xff0c;先死做&#xff0c;用的前綴和——TLE超時 那就只能想想dp怎么做了 假設dp[i]表示的是以 i 為右端點的最大的…

XDR解決方案成為了新的安全趨勢

和當今指數倍增長的安全數據相比&#xff0c;安全人才的短缺帶來了潛在的風險。幾乎所有的公司&#xff0c;無論規模大小&#xff0c;在安全資源能力上都有限&#xff0c;需要過濾各種告警才能將分析量保持在可接受范圍。但這樣一來&#xff0c;潛在的威脅線索就可能被埋沒&…

LeetCode 0023. 合并 K 個升序鏈表

【LetMeFly】23.合并 K 個升序鏈表 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/merge-k-sorted-lists/ 給你一個鏈表數組&#xff0c;每個鏈表都已經按升序排列。 請你將所有鏈表合并到一個升序鏈表中&#xff0c;返回合并后的鏈表。 示例 1&#xff1a; 輸入&…

docker的資源控制管理——Cgroups

目錄 一、對CPU使用率的控制 1.1 CPU 資源控制 1.2 cgroups有四大功能 1.3 設置cpu使用率上限 查看周期限制和cpu配額限制 進行cpu壓力測試然后修改每個周期的使用cpu的時間&#xff0c;查看cpu使用率 1.4 設置cpu資源占用比&#xff08;設置多個容器時才有效&#xf…

跨境外貿業務,選擇動態IP還是靜態IP?

在跨境業務中&#xff0c;代理IP是一個關鍵工具。它們提供了匿名的盾牌&#xff0c;有助于克服網絡服務器針對數據提取設置的限制。無論你是需要經營管理跨境電商店鋪、社交平臺廣告投放&#xff0c;還是獨立站SEO優化&#xff0c;代理IP都可以讓你的業務程度更加絲滑&#xff…

Linux命令 -- vim

Linux命令 -- vim 前言一般模式光標移動復制粘貼內容查找 底線命令行模式 前言 用vim指令進入文件。 剛進入時是命令行模式&#xff0c;也叫一般模式。 按i或者insert進入編輯模式&#xff0c;此時可以編輯文件內容。 按esc可從編輯模式退回到一般模式&#xff0c;輸入冒號進…

基于 spring boot 的動漫信息管理系統【源碼在文末】

半山腰總是最擠的&#xff0c;你得去山頂看看 大學生嘛&#xff0c;論文寫不出&#xff0c;代碼搞不懂不要緊&#xff0c;重要的是&#xff0c;從這一刻就開始學習&#xff0c;立刻馬上&#xff01; 今天帶來的是最新的選題&#xff0c;基于 spring boot 框架的動漫信息管理系…

Linux系統安裝Google Chrome

1.進入谷歌瀏覽器官網 Google Chrome - Download the Fast, Secure Browser from GoogleGet more done with the new Google Chrome. A more simple, secure, and faster web browser than ever, with Google’s smarts built-in. Download now.http://www.google.cn/intl/en_…

神經網絡基礎-神經網絡補充概念-50-學習率衰減

概念 學習率衰減&#xff08;Learning Rate Decay&#xff09;是一種優化算法&#xff0c;在訓練深度學習模型時逐漸減小學習率&#xff0c;以便在訓練的后期更加穩定地收斂到最優解。學習率衰減可以幫助在訓練初期更快地靠近最優解&#xff0c;而在接近最優解時減小學習率可以…

給wordpress添加關鍵詞與描述

Wordpress網站的關鍵字及網頁描述關系網站對搜索引擎的友好程度&#xff0c;如果自己手動加顯然太折騰了&#xff0c;那如何讓WordPress博客自動為每篇文章自動關鍵字及網頁描述。每篇文章的內容不同&#xff0c;我們該如何讓wordpress自動添加文章描述和關鍵詞呢&#xff1f;下…