HarmonyOS鸿蒙Next中求助,emitter使用遇到问题
HarmonyOS鸿蒙Next中求助,emitter使用遇到问题
按照如下代码编写的情况下,不会取消 refreshPage
方法的监听,仍可收到其他地方发送的消息。
如果 emitter.on()
的时候不 bind(this)
,refreshPage()
方法中的 this
= undefined 。
registerEvents() {
emitter.on(KTXEventKey.login_success_event, this.refreshPage.bind(this))
}
unregisterEvents() {
emitter.off(KTXEventKey.login_success_event, this.refreshPage)
}
refreshPage() {
this.controller.refresh()
}
我现在处理方案如下:
static that: TestPage | undefined = undefined
registerEvents() {
TestPage.that = this
emitter.on(KTXEventKey.login_success_event, this.refreshPage)
}
unregisterEvents() {
emitter.off(KTXEventKey.login_success_event, this.refreshPage)
TestPage.that = undefined
}
refreshPage() {
const that = TestPage.that as TestPage
that.controller.refresh()
}
这个方案暂时可以解决我目前的问题,不知道有没有正确的解决方案?
更多关于HarmonyOS鸿蒙Next中求助,emitter使用遇到问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
遇到 this 问题,可以使用箭头函数.
emitter.on(KTXEventKey.login_success_event, ()=> {
this.refreshPage()
})
更多关于HarmonyOS鸿蒙Next中求助,emitter使用遇到问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,emitter主要用于组件间通信。常见问题可能是事件未触发或监听失效。确保事件名一致,使用emit()
发送,on()
监听。检查是否在相同Emitter实例上操作。若跨页面通信,需使用globalEmitter
。生命周期管理需注意,避免页面销毁后未取消监听导致内存泄漏。代码示例:
// 发送
emitter.emit('eventName', data);
// 监听
emitter.on('eventName', callback);
// 取消
emitter.off('eventName');
在HarmonyOS Next中使用emitter时,bind(this)会创建一个新的函数引用,导致off()无法正确取消监听。正确的解决方案是:
- 在类中保存绑定后的函数引用:
private boundRefreshPage = this.refreshPage.bind(this);
registerEvents() {
emitter.on(KTXEventKey.login_success_event, this.boundRefreshPage)
}
unregisterEvents() {
emitter.off(KTXEventKey.login_success_event, this.boundRefreshPage)
}
- 或者使用箭头函数自动绑定this:
refreshPage = () => {
this.controller.refresh()
}
registerEvents() {
emitter.on(KTXEventKey.login_success_event, this.refreshPage)
}
unregisterEvents() {
emitter.off(KTXEventKey.login_success_event, this.refreshPage)
}
这两种方式都能确保注册和取消使用的是同一个函数引用,同时正确绑定this上下文。你当前的静态变量方案虽然可行,但不是最佳实践,可能会带来内存泄漏风险。