Vue2.x使用EventBus进行组件通信,而Vue3.x推荐使用mitt.js

比起Vue实例上的EventBusmitt.js好在哪里呢?首先它足够小,仅有200bytes,其次支持全部事件的监听和批量移除,它还不依赖Vue实例,所以可以跨框架使用,React或者Vue,甚至jQuery项目都能使用同一套库。

安装

  • 使用yarn安装
yarn add mitt
  • 或者通过npm安装
npm install --save mitt

官方使用案例

import mitt from 'mitt'

const emitter = mitt()

// listen to an event
emitter.on('foo', e => console.log('foo', e) ) // listen to all events
emitter.on('*', (type, e) => console.log(type, e) ) // fire an event
emitter.emit('foo', { a: 'b' }) // clearing all events
emitter.all.clear() // working with handler references:
function onFoo() {}
emitter.on('foo', onFoo) // listen
emitter.off('foo', onFoo) // unlisten

示例

  • 可以封装一个ES模块,对外暴露一个mitt实例
// src/common/bus.js

// 引入mitt插件
import mitt from 'mitt';
const $bus = mitt();
export default $bus;
  • 挂载到Vue全局变量上
// src/main.ts

import { createApp } from 'vue'
import './style.css'
import App from './App.vue' import $bus from './bus/index.ts' const app = createApp(App);
app.config.globalProperties.$bus = $bus; app.mount('#app');
  • 在父组件中使用
// src/App.vue

<template>
<div>
<button @click="giveMoney(200)">打钱</button>
<Son></Son>
</div>
</template> <script lang="ts" setup>
import Son from './components/son.vue';
import { getCurrentInstance } from 'vue'; const { proxy }: any = getCurrentInstance();
const $bus = proxy.$bus; function giveMoney(num: number) {
// 通过emit方法触发
$bus.emit('add', num);
}
</script>
  • 在子组件中使用
// src/components/son.vue

<template>
<div>
<h2>I am son</h2>
<p>我收到了{{ money || 0 }}¥</p>
</div>
</template> <script lang="ts" setup>
import { ref, getCurrentInstance } from 'vue'; const { proxy }: any = getCurrentInstance();
const $bus = proxy.$bus; const money = ref(0); // 通过on方法监听
$bus.on('add', (number: number) => {
// console.log(number);
money.value = number;
});
</script>
  • 移除事件
// src/App.vue

<button @click="$bus.off('add')">卸载bus总线</button>
<button @click="$bus.all.clear()">卸载所有bus总线</button>

vue3探索——组件通信之事件总线的更多相关文章

  1. vue第八单元(组件通信 子父,父子组件通信 自定义事件 事件修饰符 v-model props验证 )

    第八单元(组件通信 子父,父子组件通信 自定义事件 事件修饰符 v-model props验证 ) #课程目标 掌握使用props让父组件给子组件传参(重点) 掌握props属性的使用以及prop验证 ...

  2. Vue3 父子组件通信

    1.父传子父组件:在子组件上通过 v-bind绑定属性子组件:先定义下基本类型,然后通过setup的第一个参数取获取传过来的值(详细代码见下面)2.子传父父组件:在子组件上绑定一个事件,并定义回调子组 ...

  3. 基于ASP.NET Core 5.0使用RabbitMQ消息队列实现事件总线(EventBus)

    文章阅读请前先参考看一下 https://www.cnblogs.com/hudean/p/13858285.html 安装RabbitMQ消息队列软件与了解C#中如何使用RabbitMQ 和 htt ...

  4. Vue组件通信之非父子组件传值

    前言: 如果想要了解非父子关系的组件传值,最好是在了解父传子和子传父的基础上在来了解非父子传值可能会有更透彻的思路. 因为非父子传值是通过定义事件总线来代理实现父传子+子传父从而实现的传值方式. 这是 ...

  5. vue必须掌握之组件通信(7种方法)

    方法一:$emit / props 父组件通过props的方式向子组件传递,子组件通过$emit触发父组件中v-on绑定的自定义事件 <!--父组件--> <template> ...

  6. python 全栈开发,Day91(Vue实例的生命周期,组件间通信之中央事件总线bus,Vue Router,vue-cli 工具)

    昨日内容回顾 0. 组件注意事项!!! data属性必须是一个函数! 1. 注册全局组件 Vue.component('组件名',{ template: `` }) var app = new Vue ...

  7. vue笔记 - 组件间通信 之 中央事件总线bus

    中央事件总线 - 就是一个名字可以叫做bus的vue空实例,里边没有任何内容: var bus = new Vue(); 人如其名,她就像一个公交车一样,来回输送人,将a站点的A输送到b站点,再将b站 ...

  8. vue组件之间的传值——中央事件总线与跨组件之间的通信($attrs、$listeners)

    vue组件之间的通信有很多种方式,最常用到的就是父子组件之间的传值,但是当项目工程比较大的时候,就会出现兄弟组件之间的传值,跨级组件之间的传值.不可否认,这些都可以类似父子组件一级一级的转换传递,但是 ...

  9. 组件通信之全局事件总线 & 消息订阅发布

    全局事件总线 介绍 一种组件间通信的方式,适用于任意组件间通信. 在使用全局事件总线之前需要一些知识准备 所有组件实例的原型对象的原型对象就是 Vue 的原型对象,即VueComponent.prot ...

  10. vue3.x组件间通信,实用小技巧都在这里

    本想简单写写,没想到说清楚已经变成了一篇很长的帖子,欢迎当笔记搜藏起来. props / emits 父子组件通信 props一般负责向子组件传递数据 下面是一个简单的例子,父组件向子组件传递了一个t ...

