小程序之事件总线

一.主要原理

我把一些会被多个页面调用的事件放到一个集合里面,以事件名称为key,以事件及其回调函数的数组为值。大概的形式如下。

events={“event_name1”:[[o11,callback11],[o12,callback12]],"event_name2":[[o21,callback21],[o22,callback22]]}

然后其他的页面就可以从这个池子(集合)里面通过事件名称找到对应的事件元素,拿到他的callback函数,进行调用了。

二.主要代码

事件总线的主要代码如下:

 1 let events = {};
 2
 3 const on = function (name, self, callback) {
 4     const tuple = [self, callback];
 5     const callbacks = events[name];
 6     if (Array.isArray(callbacks)) {
 7         callbacks.push(tuple);
 8     }
 9     else {
10         events[name] = [tuple];
11     }
12 }
13
14 const remove = function (name, self) {
15     const callbacks = events[name];
16     if (Array.isArray(callbacks)) {
17         events[name] = callbacks.filter((tuple) => {
18             return tuple[0] != self;
19         })
20     }
21 }
22
23 const emit = function (name, data) {
24     const callbacks = events[name];
25     if (Array.isArray(callbacks)) {
26         callbacks.map((tuple) => {
27             const self = tuple[0];
28             const callback = tuple[1];
29             callback.call(self, data);
30         })
31     }
32 }
33
34 module.exports = {
35     on: on,
36     remove: remove,
37     emit: emit
38 }

首先我们定义了一个events对象,它的结构就是我们上面所说的那样。然后我们写了三个函数,分别是on,remove,emit。分别分别代表将事件注册,事件卸载,还有调用事件。

在on方法中,我们先检查当前name所对应的事件是否已存在(通过Array.isArray方法来判断其是否是数组,因为当callbacks为[]或者undifined的时候,该方法返回false).如果不存在,则将当前的tuple置为二维数组中的第一个数组元素。

在remove方法中,我们先通过name获取到其对应的二维数组callbacks,还是先通过Array.isArray判断该二维数组是否存在,如果存在,开始遍历该二维数组,并且过滤掉第一个元素为self的数组。(这边使用到了数组的filter方法,该方法通过回调函数会保留判断为true的元素,剔除掉判断为false的元素)。然后我们把过滤后的二维数组重新赋值给events[name]。这样就实现了事件的卸载。

最重要的是emit函数,这也是我们做事件总线的主要原因:我们同样通过name来获取二维数组,然后执行该二维数组中的每一个回调函数,此处通过call方法来实现。

三.使用方法

 1 onShow: function () {
 2     const _this = this;
 3     const key = app.config.amapkey;
 4     const initAmap = new amap.AMapWX({ key: key });
 5     events.on(‘locationData‘, this, function (data) {
 6       const origin = data.longitude + ‘,‘ + data.latitude;
 7       const destination = app.globalData.destination;
 8       initAmap.getDrivingRoute({
 9         origin: origin,
10         destination: destination,
11         success: function (data) {
12           let points = [];
13           if (data.paths && data.paths[0] && data.paths[0].steps) {
14             const steps = data.paths[0].steps;
15             for (var i = 0; i < steps.length; i++) {
16               const poLen = steps[i].polyline.split(‘;‘);
17               for (var j = 0; j < poLen.length; j++) {
18                 points.push({
19                   longitude: parseFloat(poLen[j].split(‘,‘)[0]),
20                   latitude: parseFloat(poLen[j].split(‘,‘)[1])
21                 })
22               }
23             }
24           }
25           if (data.paths[0] && data.paths[0].distance) {
26             _this.setData({
27               distance: data.paths[0].distance + ‘米‘
28             });
29           }
30           _this.setData({
31             polyline: [{
32               points: points,
33               color: "#0091ff",
34               width: 1,
35               dottedLine: true
36             }]
37           });
38         }
39       })
40       console.log(destination)
41
42       const markersArray = [{
43         iconPath: ‘/resources/image/yipin.png‘,
44         id: ‘pickUpAddress‘,
45         longitude: parseFloat(destination.split(‘,‘)[0]),
46         latitude: parseFloat(destination.split(‘,‘)[1]),
47         width: 25,
48         height: 25,
49         title: ‘自提地点‘,
50         label: {
51           content: ‘厦门出口加工区\n海景东路18号2楼‘,
52           bgColor: ‘#fff‘,
53           padding: ‘5‘,
54           borderRadius: ‘3‘
55         }
56       }, {
57         id: ‘myLocation‘,
58         longitude: data.longitude,
59         latitude: data.latitude,
60       }]
61       _this.setData({
62         markersArray, markersArray
63       })
64     })
65   },

上述代码的第5行,注册了一个事件,名称叫做locationData,并且传入参数this,指代当前页面的page对象,还有一个匿名回调函数。

接下来看如何调用这个事件

