MPVue传值

2019-03-18  本文已影响0人  我的名字就这么长

最近上手mpvue开发微信小程序,发现mpvue官网没有提供页面反向传值的解决方案,于是广查资料,知道eventbus解决方案,再结合之前的iOS通知,写了一个文件来实现pages间的反向传值。
1、新建一个notification.js文件

// 用来存放监听事件
let _notifications = []

/* 添加监听事件
* notificationName  事件传递名称
* selector          事件回调函数
* observe           事件监听者
* */
function addNotification (notificationName, selector, observe) {
  console.log('addNotification=', notificationName, 'selector=', selector, 'observe=', observe)
  if (!notificationName || !selector || !observe) {
    console.log('addNotification error')
    return
  }

  let alreadyNotifi = false
  try {
    _notifications.forEach(item => {
      if (item.name === notificationName && item.selector === selector && item.observe === observe) {
        alreadyNotifi = true
        throw new Error('该实例或组件已添加该通知')
      }
    })
  } catch (e) {
    if (e.message !== '该实例或组件已添加该通知') {
      throw e
    }
  }

  if (alreadyNotifi) {
    console.log('该实例或组件已添加该通知')
    return
  }

  let notification = {
    name: notificationName,
    selector: selector,
    observe: observe
  }

  _notifications.push(notification)
}

/* 发送通知
* notificationName 事件名称
* payload          事件回调函数所需参数
* */
function postNotification (notificationName, payload) {
  console.log('postNotification=' + notificationName, 'payload=', payload)
  if (!notificationName) {
    console.log('postNotification error')
    return
  }

  _notifications.forEach(item => {
    if (item.name === notificationName) {
      item.selector(payload)
    }
  })
}

/* 移除监听
* notificationName 事件名称
* observe          监听者
* */
function removeNotification (notificationName, observe) {
  console.log('removeNotification=' + notificationName, 'observe=', observe)
  if (!notificationName || !observe) {
    console.log('removeNotification error')
    return
  }

  _notifications.forEach((item, index) => {
    if (item.name === notificationName && item.observe === observe) {
      _notifications.splice(index, 1)
    }
  })
}

export default {
  addNotification,
  postNotification,
  removeNotification
}

2、在需要添加监听的地方

// 2.1
  import notificationCenter from '../../utils/notification'
//2.2
  notificationCenter.addNotification('fromdetail', this.fromdetail, this)

3、在发起通知的地方

//3.1
  import notificationCenter from '../../utils/notification'
//3.2
 onLoad () {
   notificationCenter.addNotification('fromindex', this.fromindex, this)
 },
 onUnload () {
   notificationCenter.removeNotification('fromindex', this)
 },
上一篇下一篇

猜你喜欢

热点阅读