小程序从版本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 === '***') {
// 刷新页面数据
}
}
这样做能够实现需求,但是有坏处:
onShow
在很多场景都会触发,导致过多无意义的缓存数据读取判断- 本地缓存数据过多
- 管理不方便
有事件通信后,我们可以在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.navigateBack
的success
回调函数中。这样,就轻松实现回退页面并刷新数据了。最后,需要注意的是:
页面间通信仅支持wx.navigateTo跳转的页面中使用,其他几种跳转页面的方式不支持