//event.js
/**
* 作用:通过类似vue组件间事件传递的方式,在小程序中跨页面传递事件
* 注意:page中订阅on了以后,一定要在onUnload中注销相应订阅
* 示例:
* 1. app.js
* const EVENT = require('./utils/event')
* App({
* event: new EVENT()
* })
* 2. 在接收event的page
* var app = getApp();
* Page({
* onLoad:function(){
* app.event.on('onAuthUser', this.onAuthUser, this)
* },
* onAuthUser(){
* // auth code
* },
* // !!!!!!! 一定要在onUnload时注销 !!!!!!!
* onUnload:function(){
* app.event.off(); // remove all
* app.event.off('onAuthUser'); // remove all callback
* app.event.off('onAuthUser',this.onAuthUser); // remove specific callback
* }
* })
*
* 2. 在触发event的page
* var app = getApp();
* Page({
* emitAuthUser(){
* // code
* app.event.emit('onAuthUser',params)
* },
* })
*/
class EVENT {
on(event, fn, ctx) {
if (typeof fn != "function") {
console.error('fn must be a function')
return
}
this._stores = this._stores || {}
;
(this._stores[event] = this._stores[event] || []).push({
cb: fn,
ctx: ctx
})
}
emit(event) {
this._stores = this._stores || {}
var store = this._stores[event],
args
if (store) {
store = store.slice(0)
args = [].slice.call(arguments, 1)
for (var i = 0, len = store.length; i < len; i++) {
store[i].cb.apply(store[i].ctx, args)
}
}
}
off(event, fn) {
this._stores = this._stores || {}
// all
if (!arguments.length) {
this._stores = {}
return
}
// specific event
var store = this._stores[event]
if (!store) return
// remove all handlers
if (arguments.length === 1) {
delete this._stores[event]
return
}
// remove specific handler
var cb
for (var i = 0, len = store.length; i < len; i++) {
cb = store[i].cb
if (cb === fn) {
store.splice(i, 1)
break
}
}
return
}
}
module.exports =EVENT
【微信小程序】页面间事件传递
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 在开发微信小程序时,需要在一个页面做选择操作,然而选择面板很大,需要使用单独的子页面来展示,这时用到wx.navi...