gpt4 book ai didi

Javascript 装饰器监听器

转载 作者:行者123 更新时间:2023-12-03 00:14:02 24 4
gpt4 key购买 nike

我正在摆弄装饰器,有一个 Angular 背景,我试图将我的头围绕在 HostListener 装饰器上。

这就是我走了多远:

class Demo {
counter = 0;

@Listen("mousemove") onMouseMove(e?) {
console.log(this);

this.counter++;
}
}

export function Listen(name) {
return (target, key, descriptor) => {

window.addEventListener(name, oldValue.bind(target));


return descriptor;
};
}

new Demo();

这或多或少是实现唯一的问题是传递目标/此引用,因为目标未初始化。

最佳答案

已解决,我正在使用 Vue,所以这可能不是每个人的答案,基本上我所做的就是在 Vue 中调用该函数一次,您可以添加一个 mixin 并在这个 mixin 中添加 beforeMount hook 将被调用,因此允许我在这里调用它一次。

装饰器更新代码:

export function Listen(name) {
return function (target, key, descriptor) {
if (!target.subscriptions) target.subscriptions = [];


add(target, "Listen", key);

if (process.client) {
const oldValue = descriptor.value;

descriptor.value = function() {
target.subscriptions.push(
target.$eventManager.add(window, name, oldValue.bind(this))
);
};

return descriptor;
}

return descriptor;
};
}

const add = (target, name, functionName) => {
if(!target.decorators) target.decorators = {};
if(!target.decorators[name]) target.decorators[name] = [];

target.decorators[name].push(functionName);
};

Vue 混合:

Vue.mixin({
beforeMount: function() {
if(this.decorators && this.decorators.Listen) {
this.decorators.Listen.forEach(key => this[key]());
}
},
destroyed: function () {
this.$subscriptionManager.remove(this.subscriptions);
}
});

关于Javascript 装饰器监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54600314/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com