风残落叶
风残落叶
  • 发布:2020-05-20 09:56
  • 更新:2023-01-10 01:28
  • 阅读:1140

【报Bug】uni.$on传值有问题

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: win10企业版

HBuilderX类型: 正式

HBuilderX版本号: 2.6.16

手机系统: Android

手机系统版本号: Android 9.0

手机厂商: 小米

手机机型: 小米8青春版

页面类型: vue

打包方式: 云端

项目创建方式: HBuilderX

示例代码:

index页面触发uni.$emit并跳转到home页面

//index.vue页面    
           goPage(){    
                uni.$emit("home","home");    
                uni.navigateTo({    
                    url:"/pages/home/home"    
                })    
            }

在home页面uni.$on的回调函数可以拿到值,但是外面不行

//home.vue页面    
onLoad() {    
      uni.$on("home",(data)=>{    
                this.title=data;    
                console.log(this.title);//有值    
            });    
            setTimeout(_=>{    
                console.log(this.title);//无值    
            },1000);    
              console.log(this.title);//无值    
        },

操作步骤:

一个页面通过uni.$emit传值并跳转页面,在新的页面中通过uni.$on监听,在回调函数中可以获取到值,uni.$on外获取不到

预期结果:

uni.$on监听的值在回调函数外也能获取到

实际结果:

uni.$on回调函数获取得到值,回调函数外获取不到

bug描述:

一个页面通过uni.$emit传值并跳转页面,在新的页面中通过uni.$on监听,在回调函数中可以获取到值,uni.$on外获取不到

2020-05-20 09:56 负责人:无 分享
已邀请:
风残落叶

风残落叶 (作者)

为什么这么严重的问题没人理

奔涌吧后浪

奔涌吧后浪 - 奔涌吧后浪

同问,希望官方看到回复一下

奔涌吧后浪

奔涌吧后浪 - 奔涌吧后浪

我解决了
1.首先 A进B 不建议用事件模式 直接路径带参数 onload里获取比较好 你这里的问题就是 你在B监听 A发送事件 A在发送的时候 B还没开始监听 所以建议你用事件模式的时候 注意 先监听要在发送事件的前面完成
2.监听回调里面赋值给上了,外面还是没变,建议这里用that替换掉this,回调事件里 统一用that。

白羽

白羽 - 个人开发者

我觉得可能是你的this用错了。建议参考 @奔涌吧后浪 的建议。

...  
uni.$on("home",(data)=>{      
    this.title=data;    //这个this应该指的是$on函数的调用者,即uni  
    console.log(this.title);//有值      
});      
setTimeout(_=>{      
    console.log(this.title);//无值    //这里的this是当前页面  
},1000);      
console.log(this.title);//无值     //这里的this是当前页面  
...
  • 风残落叶 (作者)

    this没问题,换成that也一样,主要是跳转页面的监听页面还没被触发,生命周期问题

    2020-05-28 12:01

  • 生涯

    回复 风残落叶: 解决了没有

    2020-06-03 10:35

3***@qq.com

3***@qq.com

一个问题存两年啊。。。碰到相同问题了。。特来找解决方案。。

3***@qq.com

3***@qq.com

折腾两小时终于找到原因了。。

let that=this;  
            uni.$on('menu-popup', function(res){  
                that.result=res.currenttitle;  
                console.log(that.urltitle);  
            });

比如上面的代码。放在onload中时只会执行一次。而这时onload中的this因为是后加载的原因,值为未定义。。但是可以这么来试验。。页面中放一文本框绑定页面变量result。每次传递消息时,通过文本框就能看到实时传递的数据了。。是我自己想错了顺序。。

要回复问题请先登录注册