Explorar el Código

refactor: 去除EventEmitter global模式

lanjianrong hace 2 años
padre
commit
a4a8756133
Se han modificado 2 ficheros con 12 adiciones y 15 borrados
  1. 9 9
      src/utils/emit/event.ts
  2. 3 6
      src/utils/emit/index.ts

+ 9 - 9
src/utils/emit/event.ts

@@ -2,15 +2,16 @@ import { cloneDeep } from 'lodash'
 import { useEffect, useRef } from 'react'
 type SubscriptionParams<T = any> = {
   params: T
-  event: string | number
+  event: EventType
 }
+export type EventType = string | symbol
 type Subscription<T> = ({ params, event }: SubscriptionParams<T>) => void
 class EventEmitter<T> {
-  private subscriptions = new Map<string | number, Subscription<T>>()
+  private subscriptions = new Map<EventType, Subscription<T>>()
   constructor() {
     this.clear()
   }
-  useSubscription = (event: string, listener?: Subscription<T>) => {
+  useSubscription = (event: EventType, listener?: Subscription<T>) => {
     const callbackRef = useRef<Subscription<T>>()
     useEffect(() => {
       callbackRef.current = listener
@@ -25,21 +26,20 @@ class EventEmitter<T> {
       }
     }, [])
   }
-  emit = (event: string | number, ...args: T extends any[] ? any[] : any) => {
-    if (typeof event === 'string' || typeof event === 'number') {
+  emit = (event: EventType, ...args: T extends any[] ? any[] : any) => {
+    if (typeof event === 'string' || typeof event === 'symbol') {
       const subscriptionValuesCallback = this.subscriptions.get(event)
       subscriptionValuesCallback?.({
         params: cloneDeep(args) as any,
         event
       })
-    } else throw new TypeError('event must be string or number !')
+    } else throw new TypeError('event must be string or symbol !')
   }
-  removeListener = (event: string) => {
+  removeListener = (event: EventType) => {
     this.subscriptions.delete(event)
   }
   clear = () => {
     this.subscriptions.clear()
   }
 }
-const eventEmitterOverall = new EventEmitter()
-export { EventEmitter, eventEmitterOverall }
+export { EventEmitter }

+ 3 - 6
src/utils/emit/index.ts

@@ -1,12 +1,9 @@
-import { useEffect, useMemo, useRef } from 'react'
+import { useEffect, useRef } from 'react'
 import { EventEmitter, eventEmitterOverall } from './event'
-export default function useEventEmitter<T = void>(options?: { global?: boolean }) {
+export default function useEventEmitter<T = void>() {
   const ref = useRef<EventEmitter<T> | typeof eventEmitterOverall>()
-  const eventEmitterOptions = useMemo(() => options ?? { global: false }, [options])
   if (!ref.current) {
-    ref.current = eventEmitterOptions.global
-      ? (ref.current = eventEmitterOverall)
-      : (ref.current = new EventEmitter())
+    ref.current = new EventEmitter()
   }
   useEffect(() => {
     return () => ref.current?.clear()