vue3中的event bus

这篇具有很好参考价值的文章主要介绍了vue3中的event bus。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

event Bus在vue3中事实上已经被删除了,因为官方说它可能会导致一些潜在的问题。如,在大型项目中使用 Event Bus 可能会变得难以维护和调试,同时也可能会影响应用程序的性能。此外,在 Vue 3.x 中已经有更多先进和强大的工具来进行组件之间通信,例如 provide/inject 和 Emit/Listeners 等机制。因此,Vue 3.x 团队决定删除 Event Bus,以鼓励开发者使用更好的解决方案。

但是还有很多项目是相对较小的,依然是可以使用的。尽管有了更好的方法,但是在不滥用的情况下,event bus还是有适合它的使用场景的,甚至在某些场景下,它更简单,更方便。


vue2中的event bus

Vue 2 中的事件总线 Event Bus 是一种用于跨组件通信的机制。通过创建一个全局的 EventBus 对象,可以在任何组件中触发和监听自定义事件,实现组件之间的解耦。

Event Bus 的实现步骤如下:

⭐创建一个全局的 EventBus 对象

// EventBus.js
import Vue from 'vue';
export const eventBus = new Vue();

⭐在需要使用 Event Bus 的组件中引入并注册 EventBus 对象

// ComponentA.vue

import { eventBus } from './EventBus';

export default {
  name: 'ComponentA',
  methods: {
    handleClick() {
      // 触发自定义事件
      eventBus.$emit('custom-event', data);
    }
  },
  created() {
    // 监听自定义事件
    eventBus.$on('custom-event', (data) => {
      console.log('Received data:', data);
    });
  }
}

⭐在另一个组件中也可以引入并注册 EventBus 对象,然后同样通过 $emit 和 $on 方法进行事件的触发和监听。
使用 Event Bus 可以轻松地实现兄弟、父子等关系不直接相连的组件之间进行通信。但是,如果过度使用会导致代码难以维护和理解,建议在必要时才使用 Event Bus

所以,不要滥用,不要滥用,不要滥用!!!


event bus在vue3中的体现

event Bus(事件总线)是一种在组件之间通信的模式,它可以让任何两个组件之间进行通信,而不必担心组件层次结构或父子关系

在 Vue 3 中,event Bus 的实现方式与 Vue 2 相同,即通过创建一个全局 Vue 实例作为中央事件总线。但是在 Vue 3 中,由于引入了 Composition API,我们可以使用 provideinject API 来创建自己的 event Bus。这种方式更加灵活,可以更好地支持 Composition API。


创建一个vue3的event bus

⭐在 Vue 3 中,可以使用 createApp 函数创建应用实例,并使用 provideinject API 来创建一个支持 Vue 3 的 Event Bus。

// EventBus.js

import { createApp, inject } from 'vue'

const EventBusSymbol = Symbol()

const EventBus = {
  install(app) {
    const eventBus = createApp({})
    app.provide(EventBusSymbol, eventBus)
  },

  useEventBus() {
    const eventBus = inject(EventBusSymbol)
    if (!eventBus) {
      throw new Error('Event Bus not found')
    }
    return eventBus
  }
}

export default EventBus

我们首先创建了一个 EventBusSymbol,用于标识我们创建的全局事件总线。然后,我们定义了一个 EventBus 对象,该对象包含了一个 install 方法和一个 useEventBus 方法。

install 方法中,我们使用 createApp 函数创建了一个空的 Vue 应用实例,并通过 app.provide 方法将其挂载到应用实例上,使其成为一个全局的事件总线。

useEventBus 方法中,我们使用 inject API 获取到应用实例,如果不存在则抛出一个错误。然后,我们返回这个应用实例,这样就可以在组件中使用它来进行事件的发布和订阅了。

OK,继续。我们在 Vue 3 中创建一个支持 Event Bus 的应用实例:

// main.js

import { createApp } from 'vue'
import App from './App.vue'
import EventBus from './EventBus'

const app = createApp(App)

app.use(EventBus)

app.mount('#app')

在上面的代码中,我们首先导入 EventBus 对象,然后使用 app.use 方法将其挂载到应用实例上。这样,我们就可以在应用中使用 useEventBus 方法来获取全局事件总线了。


封装的event bus最优使用场景

尽管在 Vue 3 中提供了一些新的 API,如 provide/injectEmits/Listeners 等,这些功能可以用来处理组件之间的通信,而且更加强大和灵活。

因此,在某些情况下,Vue 3 提供的方法可以完全替代 Vue 2 的 Event Bus。但是,在一些特定场景下,创建一个event Bus 可能仍然是一个不错的选择。

比如说:

