vue3 hooks之事件广播(支持跨标签页)

/***
 * 同源下的全局事件总线,支持跨标签页通信
 * 第一步:注册事件
 * 第二步:广播事件
 * 第三步:处理事件
 */

// source:消息发起源href,将在跨标签页通信时传入
interface callback {
    (data: any, source: any): void
}
type eventName = string;

class EventBus {
    protected eventMap: any = new Map();
    protected channel: any = new BroadcastChannel('__event-bus');

    protected register(eventName: eventName, callback: callback) {
        if (!this.eventMap.has(eventName)) {
            this.eventMap.set(eventName, [])
        }
        this.eventMap.get(eventName).push(callback)
    }
    protected tryRunCallback(eventName: eventName, data: any, source?: string) {
        if (!this.eventMap.has(eventName)) return;
        this.eventMap.get(eventName).forEach((callback: callback) => {
            callback(data, source)
        });
    }

    // 广播事件
    emit(eventName: eventName, data?: any) {
        this.tryRunCallback(eventName, data);
        // 跨标签页 发送消息
        this.channel.postMessage({ eventName, data, source: location.href })
    }
    // 订阅事件
    on(eventName: eventName, callback: callback) {
        this.register(eventName, callback);
        // 跨标签页 接收订阅消息
        this.channel.onmessage = (event: { data: any }) => {
            const data = event.data;
            this.tryRunCallback(data.eventName, data.data, data.source)
        }
    }
    // 移除某个订阅事件
    off(eventName: eventName, callback: callback) {
        if (!this.eventMap.has(eventName)) return;
        const callbacks = this.eventMap.get(eventName)
        this.eventMap.set(eventName, callbacks.filter((cb: callback) => cb !== callback))
    }
    // 清除某个事件的所有订阅
    clear(eventName: eventName) {
        this.eventMap.delete(eventName)
    }
    // 清除所有订阅事件
    clearAll() {
        this.eventMap = new Map()
    }
}

export default new EventBus()

如何使用:

import Event from "EventBus"


Event.on('事件名', () => { 
    //....
})


Event.emit('事件名', { ...数据 })

相关推荐

  1. vue3 hooks事件广播支持标签

    2024-03-30 00:18:02       36 阅读
  2. vue3第二十六节(Hooks 封装注意事项

    2024-03-30 00:18:02       37 阅读
  3. Vue3学习——hooks

    2024-03-30 00:18:02       54 阅读
  4. Android进程通信广播

    2024-03-30 00:18:02       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-30 00:18:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-30 00:18:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-30 00:18:02       87 阅读
  4. Python语言-面向对象

    2024-03-30 00:18:02       96 阅读

热门阅读

  1. 监控运维工程师/阿里acp

    2024-03-30 00:18:02       42 阅读
  2. YOLOv5-小知识记录(二)

    2024-03-30 00:18:02       46 阅读
  3. 数据链路层(四):数据链路层协议

    2024-03-30 00:18:02       44 阅读
  4. C# 异步与 Unity 协程(实例讲解)

    2024-03-30 00:18:02       43 阅读
  5. math模块篇(五)

    2024-03-30 00:18:02       34 阅读
  6. 回溯算法|77.组合

    2024-03-30 00:18:02       39 阅读
  7. LEETCODE-DAY37

    2024-03-30 00:18:02       34 阅读