import {useCallback, useRef, useEffect} from 'react'; import {EventEmitter} from 'events'; const _EVENT = new EventEmitter(); type customEventProp = {}; type evtHandlerProp = (e: customEventProp) => void; export function useEvent(evtName: string, handler: evtHandlerProp) { // 一个指向handler的指针 const handRef = useRef(handler); // 更新handler引用 useEffect(() => { handRef.current = handler; }, [handler]); // 初始化/解绑 useEffect(() => { const eventListener = (evt: customEventProp) => handRef.current?.call(null, evt); _EVENT.addListener(evtName, eventListener); return () => { _EVENT.off(evtName, eventListener); }; }, [evtName]); } export function useEmitter(evtName: string) { const Emitter = useCallback((data: T) => _EVENT.emit(evtName, data), [evtName]); return Emitter; }