vue里面使用EventBus(事件总线)

需求:vue组件中最常见的数据传递就是父子组件之间的传递,父组件可以通过 props 向下传数据给子组件,子组件可以通过 $emit 事件携带数据给父组件。然而当两个页面没有任关系,该如何通信?这就引出了 EventBus ( 事件总线 ) 这个概念

这里我们分别介绍Vue2里面和Vue3里面分别使用事件总线的用法

Vue2里面的使用

EventBus的简介
EventBus又称事件总线,相当于一个全局的仓库,任何组件都可以去这个仓库里获取事件
初始化

方法一:新建文件
首先需要初始化一个 EventBus,并且向外共享一个 Vue 的实例对象
新建一个 js 文件,比如:EventBus.js

// src/utils/EventBus.js 文件
import Vue from 'vue'
 
// 向外共享 Vue 的实例对象
export default new Vue()

方法二:挂载在 Vue 的原型上

在 main.js 中初始化 EventBus

// src/main.js
 
Vue.prototype.$EventBus = new Vue()
 

传递数据
A组件的代码如下:

<template>
  <div>
    <button @click="send">点我发送消息</button>
  </div>
</template>
 
<script>
import EventBus from '@/utils/EventBus'
 
export default {
  data:()=>({
    a_data: 'message'
  }),
  methods: {
    send () {
      EventBus.$emit('share', this.a_data);
    }
  }
}
</script>

B组件的代码如下:

<template>
  <div>
  <h1>{{ b_data }}</h1>
  </div>
</template>
 
<script>
import EventBus from '@/utils/EventBus'
 
export default {
  data: () => ({
    b_data: null
  }),
  created () {
    EventBus.$on('share', value => {
      // 将 A 组件传递过来的数据保存到 B 组件
      this.b_data = value;
    })
  },
  beforeDestroy() {
    // 移除监听事件 "share"
    EventBus.$off('share')
  }
}
</script>

注意点:
总而言之,A组件只向EventBus发送了一次事件,但B组件却进行了多次监听,EventBus容器中有很多个一模一样的事件监听器这时就会出现,事件只触发一次,但监听事件中的回调函数执行了很多次
1.解决办法:在组件离开,也就是被销毁前,将该监听事件给移除,以免下次再重复创建监听
2.语法:EventBus.$off(要移除监听的事件名)

Vue3里面的使用

vue3里面不能使用我们刚才说的EventBus来创建总线了,我们这里使用第三方插件Mitt
Mitt是一个在Vue.js应用程序中使用的小型事件总线库。该库允许组件进行通信,而不必过度依赖父级或子级组件之间的props。

Mitt的特性和功能介绍
轻量级: Mitt只有200字节大小,不会增加你的应用程序的负担
方便易用:只需要引入mitt并配置即可使用
支持任何Javascript环境:Mitt支持在任何Javascript环境下使用,不仅限于Vue
应用场景:组件通信

引入Mitt

安装依赖

执行安装命令

npm install --save mitt

在src目录下面,新建/utils/bus.js,内容如下:

// 事件总线第三方库:
import mitt from 'mitt'

const bus = mitt()
export default bus

使用:

import bus from '@/utils/bus.js'

//in component A 触发
bus.emit('event-name', eventData)

//in component B 监听
bus.on('event-name', eventData => { /* do something with eventData */ })

// 页面卸载的时候取消本次监听
bus.off('event-name'eventData => { /* do something with eventData */ })

如果我们使用TS语法时候,这里的mitt使用如下
在src目录下面,新建/utils/bus.ts,内容如下:

// https://www.npmjs.com/package/mitt
import mitt, { Emitter } from 'mitt';

// 类型
const emitter: Emitter<MittType> = mitt<MittType>();

// 导出
export default emitter;

使用如下:

<script setup lang="ts" name="layoutBreadcrumbUser">
import mittBus from '/@/utils/mitt';

//in component A 触发
mittBus.emit('closeAllTagsView')

//in component B 监听
mittBus.on('closeAllTagsView', eventData => { /* do something with eventData */ })

页面卸载的时候取消本次监听
mittBus.off('closeAllTagsView', eventData => { /* do something with eventData */ })
</script >
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Nuxt2 中使用 eventBus 事件总线,可以通过以下步骤实现: 1. 创建一个 eventBus.js 文件 在项目的根目录中,创建一个 eventBus.js 文件,代码如下: ```javascript import Vue from 'vue'; export const eventBus = new Vue(); ``` 这里使用Vue 的实例来创建 eventBus,并且将它导出,这样就可以在项目中的任何地方使用它了。 2. 在需要使用 eventBus 的组件中引入 eventBus 在需要使用 eventBus 的组件中,可以使用以下代码来引入 eventBus: ```javascript import {eventBus} from '@/eventBus.js'; ``` 这里的 @ 表示项目的根目录,如果 eventBus.js 文件不在根目录中,那么需要改成相应的路径。 3. 使用 eventBus 发送事件 在需要发送事件的地方,可以使用以下代码来发送事件: ```javascript eventBus.$emit('eventName', data); ``` 这里的 eventName 是事件的名称,data 是传递的数据。 4. 使用 eventBus 监听事件 在需要监听事件的地方,可以使用以下代码来监听事件: ```javascript eventBus.$on('eventName', (data) => { // 处理事件 }); ``` 这里的 eventName 是事件的名称,data 是传递的数据。事件触发后,会执行回调函数中的代码。 总结: 以上就是在 Nuxt2 中使用 eventBus 事件总线的方法,通过使用 eventBus,可以在组件之间方便地进行通信。需要注意的是,eventBus使用需要谨慎,过多的使用可能会导致代码的可读性和维护性降低。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值