小程序页面间事件通信

小程序从版本2.7.3开始支持页面间通信事件。页面之间可以通过传递参数,本地缓存等方法实现数据通信,为什么还要事件通信呢?试想一下这么一个场景,从A页面跳转到了B页面:

wx.navigateTo({
    url: '/pages/B/B'
})

在B页面做了某项操作后返回A页面,因为B页面的操作,数据已经有了新的变化,但是,我们通过wx.navigateBack({delta:1})返回上一级,并不会刷新页面数据。

如果没有事件通信,那么我们只能在返回上一级之前,在本地缓存设置一个变量并赋予一个值,然后再A页面onShow里面判断是否存在这个变量和值是否正确:

onShow(){
    const key = wx.getStorageSync('***');
    if(key && key === '***') {
        // 刷新页面数据
    }
}

这样做能够实现需求,但是有坏处:

  1. onShow在很多场景都会触发,导致过多无意义的缓存数据读取判断
  2. 本地缓存数据过多
  3. 管理不方便

有事件通信后,我们可以在A页面跳转时注册事件

wx.navigateTo({
    url: '/pages/B/B',
    events: {
        refreshEvent: () => {
            // 刷新数据
        }
    }
})

在B页面触发事件

// 首先获取eventChannel
const chan = this.getOpenerEventChannel();
// 触发事件
chan.emit('refreshEvent');
// 如果需要传参数
chan.emit('refreshEvent', {key: val});
wx.navigateBack({delta: 1})

也可以将触发事件逻辑放在wx.navigateBacksuccess回调函数中。这样,就轻松实现回退页面并刷新数据了。最后,需要注意的是:
页面间通信仅支持wx.navigateTo跳转的页面中使用,其他几种跳转页面的方式不支持