1   sendLocation: function () {
2     const _this = this;
3     wx.getLocation({
4       type: ‘wgs84‘,
5       success: function (res) {
6         events.emit(‘locationData‘, res);
7       }
8     })
9   },

调用emit函数,传入事件名称locationData,并且参数res(对应回调函数的参数data)

事件销毁方法如下:

1   onUnload: function () {
2     const _this = this;
3     clearInterval(_this.data.locationTimer)
4     events.remove(‘locationData‘, this);
5   },

原文地址:https://www.cnblogs.com/roy-blog/p/8744087.html

时间: 2024-10-03 23:18:19

小程序之事件总线的相关文章

小程序 鼠标事件

微信小程序鼠标事件 事件分类 事件分为冒泡事件和非冒泡事件: 1. 冒泡事件(bind):当一个组件上的事件被触发后,该事件会向父节点传递. 2. 非冒泡事件(catch):当一个组件上的事件被触发后,该事件不会向父节点传递. bind事件绑定不会阻止冒泡事件向上冒泡,catch事件绑定可以阻止冒泡事件向上冒泡. WXML的冒泡事件列表 类型 触发条件 touchstart 手指触摸动作开始 touchmove 手指触摸后移动 touchcancel 手指触摸动作被打断,如来电提醒,弹窗 tou

小程序开发--小程序的事件机制

首先在小程序中,如果要实现点击操作,是没有click事件,在官方api文档中,给我们提供了tap事件来表示用户短暂点击后手指离开. 而如果我们要监听这个事件,并且在这个事件上绑定一个方法,就要在在相应的事件前面直接添加一个bind或者catch,如bindtap="onTapFn"或者catchtap="onTapFn".而bind和catch的区别在于:bind只是单纯地绑定一个事件,catch则是绑定事件的同时还阻止了事件冒泡. 那么对于小程序来说,主要有三类事

微信小程序Dom事件实现

面对微信小程序,可能没有像我们平时使用JQuery那样随心所欲.本篇就是为了解决这个问题. 请合理使用工具! 细节就不说了,直接备份一个实现的案例: wxml <view class="guess" > <view> <image data-data_auto = "{{ac[index]}}" data-index="{{index}}" data-num="1" data-id="{

微信小程序页面事件-下拉刷新,上拉加载更多

1.下拉刷新的概念及应用场景. 概念: 下拉刷新是移动端更新列表数据的交互行为,用户通过手指在屏幕上子上而下的滑动,可以触发页面的下拉刷新,更新列表数据. 应用场景: 在移动端,数据列表是常见的页面效果,更新列表数据是最基本的页面需求,相比于按钮刷新,定时刷新来说,下拉刷新的用户体验方便友好,已经成为移动端刷新列表数据的最佳解决方案. 微信小程序启动下拉刷新: 两种方式: 1.需要在app.json 的window选项中或页面配置中开启enablePullDownRefresh, 但是,一般情况

小程序绑定事件,点击不跳转的问题

今天在做小程序的时候,遇到一个点击不跳转的问题,在首页有一个搜索框,点击之后想让它进入搜索页面,wxhl代码如下: <view class="sear"> <input class="input" placeholder="请输入你要搜索的商品" bindtap="search"/> </view> 给input框绑定一个search事件,js里面代码如下: search: function

小程序转发事件生命周期

1 Invoke event onShareAppMessage in pages: pages/XXX // 触发onShareAppMessage转发事件 2 pages/XXX: onHide have been invoked // 页面pages onHide()事件 3 App: onHide have been invoked // App onHide()事件 4 转发结果result // 转发的结果(成功或失败),在onShareAppMessage事件的回调函数中 5 Ap

小程序的事件 bindtap bindinput

一.bindtap事件 在wxml文件里绑定: <view class='wel-list' bindtap='TZdown'> <image src="/images/welcome_08.png"></image> <text>C语言资料下载</text> </view> 在js文件里相应: Page({ TZdown: function () { wx.navigateTo({ url: '../downlo

微信小程序常用事件

bind bind事件绑定不会阻止冒泡事件向上冒泡,catch事件绑定可以阻止冒泡事件向上冒泡. bindtap  跳转页面 bindchange  .value 改变时触发 change 事件 bindblur. 编辑器失去焦点时触发 bindinput  . 编辑器内容改变时触发 原文地址:https://www.cnblogs.com/ll15888/p/11479933.html

小程序的事件机制--捕捉与回调,catch与bind

产生事件,捕捉事件,回调函数,处理事件 回调函数自己定义,函数写在JS里面 先捕捉事件bind:tap或者catch:tap   冒泡和非冒泡区别 跳转API-----wx.navigateTo,wx.redirectTo表面上区别为跳转后 是否有后退的按钮 组件和API大方向就是学习这两个大方向 原文地址:https://www.cnblogs.com/Zzxin/p/11835201.html