拓荒
拓荒
  • 发布:2020-03-06 17:16
  • 更新:2023-02-23 10:08
  • 阅读:1809

【报Bug】移除全局自定义事件监听器uni.$off()不执行

分类:uni-app

详细问题描述

[内容]
uni.$off()不执行

[结果]
uni.$off()不执行
[期望]
uni.$off()执行
[如果语言难以表述清晰,拍一个视频或截图,有图有真相]

IDE运行环境说明

[HBuilder 或 HBuilderX。如果你用其他工具开发uni-app,也需要在此说明]
HBuilderX

[IDE版本号]
2.6.1
[windows版本号]
10

uni-app运行环境说明

[运行端是h5或app或某个小程序?]
H5和app

[可重现代码片段]
onUnload(){
console.log("正在清除事件")
uni.$off("getDataAgain",()=>{
console.log("销毁监听事件")
})
},

联系方式

[QQ]
1017771330

2020-03-06 17:16 负责人:无 分享
已邀请:
DCloud_uniCloud_WYQ

DCloud_uniCloud_WYQ

注意看$off的注意事项,$off需要移除和$on绑定的同一个函数,就像addEventListener 和 removeEventListener 一样

  • 拓荒 (作者)

    确实是同一个函数,H5和app端uni.$off()均无效,且回调函数也不执行,小程序还没测试

    2020-03-06 17:31

  • DCloud_uniCloud_WYQ

    回复 拓荒: 你这样写很显然就不是同一个函数了,在MDN上关于removeEventListener的说明里面有这么一句话。


    注意: 如果要移除事件句柄,addEventListener() 的执行函数必须使用外部函数,如(myFunction)匿名函数,类似 "document.removeEventListener("event", function(){ myScript });" 该事件是无法移除的。

    2020-03-06 17:36

  • DCloud_uniCloud_WYQ

    https://developer.mozilla.org/zh-CN/docs/Web/API/EventTarget/removeEventListener

    2020-03-06 17:37

  • 拓荒 (作者)

    回复 DCloud_uniCloud_WYQ: 这个是页面加载是进行监听:

    uni.$on("getDataAgain",()=>{

    console.log("重新请求数据")

    this.getData()

    })


    这个是页面卸载的时候执行销毁:

    onUnload(){

    console.log("正在销毁")

    uni.$off("getDataAgain",()=>{

    console.log("销毁监听事件")

    })

    },


    当页面数据需要登录时会跳转到登录页面,登录成功执行

    uni.$emit("getDataAgain")

    这时会执行this.getData()

    但是页面返回的时候

    "正在销毁打印了"


    但是uni.$off()没有执行

    2020-03-06 17:44

拓荒

拓荒 (作者)

这个是页面加载时的代码:

onLoad(){  
        uni.$on("getDataAgain",()=>{  
        console.log("重新请求数据")  
            this.getData()  
        })  
   },

这个是页面关闭时的代码:

onUnload(){  
        console.log("正在销毁")  
        uni.$off("getDataAgain",()=>{  
            console.log("销毁监听事件")  
        })  
    },

当页面数据需要登录时会跳转到登录页面,登录成功执行 uni.$emit("getDataAgain")这时会执行this.getData()

但是页面返回的时候 "正在销毁" 打印了,uni.$off()却没有执行

  • DCloud_uniCloud_WYQ

    https://uniapp.dcloud.io/api/window/communication?id=off 多看看这个文档,不是你这么用的

    2020-03-06 17:53

  • 拓荒 (作者)

    回复 DCloud_uniCloud_WYQ: 民白了,是需要第二个参数也就是回调函数,要是同一个函数,谢谢了。

    2020-03-07 09:14

  • 1***@163.com

    回复 DCloud_uniCloud_WYQ: uni.$on('moreSet', this.getMoreSet)

    uni.$off('moreSet', this.getMoreSet)

    getMoreSet(value){

    console.log('value')

    console.log(value)

    this.startTimeDay = value.startTimeDay

    this.startTimeTime = value.startTimeTime

    this.highestPrice = value.maxPrice

    this.isAuction = value.isSpecial

    console.log(this.startTimeDay)

    this.getDeadlineList()

    },


    为啥我的卸载不了啊 我这都是跟官方一样的啊

    2020-04-22 10:07

m***@163.com

m***@163.com

如果uni.$off没有传入参数,则移除App级别的所有事件监听器;
如果只提供了事件名(eventName),则移除该事件名对应的所有监听器;
如果同时提供了事件与回调,则只移除这个事件回调的监听器;
提供的回调必须跟$on的回调为同一个才能移除这个回调的监听器;

要回复问题请先登录注册