[英]How to dispatch event from a function instead of window
以下工作正常,我的事件偵聽器獲取自定義事件,因為它從 window 分派了事件,並且我的事件偵聽器正在偵聽 window 上的loading
,一切都很好。
const MyLib = mylib();
function mylib() {
const res = {
init: (data) => {
let loading = new CustomEvent('loading', {detail: { loading: true }});
window.dispatchEvent(loading);
}
}
return res;
}
事件監聽器
window.addEventListener('loading', handleLoading);
如何將其更改為MyLib.addEventListener
而不是window.addEventListener
?
和..
window.dispatchEvent(loading);
到MyLib.dispatchEvent(loading);
我得到的錯誤是TypeError: MyLib.addEventListener is not a function
下面的答案適用於 class,但我想知道不使用 class 是否可行。
可以使用代理來實現要求。
這是一個將原始 MyLib object 包裝在Proxy
中的片段,在訪問addEventListener
或dispatchEvent
時會激活其get
陷阱。
function mylib() {
const res = {
init: (data) => {
let loading = new CustomEvent('loading', {detail: { loading: true }});
MyLib.dispatchEvent(loading);
}
}
return res;
}
const MyLib = new Proxy(mylib(), {
get: function(target, prop) {
if (prop === `addEventListener`) {
return (...args) => window.addEventListener(...args);
}
if (prop === `dispatchEvent`) {
return (...args) => window.dispatchEvent(...args);
}
return target[prop];
}
});
MyLib.addEventListener('loading', () => { console.log("Hello world !!!") });
MyLib.init();
為了在 object 上調度和監聽事件,object 需要從EventTarget
接口繼承。
class MyLib extends EventTarget {
constructor() {
super();
}
init(data) {
let loading = new CustomEvent('loading', { detail: { loading: true } });
this.dispatchEvent(loading);
}
}
// somewhere myLib is an instantiation of MyLib
useEffect(() => {
myLib.addEventListener('loading', handleLoading);
return () => {
myLib.removeEventListener('loading', handleLoading);
};
}, []);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.