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. 2021-12-26:给定一个长度为n的数组arr,求有多少个子数组满足 : 子数组两端的值,是这个子数组的最小值和次小值,最小值和次小值谁在最左和最右无所谓。 n<=100000(10^5) n*

    2021-12-26:给定一个长度为n的数组arr,求有多少个子数组满足 : 子数组两端的值,是这个子数组的最小值和次小值,最小值和次小值谁在最左和最右无所谓. n<=100000(10^5) ...

  2. Vue+Element中Table懒加载,新增、删除操作后手动更新

    Vue+Element中Table懒加载,新增.删除操作后手动更新 今天开发一个自动分类管理系统中行业类型管理,使用table tree 进行节点懒加载,遇到的问题是:使用load 进行懒加载后在ta ...

  3. Django 有关 models 数据类型介绍:

    在model中添加字段的格式一般为:  field_name = field_type(**field_options) 一  field options(所有字段共用) 1  null   默认为F ...

  4. 【Python&RS】GDAL对栅格数据重采样/对齐栅格

            GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库.它利用抽象数据模型来表达所支持的各种文件格式.它 ...

  5. Python进行大文件的备份

    Python进行大文件的备份的思路:每次仅从原文件中读取指定字符的内容后写入新文件,然后循环操作. def copy_big_file(): # 接收用户输入的文件名 old_file = input ...

  6. C#语言async, await 简单介绍与实例(入门级)

    本文介绍异步编程的基本思想和语法.在程序处理里,程序基本上有两种处理方式:同步和异步.对于有些新手,甚至认为"同步"是同时进行的意思,这显然是错误的. 同步的基本意思是:程序一个个 ...

  7. KeyChrone-K8使用体验

    盛名之下,其实难副.我是这应该是我对K8的初上手体验.抛开Mac的使用者,我想其他人应该很难对这款键盘爱得起来.一直以来对手头的Filco的有线比较介意,想换个无线键盘.因为平时调程序比较多,所以F功 ...

  8. RabbitMQ基本配置

    1.用户角色配置 自带的guest/guest 超级管理员五中不同角色配置: 普通管理者(management):仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理. 策略制定者(policy ...

  9. AcWing 4490. 染色题解

    题目描述 样例 输入: 6 1 2 2 1 5 2 1 1 1 1 1 输出 3 算法描述 思路 我们以样例为例讲讲思路. 如何确保dfs能顺利便利呢,我们可以使用链式前向星来存图(树) C++代码 ...

  10. 【Shell】ps 命令

    ps 命令 Linux ps (英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器. 1. ps 常用的命令 ps -aux #显示所有进程信息 ...