当前位置:首页 > JavaScript

js实现bus

2026-04-06 17:30:42JavaScript

实现事件总线(Bus)的方法

事件总线(Bus)是一种用于组件间通信的机制,允许不同组件通过发布(publish)和订阅(subscribe)事件来交互。以下是使用 JavaScript 实现事件总线的几种方法。

使用自定义事件类

创建一个简单的 EventBus 类,管理事件的订阅和发布:

js实现bus

class EventBus {
  constructor() {
    this.events = {};
  }

  subscribe(eventName, callback) {
    if (!this.events[eventName]) {
      this.events[eventName] = [];
    }
    this.events[eventName].push(callback);
  }

  publish(eventName, ...args) {
    const callbacks = this.events[eventName];
    if (callbacks) {
      callbacks.forEach(callback => callback(...args));
    }
  }

  unsubscribe(eventName, callback) {
    const callbacks = this.events[eventName];
    if (callbacks) {
      this.events[eventName] = callbacks.filter(cb => cb !== callback);
    }
  }
}

// 使用示例
const bus = new EventBus();
bus.subscribe('event1', (data) => console.log('Event1:', data));
bus.publish('event1', 'Hello World');

使用 Vue 的事件总线模式

Vue 中可以通过创建一个空的 Vue 实例作为事件总线:

js实现bus

import Vue from 'vue';
const bus = new Vue();

// 订阅事件
bus.$on('event-name', (data) => {
  console.log('Event received:', data);
});

// 发布事件
bus.$emit('event-name', { message: 'Hello' });

// 取消订阅
bus.$off('event-name');

使用 Node.js 的 EventEmitter

Node.js 内置的 events 模块提供了 EventEmitter 类,可以直接用作事件总线:

const EventEmitter = require('events');
const bus = new EventEmitter();

// 订阅事件
bus.on('event', (data) => {
  console.log('Event data:', data);
});

// 发布事件
bus.emit('event', { key: 'value' });

// 取消订阅
bus.off('event', listenerFunction);

使用第三方库

一些第三方库如 mitttiny-emitter 提供了轻量级的事件总线实现:

// 使用 mitt
import mitt from 'mitt';
const bus = mitt();

bus.on('event', (data) => console.log(data));
bus.emit('event', 'Hello');

// 使用 tiny-emitter
import { TinyEmitter } from 'tiny-emitter';
const emitter = new TinyEmitter();

emitter.on('event', (data) => console.log(data));
emitter.emit('event', 'World');

注意事项

  • 避免内存泄漏,及时取消不再需要的事件订阅。
  • 事件总线适合小型应用或简单场景,复杂状态管理建议使用专门的工具(如 Vuex、Redux)。
  • 命名冲突问题可以通过命名空间或前缀解决。

标签: jsbus
分享给朋友:

相关文章

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…

js验证码的实现

js验证码的实现

验证码的基本实现原理 验证码(CAPTCHA)的核心目标是区分人类用户和自动化程序。JavaScript可用于生成或验证客户端验证码,但需注意纯前端验证可能被绕过,通常需结合后端验证。 纯前端验证码…

js进度条实现

js进度条实现

使用HTML和CSS创建基础结构 在HTML中创建一个容器元素用于显示进度条,通常使用<div>元素。CSS用于设置进度条的样式,包括宽度、高度、颜色和圆角等属性。 <div cl…

js实现 拖动

js实现 拖动

实现拖动的步骤 HTML 结构 创建一个可拖动的元素和一个放置区域: <div id="draggable" draggable="true">拖动我</div> <d…