页面间通讯使用概述
https://uniapp.dcloud.net.cn/api/window/communication.html#off
uni.$emit('add',{msg:'页面更新'})
uni.$on('add', this.add)
uni.$off('add', this.add)
...
methods: {
add(e) {
this.val += e.data
}
}
会出现释放监听无效的问题,之所以释放监听无效是因为绑定监听和释放监听并没有使用相同的方法。目前可行的解决方法是把要绑定的方法单独定义出来,这样在绑定和释放监听的时候就能确保都是相同的方法,就能真正释放监听的绑定。
即便按照上述操作,可能还会出现无法释放的问题。
简单暴力些可以直接执行 uni.$off('add')
进行全局释放。
不同页面的使用
非 TabBar 的页面
在非 TabBar 的页面,可以在页面 onLoad 里边 uni.$on
注册监听,onUnload 里边 uni.$off
移除,官方也是这么推荐的
注意事项
-
uni.$emit、uni.$on 、 uni.$once 、uni.$off
触发的事件都是 App 全局级别的,跨任意组件,页面,nvue,vue 等 - 使用时,注意及时销毁事件监听,比如,页面
onLoad
里边uni.$on
注册监听,onUnload
里边uni.$off
移除,或者一次性的事件,直接使用uni.$once
监听 - 注意
uni.$on
定义完成后才能接收到uni.$emit
传递的数据
Tabbar 页面
在 Tabbar 页面,onLoad 只会执行一次,onUnload 不会执行。会频繁的执行 onShow 和 onHide,所以监听的处理思路如下
- onShow 进行 注册监听。注意需要先移除监听,在注册监听。因为重复的注册会导致监听事件被执行多次
- 在此页面要跳转的地方 移除监听
- 在其他 tabBar 页面的
onTabItemTap
方法中移除监听