Vue+Typescript 反射机制(事件注册)

TypeScript 没有类似C语言那样的#define功能,在Vue中实现反射机制进行事件扩展,需要在另一个文件进行import ‘xxx’; 这样的话,这样的话,会破坏系统架构。如何让二次开发只关注事件本身,让工程自动参与编译,让用户只用写自己的事件就行了呢?

需要解决的问题:如何不使用import ‘xxx’,来激活已注册的事件?
// ievent_handler.ts 文件

export abstract class IEventHandler{
	constructor();
	abstract name():void;
}

// event_handler_mgr.ts 文件


export class EventHandlerManager {
    private static _instance: EventHandlerManager;
    public static instance(): EventHandlerManager {
        if (!this._instance) {
            this._instance = new EventHandlerManager();
        }
        return this._instance;
    }
    menuHandler = new Map<string, IEventHandler>();
    private search(menuName: string): Module.IEventHandler|undefined {
        return this.menuHandler.get(menuName);
    }
    public register(eh: EventHandler) {
        const ehName: string = eh.name();
        const event = this.search(ehName);
        if( event === null ){
        	this.menuHandler.set(ehName, event);
        }
    }
}

// hello_event_handler.ts

import { EventHandlerManager } from "./event_handler_mgr";
export class SayHello extends EventHandler {
    constructor() {
        super();
    }
    public name():string{
        return 'sayHello'
    }
}

EventHandlerManager.instance().register(new SayHello()); 

对于hello_event_handler.ts文件,必须要在其他的文件里执行类似 import 'hello_event_handler.ts' 这样的语句才行,如果没有这句话,那么hello_event_handler.ts这个文件不会参与编译,SayHello也不会存在于注册表中。如果有很多的event_handler文件,那么会严重破坏已有的文件结构和程序架构.

// 未修改之前,在plugins.js中添加所有的event_handler,例如
// plugins.js

import './plugins/hello_event_handler.ts'
import './plugins/circle_event_handler.ts'
import './plugins/base/file_event_handler.ts'
import './plugins/utility/string_event_handler.ts'
// ... 

// 优化后:
// plugins.js

const contextEvent = require.context('./plugins/', true, /\.ts$/);
contextEvent.keys().forEach((tsFile) => {
    //本行代码是文件能够成功引入的关键
    contextEvent(tsFile);  // 这句话,会执行到所有脚本里的注册函数,实现了注册的目的
});

这样的话,开发者只需要按照要求,写好event_handler事件,放到plugins下就行了。

如果您有更好的解决方案,欢迎留言

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值