微信小程序实现组件之间通信、重写页面Page基类

Scroll Down

组件之间通信(实现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

  1. 事先获取Pgae类:const originPage = Page;
  2. 导出基类 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(){} })