You need to sign in or sign up before continuing.
eventBus.js 2.06 KB
/**
 * 事件总线工具
 *
 * @description 轻量级事件总线,用于跨页面组件通信
 * @module utils/eventBus
 * @author Claude Code
 * @created 2026-02-08
 */

/**
 * 事件总线实现
 * @type {Object}
 */
const eventBus = {
  /**
   * 事件监听器存储
   * @type {Object<string, Array<Function>>}
   */
  events: {},

  /**
   * 监听事件
   *
   * @param {string} event - 事件名称
   * @param {Function} callback - 回调函数
   * @returns {Function} 取消监听函数
   *
   * @example
   * const off = eventBus.on('feedback:submit', (data) => {
   *   console.log('收到反馈提交事件:', data)
   * })
   * // 取消监听
   * off()
   */
  on(event, callback) {
    if (!this.events[event]) {
      this.events[event] = []
    }
    this.events[event].push(callback)

    // 返回取消监听函数
    return () => this.off(event, callback)
  },

  /**
   * 取消监听事件
   *
   * @param {string} event - 事件名称
   * @param {Function} callback - 回调函数
   */
  off(event, callback) {
    if (!this.events[event]) return

    if (callback) {
      // 移除特定的回调
      this.events[event] = this.events[event].filter(cb => cb !== callback)
    } else {
      // 移除所有回调
      delete this.events[event]
    }
  },

  /**
   * 发送事件
   *
   * @param {string} event - 事件名称
   * @param {*} data - 事件数据
   *
   * @example
   * eventBus.emit('feedback:submit', { id: 123 })
   */
  emit(event, data) {
    if (!this.events[event]) return

    this.events[event].forEach(callback => {
      try {
        callback(data)
      } catch (err) {
        console.error(`[EventBus] 事件处理错误 [${event}]:`, err)
      }
    })
  },

  /**
   * 清空所有事件监听器
   */
  clear() {
    this.events = {}
  }
}

/**
 * 事件名称常量
 * @enum {string}
 */
export const Events = {
  /** 反馈提交成功 */
  FEEDBACK_SUBMIT: 'feedback:submit',
  /** 收藏列表更新 */
  FAVORITES_UPDATE: 'favorites:update',
  /** 用户信息更新 */
  USER_UPDATE: 'user:update'
}

export default eventBus