手写$on及$emit,实现项目全局派发更新及事件监听

$on、$emit、$off全局API实现

全局自定义事件派发更新及监听是一个比较常用且实用的功能,主要用于实现项目各模块间数据传递不方便或实时数据更新等场景

首先创建全局对象handlerGather用于存储自定义事件

const handlerGather = {};

创建$emit方法,定义全局自定义事件并派发更新,同时将API挂载到window对象上


/**
 * 全局派发更新方法
 * @param event 派发更新的事件名
 * @param data 回调函数传递的数据
 * @returns 返回值
 */
window.$emit = function (event, data) {
  const fn = (ev, d) => {
    const len = handlerGather[ev].length;
    for (let i = 0; i < len; i++) {
      const ele = handlerGather[ev][i];
      // 派发更新数据
      ele(d);
    }
  };
  if (Array.isArray(event)) {
    // 监听的事件是一个数组时
    event.forEach((item) => {
      fn(item, data);
    });
  } else {
    // 监听的事件只有一个时
    fn(event, data);
  }
  return window;
};

创建$on方法,全局监听对应全局自定义事件,同时将API挂载到window对象上

/**
 * 全局监听方法
 * @param event 监听的事件名
 * @param fn 回调函数
 * @returns 返回值
 */
window.$on = function (event, fn) {
  if (Array.isArray(event)) {
    // 监听的事件是一个数组时:遍历取出每个事件单独监听
    event.forEach((item) => {
      window.$on(item, fn);
    });
  } else {
    // 监听的事件不为数组时
    (handlerGather[event] || (handlerGather[event] = [])).push(fn);
  }
  return window;
};

创建$off方法,销毁对应全局自定义事件,同时将API挂载到window对象上

/**
 * 销毁全局自定义事件
 * @param event 需要销毁的事件名
 * @returns 
 */
window.$off = function (event) {
  // 事件不存在则终止执行
  if (!handlerGather[event]) return;
  // 销毁的事件为数组时
  if (Array.isArray(event)) {
    event.forEach((item) => {
      if (handlerGather[event]) {
        // 销毁对应事件
        handlerGather[event] = [];
      }
    });
  } else {
    // 销毁的事件不为数组时
    handlerGather[event] = [];
  }
  return window;
};

使用方法

$emit用法

window.$emit('updateEvent', {
    content: '',
});

$on用法

window.$on('updateEvent', (data) => {
    console.log(data);
});

$off用法

window.$off('updateEvent');

下载npm包直接使用

npm i global-listener --save-dev
在项目入口文件main.js直接引入包文件即可将上述三个API注册到window对象上在项目中直接使用

import 'global-listener';
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue中,$on、$off、$emit是一些用于组件间通信的方法。可以通过使用$bus实例来传递非父子组件之间的数据。比如,使用$emit方法事件,使用$on方法监听事件,使用$off方法移除事件的绑定。 在子组件中,可以通过this.$bus.$emit(eventName, payload)来触一个事件并传递数据。比如子组件1可以使用this.$bus.$emit("hello", param)来触名为"hello"的事件,并将param作为数据传递。 在组件中,可以使用this.$bus.$on(eventName, callback)来监听一个事件。当触了该事件时,绑定的回调函数将被调用。比如在子组件中可以使用this.$on('closeModal', res => {})来监听名为"closeModal"的事件。 同时,也可以使用this.$bus.$off(eventName)来移除绑定的事件。比如在组件销毁前,可以使用this.$off("closeModal")来移除对"closeModal"事件监听。 通过使用$on、$off、$emit这些方法,可以方便地在Vue组件间进行通信和数据传递。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vue中$bus的用法及$emit$on、$off的使用](https://blog.csdn.net/leijie0322/article/details/128210817)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [vue中$emit$on,$off跟用法](https://blog.csdn.net/Billow_lamb/article/details/115007731)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [$emit,$on,$off--vue](https://blog.csdn.net/weixin_57844432/article/details/126599659)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值