发射和监听事件
Cocos Creator 引擎提供了 EventTarget
类,用以实现自定义事件的监听和发射,在使用之前,需要先从 cc
模块导入,同时需要实例化一个 EventTarget
对象。
ts
import { EventTarget } from "cc";
const eventTarget = new EventTarget();
监听事件
监听事件可以通过eventTarget.on()
接口来实现
ts
// 该事件监听每次都会触发,需要手动取消注册
eventTarget.on(type, func, target?);
type 为事件注册字符串
func 为执行事件监听的回调
target 为事件接受对象,不写就是当前对象
如果target
没有设置,则回调里的this
指向的就是当前执行回调的对象
ts
// 使用函数绑定
eventTarget.on(
"foo",
function (event) {
this.enabled = false;
}.bind(this)
);
// 使用第三个参数
eventTarget.on(
"foo",
(event) => {
this.enabled = false;
},
this
);
除了用on
监听, 我们还可以使用once
接口.once
监听在监听函数相应后就会关闭监听事件
取消监听事件
当我们不再关心某个事件时,我们可以使用 off
接口关闭对应的监听事件。
off
接口的使用方式有以下两种:
ts
// 取消对象身上所有注册的该类型的事件
eventTarget.off(type);
// 取消对象身上该类型指定回调指定目标的事件
eventTarget.off(type, func, target);
注意
需要注意的是,off 方法的参数必须和 on 方法的参数一一对应,才能完成关闭。
- 推荐如下方式:
ts
import { _decorator, Component, EventTarget } from "cc";
const { ccclass } = _decorator;
const eventTarget = new EventTarget();
@ccclass("Example")
export class Example extends Component {
onEnable() {
eventTarget.on("foobar", this._sayHello, this);
}
onDisable() {
eventTarget.off("foobar", this._sayHello, this);
}
_sayHello() {
console.log("Hello World");
}
}
发射事件
发射事件可以通过eventTarget.emit()
接口来实现
ts
// 发射事件
eventTarget.emit(type, arg1, arg2, ...);
type 为事件注册字符串
arg1, arg2 为事件参数
ts
eventTarget.emit("foobar", "arg1", "arg2");
发射和监听
ts
import { _decorator, Component, EventTarget } from "cc";
const { ccclass } = _decorator;
const eventTarget = new EventTarget();
@ccclass("Example")
export class Example extends Component {
onLoad() {
eventTarget.on("foo", (arg1, arg2, arg3) => {
console.log(arg1, arg2, arg3); // print 1, 2, 3
});
}
start() {
let arg1 = 1,
arg2 = 2,
arg3 = 3;
// At most 5 args could be emit.
eventTarget.emit("foo", arg1, arg2, arg3);
}
}
- 注意
注意
这里传递参数不能超过 5 个