随机推荐

  1. 2022-01-01:给定int[][] meetings,比如 { {66, 70} 0号会议截止时间66,获得收益70 {25, 90} 1号会议截止时间25,获得收益90

    2022-01-01:给定int[][] meetings,比如 { {66, 70} 0号会议截止时间66,获得收益70 {25, 90} 1号会议截止时间25,获得收益90 {50, 30} 2号 ...

  2. 浅谈如何使用 github.com/yuin/gopher-lua

    最近熟悉 go 项目时,发现项目中有用到 github.com/yuin/gopher-lua这个包,之前并没有接触过,特意去看了官方文档和找了些网上的资料,特此记录下. 本次介绍计划分为两篇文章,这 ...

  3. Swagger UI接入配置

    Swagger UI接入配置 这里的接入我们依赖于DRF官方推荐的一个第三方包: drf-yasg,下面的接入步骤其实都是按照这个第三方库的文档进行配置,这里只是个最最入门的使用,对于更加高阶或者定制 ...

  4. phpstudy-sqlilabs-less-3

    题目:GET - Error based - Single quotes with twist 基于错误的单引号GET型变形注入 ?id=1 )and 1=2--+ ?id=1 "and 1 ...

  5. 从源码角度剖析 golang 如何fork一个进程

    从源码角度剖析 golang 如何fork一个进程 创建一个新进程分为两个步骤,一个是fork系统调用,一个是execve 系统调用,fork调用会复用父进程的堆栈,而execve直接覆盖当前进程的堆 ...

  6. C++面试八股文:指针占用多少个字节?

    某日小二参加XXX科技公司的C++工程师开发岗位4面: 面试官:memset.memcpy和strcpy的区别是什么? 小二:memset用于将一块内存设置为特定的值, memcpy用于将一块内存从一 ...

  7. 从隐私保护到AI隐私保护:隐私隐私保护的跨隐私保护治理框架实践案例

    目录 标题:<从隐私保护到AI隐私保护:跨隐私保护治理框架实践案例> 背景介绍 随着人工智能技术的广泛应用,隐私保护问题也日益突出.数据隐私泄露.算法歧视等问题引发了公众的担忧和不满.为了 ...

  8. TVM 源码阅读PASS — VectorizeLoop

    本文地址:https://www.cnblogs.com/wanger-sjtu/p/17501119.html VectorizeLoop这个PASS就是对标记为ForKind::kVectoriz ...

  9. AI-3线性回归

    3.1笔记 线性回归假设y与多个x之间的关系是线性的,且噪声符合正态分布. 线性模型则是对输入特征做仿射变换Y^ = W * X+b,其中Y^为预测值,我们希望预测值与真实值Y的误差最小.那如何衡量这 ...

  10. .NET周报 【7月第1期 2023-07-02】

    国内文章 C# 实现 Linux 视频聊天.远程桌面(源码,支持信创国产化环境,银河麒麟,统信UOS) https://www.cnblogs.com/shawshank/p/17420469.htm ...