useEventBus.uts 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /**
  2. * 事件总线
  3. */
  4. // 事件处理函数类型
  5. type EventHandler = (data?: any) => void
  6. // 事件映射
  7. const eventMap = new Map<string, EventHandler[]>()
  8. /**
  9. * 事件总线
  10. */
  11. export const useEventBus = () => {
  12. /**
  13. * 监听事件
  14. */
  15. const on = (event: string, handler: EventHandler): void => {
  16. if (!eventMap.has(event)) {
  17. eventMap.set(event, [])
  18. }
  19. const handlers = eventMap.get(event)
  20. if (handlers != null) {
  21. handlers.push(handler)
  22. }
  23. }
  24. /**
  25. * 触发事件
  26. */
  27. const emit = (event: string, data?: any): void => {
  28. const handlers = eventMap.get(event)
  29. if (handlers != null) {
  30. handlers.forEach((handler) => {
  31. handler(data)
  32. })
  33. }
  34. }
  35. /**
  36. * 移除事件监听
  37. */
  38. const off = (event: string, handler?: EventHandler): void => {
  39. if (handler == null) {
  40. // 移除所有监听
  41. eventMap.delete(event)
  42. } else {
  43. // 移除指定监听
  44. const handlers = eventMap.get(event)
  45. if (handlers != null) {
  46. const index = handlers.indexOf(handler)
  47. if (index > -1) {
  48. handlers.splice(index, 1)
  49. }
  50. }
  51. }
  52. }
  53. /**
  54. * 只监听一次
  55. */
  56. const once = (event: string, handler: EventHandler): void => {
  57. const onceHandler = (data?: any): void => {
  58. handler(data)
  59. off(event, onceHandler)
  60. }
  61. on(event, onceHandler)
  62. }
  63. return {
  64. on,
  65. emit,
  66. off,
  67. once
  68. }
  69. }