uni-app 偶发uni.$on 监听不到消息

uni-app 偶发uni.$on 监听不到消息

操作步骤:

  • $on收不到消息

预期结果:

  • $on能收到消息

实际结果:

  • $on收不到消息

bug描述:

  • 我这边的情况是 次级页面监听接收根页面emit的大数据 如果多emit了几次这样的大数据(音频字节数组),次级页面的$on可能收不到消息。不知道 是不是内存溢出的问题,求大佬给个解题思路。

| 信息类别         | 信息内容               |
|------------------|------------------------|
| 产品分类         | uniapp/App             |
| PC开发环境       | Windows                |
| PC开发环境版本号 | 13.3                   |
| HBuilderX类型   | 正式                   |
| HBuilderX版本号 | 3.99                   |
| 手机系统         | Android                |
| 手机系统版本号   | Android 14             |
| 手机厂商         | 华为                   |
| 手机机型         | 一般手机               |
| 页面类型         | vue                    |
| vue版本          | vue2                   |
| 打包方式         | 云端                   |
| 项目创建方式     | HBuilderX              |

更多关于uni-app 偶发uni.$on 监听不到消息的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

有啥报错不?后续再使用 $on 之类的方法还能监听到吗?

更多关于uni-app 偶发uni.$on 监听不到消息的实战教程也可以访问 https://www.itying.com/category-93-b0.html


此bug我将负责跟进,后续是否解决该问题了?欢迎反馈

uni-app 中,uni.$on 用于监听全局事件,而 uni.$emit 用于触发全局事件。如果你遇到 uni.$on 偶发监听不到消息的情况,可能是由于以下几个原因导致的:

1. 事件触发时机问题

  • 如果 uni.$emituni.$on 注册之前触发,那么 uni.$on 将无法监听到该事件。
  • 解决方案:确保 uni.$onuni.$emit 之前注册。可以在 onLoadonShow 生命周期中注册事件监听器。

2. 页面销毁未移除监听器

  • 如果页面销毁时没有移除事件监听器,可能会导致内存泄漏或事件监听器失效。
  • 解决方案:在页面销毁时(如 onUnload 生命周期)使用 uni.$off 移除事件监听器。
onUnload() {
  uni.$off('eventName', this.eventHandler);
}

3. 事件名称不一致

  • uni.$onuni.$emit 使用的事件名称必须完全一致,包括大小写。
  • 解决方案:检查事件名称是否一致,确保没有拼写错误。

4. 事件监听器被覆盖

  • 如果多次使用 uni.$on 监听同一个事件,后注册的监听器会覆盖之前的监听器。
  • 解决方案:确保每个事件监听器都是唯一的,或者使用 uni.$once 来监听一次性事件。

5. 异步问题

  • 如果 uni.$emit 在异步操作中触发,可能会导致 uni.$on 还未注册。
  • 解决方案:确保 uni.$on 在异步操作之前注册,或者在异步操作完成后再次触发事件。

6. 跨页面通信问题

  • 如果 uni.$emituni.$on 分别在不同的页面中,可能会导致事件无法正常传递。
  • 解决方案:确保事件在同一个页面或组件中触发和监听,或者使用 uni.$emituni.$on 进行跨页面通信时,确保页面已经加载。

7. 调试工具问题

  • 有时调试工具可能会影响事件的正常传递。
  • 解决方案:尝试在真机上进行测试,排除调试工具的影响。

8. uni-app 版本问题

  • 某些 uni-app 版本可能存在 bug,导致事件监听失效。
  • 解决方案:尝试更新 uni-app 到最新版本,或者查看官方文档和社区是否有相关问题的解决方案。

示例代码

// 页面 A
onLoad() {
  uni.$on('eventName', this.eventHandler);
},
methods: {
  eventHandler(data) {
    console.log('Received data:', data);
  }
},
onUnload() {
  uni.$off('eventName', this.eventHandler);
}

// 页面 B
methods: {
  triggerEvent() {
    uni.$emit('eventName', { message: 'Hello, world!' });
  }
}
回到顶部