消息总线

类似于vue-busvue-happy-bus

使用:
发送事件并传递消息:

  1. uni.$emit('update', { msg: '页面更新' })

监听事件并获取消息(通常在页面的onLoad或created中):

  1. created() {
  2. uni.$on('update',function(data){
  3. console.log('监听到事件来自 update ,携带参数 msg 为:' + data.msg);
  4. })
  5. },

移出事件监听(通常在页面的onUnload或destroyed中):

  1. onUnload() {
  2. uni.$off('login')
  3. },

如果只想要监听一次,可以使用uni.$once

  1. uni.$once('update',function(data){
  2. console.log('监听到事件来自 update ,携带参数 msg 为:' + data.msg);
  3. })

一次性的事件,直接使用uni.$once监听,不需要移除。

如果页面没有打开,将不能 注册监听事件uni.$onuni.$once

参考:

页面返回时传值

假如从B页面返回A页面,小程序中的写法是:

  1. var pages = getCurrentPages();
  2. var prevPage = pages[pages.length - 2]; //上一个页面
  3. prevPage.setData({
  4. mdata: 1
  5. })

经过测试,在uniapp中使用B页面使用setData设置A页面参数无法实现(应该是被更改为常量属性了)。

方法一:调用前一个页面的生命周期

A页面的生命周期:

  1. onHide: ƒ ()
  2. onLoad: ƒ ()
  3. onReady: ƒ ()
  4. onResize: ƒ ()
  5. onRouteEnd: ƒ ()
  6. onShow: ƒ ()
  7. onUnload: ƒ ()

B页面传递:

  1. let object={
  2. sx1:"参数1",
  3. sx2:"参数2",
  4. }
  5. prevPage.onShow(object);
  6. uni.navigateBack();

A页面接收参数:

  1. onShow(object){
  2. if(!!object){
  3. this.object = object
  4. console.log(object)
  5. }
  6. }

方法二:调用前一个页面的方法

B页面传递:

  1. let object= {
  2. sx1:"参数1",
  3. sx2:"参数2",
  4. }
  5. prevPage.$vm.setData(object); // 重点$vm
  6. uni.navigateBack();

A页面接收参数:

  1. export default {
  2. methods: {
  3. setData(object){
  4. if(!!object){
  5. this.object = object
  6. console.log(object)
  7. }
  8. }
  9. }
  10. }

参考资料:uni.navigateBack()返回时传递参数,最简单的办法!

方法三:修改前一个页面的数据

可以直接通过$vm修改上一个页面的数据:

  1. let pages = getCurrentPages() // 获取路由栈
  2. let prevPage = pages[pages.length - 2] // 上一页面
  3. prevPage.$vm.from = 'index'
  4. uni.navigateBack()