index.ts 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { v4 } from '../../utils/uuid/index'
  2. import { EventKey, EventMessage } from './interface'
  3. /**
  4. * 事件总线
  5. */
  6. export default new (class {
  7. private eventMap = new Map<string, EventMessage>();
  8. /** 订阅事件 */
  9. $on(eventKey: keyof typeof EventKey | (keyof typeof EventKey)[], callback: EventMessage['callback']) {
  10. const uuid = v4();
  11. const keys = Array.isArray(eventKey) ? eventKey : [eventKey];
  12. this.eventMap.set(uuid, {
  13. keys,
  14. callback
  15. })
  16. /** 销毁事件,注意离开页面时要手动销毁当前页面订阅的事件,防止事件重复触发 */
  17. return {
  18. uuid,
  19. cancel: () => this.eventMap.delete(uuid)
  20. }
  21. }
  22. /** 触发事件 */
  23. $emit(eventKey: keyof typeof EventKey, data?: unknown) {
  24. for (const message of this.eventMap.values()) {
  25. if (message.keys.includes(eventKey)) {
  26. message.callback(data);
  27. }
  28. }
  29. }
  30. /** 取消事件 */
  31. $off(...eventkeys: (keyof typeof EventKey)[]) {
  32. if (eventkeys.length) {
  33. for (const [uuid, message] of this.eventMap.entries()) {
  34. for (let i = message.keys.length - 1; i >= 0; i--) {
  35. if (eventkeys.includes(message.keys[i])) {
  36. message.keys.splice(i, 1);
  37. }
  38. }
  39. if (!message.keys.length) {
  40. this.eventMap.delete(uuid);
  41. }
  42. }
  43. } else {
  44. this.eventMap.clear();
  45. }
  46. }
  47. })