组件之间通信(实现event.js)
将event.js挂载在App.js全局下,通过on,emit,off等方法,订阅、发布、删除通信事件。
import EventBus from 'event.js'
wx.$bus = new EventBus()
on方法,记录订阅名、回调函数以及上下文:
on(eventName, fn, ctx) {
if (typeof fn !== "function") {
console.error("fn must be function")
return
}
// 如果订阅的事件不存在,那么就创建一个【事件名:[订阅事件的函数]】
if (!this.objEvents.get(eventName)) {
this.objEvents.set(eventName, [])
}
let value = this.objEvents.get(eventName)
// 这个地方比较重要,为了避免重复调用某监听函数,采用先剔除原来的fn,然后再用新的fn替换
// 调用场景如下,那么最后会删除fn,后面的fn1会被记录下来 `on(name, fn, ctx)on(name, fn1, ctx) `
value = value.filter(function(e) {
return e.ctx !== ctx
})
value.push({'cb': fn, 'ctx': ctx})
this.objEvents.set(eventName, value)
}
emit方法,发布相对于的订阅事件:
emit(eventName, params) {
const eventArr = this.objEvents.get(eventName) || []
const args = [].slice.call(arguments, 1) || []
if (eventArr && eventArr.length) {
for (var i = 0, len = eventArr.length; i < len; i++) {
eventArr[i].cb.apply(eventArr[i].ctx, args)
}
}
}
使用:
wx.$bus.on('add', ()=>{})
wx.$bus.emit('add', 'test')
off方法,删除记录数据的订阅事件(清空this.objEvents)
重写页面Page基类
声明一个函数return页面原生Page()函数,可实现mixins
- 事先获取Pgae类:const originPage = Page;
- 导出基类 BasePage, 函数内容可处理共用方法
export function BasePage (initObj){
let orgainOnLoad = initObj.onLoad;
initObj.onLoad = function (o) {
// 执行的初始事件 start
console.log('执行的初始事件 start')
// 执行的初始事件 end
orgainOnLoad.call(this, o);
}
retrun originPage(initObj)
}
使用:
import { BasePage } from 'basepage'
console.log('BasePage====', )
BasePage({ data: {},onLoad(){} })