emitter如何只取消某个函数的订阅 HarmonyOS 鸿蒙Next
emitter如何只取消某个函数的订阅 HarmonyOS 鸿蒙Next
页面上有3个按钮,第一个按钮是订阅事件,第二个是发送事件,第三个是取消事件。handler1和handler2是事件处理函数,其中需要使用页面中的message变量。点击第二个按钮时,handler1和handler2都会执行。点击第三个按钮时,取消handler1的注册。handler1和handler2中的this是undefined,如何解决?
代码如下:
import emitter from '@ohos.events.emitter'
@Entry
@Component
struct TestEmitter2 {
@State message: string = 'Hello World';
static readonly TAG = 'TestEmitter2'
handler1() {
console.log(TestEmitter2.TAG, `执行handler1 message=${this.message}` )
}
handler2() {
console.log(TestEmitter2.TAG, `执行handler2 message=${this.message}` )
}
build() {
Row() {
Column({space: 10}) {
Button('订阅事件')
.onClick(() => {
emitter.on({ eventId: 1 }, this.handler1)
emitter.on({ eventId: 1 }, this.handler2)
})
Button('发送事件')
.onClick(() => {
emitter.emit({ eventId: 1 })
})
Button('取消订阅')
.onClick(() => {
emitter.off(1, this.handler1)
})
}
.width('100%')
}
.height('100%')
}
}
更多关于emitter如何只取消某个函数的订阅 HarmonyOS 鸿蒙Next的实战教程也可以访问 https://www.itying.com/category-93-b0.html
需要使用callback
import emitter from '@ohos.events.emitter'
@Entry
@Component
struct TestEmitter2 {
@State message: string = 'Hello World';
static readonly TAG = 'TestEmitter2'
handler1() {
console.log(TestEmitter2.TAG, `执行handler1 message=${this.message}`)
}
callback1 = (eventData: emitter.EventData): void => {
this.handler1()
};
handler2() {
console.log(TestEmitter2.TAG, `执行handler2 message=${this.message}`)
}
callback2 = (eventData: emitter.EventData): void => {
this.handler2()
};
build() {
Row() {
Column({space: 10}) {
Button('订阅事件')
.onClick(() => {
emitter.on({ eventId: 1 }, this.callback1)
emitter.on({ eventId: 1 }, this.callback2)
})
Button('发送事件')
.onClick(() => {
emitter.emit({ eventId: 1 })
})
Button('取消订阅')
.onClick(() => {
emitter.off(1, this.callback1)
})
}
.width('100%')
}
.height('100%')
}
}
更多关于emitter如何只取消某个函数的订阅 HarmonyOS 鸿蒙Next的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
函数用箭头函数
import emitter from '@ohos.events.emitter'
@Entry
@Component
struct TestEmitter2 {
@State message: string = 'Hello World';
static readonly TAG = 'TestEmitter2'
handler1=()=> {
console.log('TestEmitter2', `执行handler1 message=`,this.message)
}
handler2() {
console.log('TestEmitter2', `执行handler2 message=`,this.message )
}
build() {
Row() {
Column({space: 30}) {
Button('订阅事件')
.onClick(() => {
emitter.on({ eventId: 1 },this.handler1)
// emitter.on({ eventId: 1 }, this.handler2)
})
Button('发送事件')
.onClick(() => {
emitter.emit({ eventId: 1 })
})
Button('取消订阅')
.onClick(() => {
emitter.off(1, this.handler1)
})
}
.width('100%')
}
.height('100%')
}
}
在HarmonyOS鸿蒙Next中,emitter
用于事件发布与订阅。要取消某个函数的订阅,可以使用off
方法。具体操作如下:
-
确定事件类型和回调函数:首先,需要明确你要取消订阅的事件类型(
eventType
)以及对应的回调函数(callback
)。 -
调用
off
方法:使用emitter.off(eventType, callback)
来取消特定事件的特定回调函数的订阅。
示例代码:
import emitter from '@ohos.events.emitter';
// 定义事件类型
const eventType = 'myEvent';
// 定义回调函数
const myCallback = (eventData) => {
console.log('Event received:', eventData);
};
// 订阅事件
emitter.on(eventType, myCallback);
// 取消订阅
emitter.off(eventType, myCallback);
在这个例子中,emitter.off(eventType, myCallback)
会取消myEvent
事件的myCallback
回调函数的订阅。
注意事项:
- 如果同一个回调函数被多次订阅到同一个事件,
off
方法会取消所有对应的订阅。 - 如果只想取消某个特定的订阅,确保回调函数是唯一的,或者使用不同的回调函数实例。
通过这种方式,你可以精确地取消某个函数的订阅,而不会影响其他事件或回调函数。