不暇
不暇
  • 发布:2023-07-23 21:26
  • 更新:2024-04-08 13:52
  • 阅读:586

【报Bug】uni.reLaunch跳转页面后uni.$emit失效无法监听

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: 10

HBuilderX类型: 正式

HBuilderX版本号: 3.8.11

手机系统: Android

手机系统版本号: Android 12

手机厂商: 华为

手机机型: 所有机型

页面类型: vue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

示例代码:

第一个页面通过如下代码,跳转到第二个页面

var timer = setTimeout(function() {  
    uni.reLaunch({  
        url: '/pages/home/index'  
    })  
    clearTimeout('timer')  
}, 1000)

第二个页面用可以使用的所有方式,执行如下代码

uni.$emit('onShow', 1);

第二个页面引入的组件
mounted() {
var that = this;
uni.$on('onShow', function(data) {
//处理逻辑
});
}

操作步骤:

按我上述的代码即可

预期结果:

uni.$emit正常执行和监听

实际结果:

uni.$emit无法正常执行和监听。

bug描述:

在完成某个操作后,我使用如下代码返回首页
var timer = setTimeout(function() {
uni.reLaunch({
url: '/pages/home/index'
})
clearTimeout('timer')
}, 1000)

返回的页面index存在代码

uni.$emit('onShow', 1);

页面index引入了一个组件home,组件homo内有如下代码:
uni.$on('onShow', function(data) {
//触发后处理逻辑
});

在reLaunch返回后,任何方式都无法执行uni.$emit('onShow', 1);,包括onload,onshow,点击事件,onready。
进而导致组件内监听无法触发。
实际测试发现,只有在reLaunch情况下才会出现,其它形式跳转不会出现问题。

目前仅在APP下出现此类问题,H5正常,小程序未测试

2023-07-23 21:26 负责人:无 分享
已邀请:
喜欢技术的前端

喜欢技术的前端 - QQ---445849201

如果是给子组件传值的,可以属性传值,在子组件中props接收

  • 不暇 (作者)

    不是传值,你就理解成我在自定义tabbar,切换导航就触发实现,但首页如果是reLaunch过来,在APP下,所有的uni.$emit就无效了

    2023-07-28 16:43

昭昭L

昭昭L - 开心就好

页面通信用这个EventChannel.emit

昭昭L

昭昭L - 开心就好

reLaunch是有问题,上个页面已经被干掉了

  • 不暇 (作者)

    在h5下完全正常,APP下就会reLaunch完全无效

    2023-07-28 16:44

9***@qq.com

9***@qq.com

解决了吗

  • 不暇 (作者)

    没有解决,官方一个回复都没有

    2023-08-10 16:14

1***@qq.com

1***@qq.com - 隔壁小王同学

插个眼,reLaunch会导致uni.$on失效

  • 不暇 (作者)

    实际上是因为uni.$emit失效了,所以uni.$on失效,实际上我也搞不清到底是哪个失效

    2023-08-11 16:23

  • 1***@qq.com

    回复 不暇: 我的解决是app的$on要配对$off取消监听,$off('xx', 监听的函数),$off一定要加有取消监听的函数

    2024-08-26 10:29

Diligent_UI

Diligent_UI - 【插件开发】【专治疑难杂症】【多款插件已上架:https://ext.dcloud.net.cn/publisher?id=193663(微信搜索飘逸科技UI小程序直接体验)】【骗子请绕道】问题咨询请加QQ群:120594820,代表作灵感实用工具小程序

APP端这种通讯无法通讯,跟页面是否被销毁没有关系

  • 不暇 (作者)

    然而app端这种方式可以通讯,和页面销毁是直接关系,我就是发现了这一点才提问。

    2023-08-11 16:22

  • Diligent_UI

    回复 不暇: 之前测试小程序可以,APP不行

    2023-08-11 17:29

  • 不暇 (作者)

    回复 Diligent_UI: 三端都可以,但app下reLaunch后监听失效

    2023-08-11 18:39

2***@qq.com

2***@qq.com

你好,小程序中也遇到了相同问题,请问有什么解决方案吗

1***@qq.com

1***@qq.com

延时触发
// #ifdef APP-PLUS
setTimeout(() => {
uni.$emit('update')
}, 50)
// #endif

i锦鲤

i锦鲤 - -接单-Tel:18560000860

reLaunch会重新渲染组件吧,组件重新渲染得需要时间吧,我猜测是你$emit的时候,组件还没渲染好,还没$on对应事件,所以监听不到,你可以延迟一下$emit,或者在组件中定义一个onShow函数,在页面中用 $refs.组件.onShow(data)的方式调用

要回复问题请先登录注册