首页 > 其他分享 >Vue_中央事件总线EventBus传值&自定义MyEventBus

Vue_中央事件总线EventBus传值&自定义MyEventBus

时间:2024-01-22 16:37:26浏览次数:24  
标签:MyEventBus Vue name 自定义 callbacks 事件 监听器 EventBus

一、EventBus的创建以及使用

//1、在 src 的 main.js 中,加上以下代码 
  import Vue from 'vue'
  Vue.prototype.$EventBus = new Vue()

//2、发送消息,使用Vue原型链引入
this.$EventBus.$emit('getSumu', "sumu10086")  

//3、监听接收消息,使用Vue原型链引入
this.$EventBus.$on('getSumu', (data) => {
      console.log('data', data)
    })
  
//4、移除事件监听者(可在beforeDestroy这个生命周期函数时使用,避免EventBus容器中有很多个一模一样的事件监听器)
beforeDestroy(){
    //移除监听事件"getSumu"
    this.$EventBus.$off("getSumu")
  }


二、自定义EventBus

//1、创建一个中央时间总线类   
class MyEventBus {
  constructor() {
    this.callbacks = {};
  }

  $on(name, fn) {
    //添加参数验证,确保回调函数必须是一个函数。
    if (typeof fn !== 'function') {
      throw new Error('Callback must be a function');
    }

    this.callbacks[name] = this.callbacks[name] || [];
    this.callbacks[name].push(fn);
  }
  
  //添加$once方法,用于注册一次性事件监听器。
  $once(name, fn) {
    const onceWrapper = (...args) => {
      fn(...args);
      this.$off(name, onceWrapper);
    };

    this.$on(name, onceWrapper);
  }

  $emit(name, ...args) {
    if (this.callbacks[name]) {
      this.callbacks[name].forEach((cb) => {
        try {
          setImmediate(() => cb(...args));//使用 setImmediate 更好地利用事件循环,提高性能,延迟执行回调函数,以支持异步操作。。
        } catch (error) {//捕获回调函数执行过程中的错误,并输出错误信息。
          console.error(`Error while executing callback for event '${name}':`, error);
        }
      });
    }
  }
  
  //添加$off方法,用于取消特定事件的监听器。
  $off(name, fn) {
    if (this.callbacks[name]) {
      const index = this.callbacks[name].indexOf(fn);
      if (index !== -1) {
        this.callbacks[name].splice(index, 1);
      }
    }
  }

  //添加 $clear 方法,用于清空所有事件监听器。
  $clear() {
    this.callbacks = {};
  }
}

//2、使用如下:

/*创建 MyEventBus 实例*/
  const MyEventBus= new MyEventBus();  

/*注册事件监听器*/
MyEventBus.$on('myEvent', (data) => {
  console.log('Event received:', data);
});

/*发布事件*/
MyEventBus.$emit('myEvent', 'Hello Sumu');

/*取消事件监听器*/
MyEventBus.$off('myEvent', callback);

/*注册一次性事件监听器*/
MyEventBus.$once('myEvent', (data) => {
  console.log('One-time event received:', data);
});

/*发布事件(会触发一次性事件监听器)*/
MyEventBus.$emit('myEvent', 'Hello again!');

/*清空所有事件监听器*/
MyEventBus.$clear();

标签:MyEventBus,Vue,name,自定义,callbacks,事件,监听器,EventBus
From: https://www.cnblogs.com/sumu80/p/17980150

相关文章

  • vue 电子盖章
       <!--//?模块说明=>合同盖章模块addToTab--><template><divclass="contract-signature-view"><!--<divclass="title-operation"><h2class="title">图片盖章</h2></......
  • gin-vue-admin部署
    前言gin-vue-admin是什么gin-vue-admin是一个基于Gin和Vue.js的全栈前后端分离框架。它提供了一套完整的开发工具和模板,用于快速搭建企业级Web应用程序。gin-vue-admin后端使用Go语言和Gin框架实现,前端使用Vue.js和ElementUI组件库,通过RESTfulAPI进行通......
  • 自定义导航栏
    我们不同手机的导航栏不一样,这是为了确保我们每个手机都能看到我们导航栏的全部信息不会被遮挡,给不同机型进行样式适配 准备组件静态结构修改页面配置,隐藏默认导航栏,修改文字颜色样式适配->安全区域<scriptsetuplang="ts">//</script><template><viewclass......
  • Ubuntu下安装Vue
    参考来源https://www.cnblogs.com/architectforest/p/14913505.htmlhttps://blog.csdn.net/haonan_z/article/details/122608063一、下载NodeNodejs官网手动安装最新的LTS版本选择版本进行下载,下载后解压缩使用命令或者界面操作均可安装Nodejs移动到软件安装目录li......
  • springboot自定义更换启动banner动画
    springboot自定义更换启动banner动画......
  • npm ERR! code 1 npm ERR! path E:\20231213\vue-element-admin\node_modules\nod
    执行npminstall报错,根据下面报错信息可知,是由于nodejs和node-sass版本不一致造成的,也就是当前项目比较旧,而我安装的nodejs比较新。PSE:\20231213\vue-element-admin>PSE:\20231213\vue-element-admin>PSE:\20231213\vue-element-admin>PSE:\20231213\vue-element-adm......
  • 自定义vcpkg注册表(一)
    vcpkg提供自定义注册表的功能,主要用途可以是:公司私有库的注册表,自己对官方port的补充但是目前还不想提交到官方的port以及自己和官方对同一个库有不同的构建意见。在自定义注册表中新建port尽管我经常说vcpkg的本质是git和cmake的组合使用,但其实vcpkg还提供了vcpkg.exe和一整套......
  • 自定义按钮模板
    自定义按钮模板本文同时为b站WPF课程的笔记,相关示例代码对应09上半节课自定义模板对于当前的这个样式不满意——想要自己控制它这个控件长什么样子比如在一节课中,为了实现圆角按钮,我们是从网上面抄了一段代码过来那么,如何建立一种自带圆角的按钮模板呢?<ButtonWidth="300"......
  • vue3中Fragment特性的一个bug,需要留意的注意事项
    vue3中的Fragment模版碎片特性是什么,简单的理解就是template模板代码不在像vue2中那样必须在根节点在包裹一层节点了。vue2写法<template><div><h1>标题</h1><p>正文内容</p></div></template>vue3写法<template><h1>标题</h1>......
  • 自定义tabbar
    [基础能力/自定义tabBar(qq.com)]1.在app.json中在原来的tabbar配置里面顶部添加 “custom”:true;添加  "usingComponents": {},"tabBar":{"custom":true,"color":"#000","selectedColor":"blue&qu......