非父子组件之间的通信:
如果需要在非父子关系的组件之间进行通信,可以使用自己封装的 Event Bus 实现跨级通信。

多个兄弟组件之间的通信:
如果需要多个兄弟组件之间相互通信,则可以使用自己封装的 Event Bus 来实现。

全局事件监听:
如果需要在任何地方都能监听到某个事件并做出响应,则可以使用自己封装的全局事件总线来实现。文章来源地址https://www.toymoban.com/news/detail-478916.html


到了这里,关于vue3中的event bus的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3警告Extraneous non-emits event listeners (XXX) were passed to component but could not be automatic

    vue3 警告Extraneous non-emits event listeners (selectMeth) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the “emits” option. 之所以出现这个警告,是因为在子组件向父组件发

    2024年02月09日
    浏览(45)
  • 人机融合智能中的事实与价值

    在人机融合智能中,事实和价值分别扮演着不同的角色和功能。 事实是客观存在的真实描述,可以通过数据、观测和验证等方式获取。在人机融合智能中,人工智能通过处理和分析大量的数据来提供客观事实的支持。例如,在搜索引擎中,人机融合智能可以根据用户提出的问

    2024年02月14日
    浏览(90)
  • 人机融合智能中的事实与价值(新)

    以前,在哲学和伦理学领域, 存在着一个被称为\\\"应当归因问题\\\"的休谟之问。 这个问题探讨了我们是否能够从客观的存在状态(\\\"是什么\\\")中推导出我们应该如何行动的价值判断(\\\"应该怎样\\\")。这个问题涉及到了描述和规范之间的差距,即从描述客观现实到得出道德或行为

    2024年02月16日
    浏览(36)
  • 数仓中的维度、度量、指标、事实、属性几个概念如何区分?有何异同?

    维度是说明数据,是业务中对象的描述性属性或特征,用于对业务过程进行分析归类。 属性是刻画某个实体对象维度的数据形态。 通过事物发展的数量、质量两大方面,从横比、纵比角度进行全方位的比较,我们才能够全面的了解事物发展的好坏。 维度横比纵比 如用户数环

    2024年02月10日
    浏览(38)
  • vue3中的Props

    一个组件需要显示声明它所接受的props,这样vue才能知道外部传入的哪些是props,哪些是透传attribute 在使 script setup 的单文件中,props可以使用 ==defineProps()==宏来声明: 在没有使用 script setup 的组件中,prop可以使用props选项来声明: 注意传递给 defineProps 的参数和提供给props选项

    2024年02月08日
    浏览(37)
  • vue3中的provide

    作用:实现祖孙件通信 套路:父组件有一个provide选项来提供数据,子组件有一个inject选项来开始使用这些数据 具体写法: 祖组件中: child: run: 当然,如果存在子组件的子组件,也是可以直接获取到其上一级上一级的组件 child: childchild:

    2024年02月13日
    浏览(78)
  • vue3中的pinia

    pinia官网 main.ts中引入 创建store文件夹,创建index.ts App.vue中引入 store  是一个用 reactive  包裹的对象,这意味着不需要在getter 之后写 .value ,但是,就像 setup  中的 props  一样, 我们不能对其进行解构 为了从 Store 中提取属性同时保持其响应式,您需要使用 storeToRefs() 。 它将

    2024年02月10日
    浏览(37)
  • vue3中的hooks

    一、概念 hook 是钩子的意思, hooks 类似于封装公共方法的 js文件,实现功能的重复利用。 hooks   清楚复用功能代码的来源, 清晰易懂 hooks解决 mixin 的问题: mixins  逻辑互相嵌套,数据来源不明,且不能互相传递状态 二、hooks的命名   函数名/文件名,以use开头,形如: useXX

    2024年02月14日
    浏览(38)
  • 【Vue3】vue3中的watchEffect使用及其他的API

    目录  一,watchEffect 二,生命周期 三,什么是hooks? 四,toRef  五,其他组合式API 5.1shallowReactiveshallowRef 5.2readonlyshallowReadonly 5.3.toRawmarkRaw 5.4自定义Ref-customRef ​5.5provide$inject 5.6响应式数据的判断 写在最后     1.watch: 既要指明监视的属性,也要指明监视的回调。 2.watchEffect: 不

    2024年02月01日
    浏览(63)
  • Vue3中的声明周期

    Vue2 的生命周期在Vue3中都可以正常使用; Vue3 的生命周期和Vue2不同的地方在于卸载组件前后的不同; Vue3 中组合式 API 还提供了onRenderTracked 和 onRenderTriggered 两个钩子,这两个主要是用来做调试的; beforeCreate - 使用 setup() created - 使用 setup() beforeMount - onBeforeMount mounted - onMoun

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包