Mitt 事件总线的使用

npm install mitt -S

1.1 全局配置及使用方式

// main.ts
import { createApp } from "vue";
import "./style.css";
import App from "./App.vue";
import mitt from "mitt";
const emitter = mitt();

const app = createApp(App);
declare module "vue" {
  export interface ComponentCustomProperties {
    $bus: typeof emitter;
  }
}

app.config.globalProperties.$bus = emitter;
app.mount("#app");

在上述代码中,我们通过挂载全局的方式定义了$bus

//ComponentA.vue
<template>
  <div @click="toMessage">我是A组件</div>
</template>

<script setup lang="ts">
import { getCurrentInstance } from "vue";
const instance = getCurrentInstance();
const toMessage = () => {
  instance?.proxy?.$bus.emit("message", "A组件的数据");
};
</script>
<style scoped></style>


//ComponentB.vue
<template>
  <div>我是B组件</div>
</template>
<script setup lang="ts">
import { getCurrentInstance } from "vue";

getCurrentInstance()?.proxy?.$bus.on("message", (data: any) => {
  console.log(data); //A组件的数据
});
</script>
<style scoped></style>

A组件通过调用 instance?.proxy?.$bus.emit方法并传入事件名称和数据,我们可以向其他订阅了该事件的组件发送消息。B组件通过调用 instance?.proxy?.$bus.on 方法并传入事件名称和回调函数,我们可以在当前组件中订阅该事件,并对接收到的数据进行处理。

1.2 按需引入及使用方式

在项目中创建一个新的 mitt.js 文件,用于导出一个全局的事件总线实例:

import mitt from "mitt";
const emitter = mitt();
export default emitter;

在需要的组件中导入全局的事件总线实例,并在需要的地方发布和订阅事件即可

//ComponentA.vue
<template>
  <div @click="toMessage">我是A组件</div>
</template>

<script setup lang="ts">
import emitter from "@/tool/mitt";
const toMessage = () => {
  emitter.emit("message", "A组件的数据");
};
</script>
<style scoped></style>

//ComponentB.vue
<template>
  <div>我是B组件</div>
</template>
<script setup lang="ts">
import emitter from "@/tool/mitt";

emitter.on("message", (data: any) => {
  console.log(data); //A组件的数据
});
</script>
<style scoped></style>


// 派发(emit)
emitter.emit('foo', { a: 'b' })

// 监听(on)
emitter.on('foo', e => console.log('foo', e) )


// 监听所有(‘*’)
emitter.on('*', (type, e) => console.log(type, e) )  //type为事件类型

// 取消监听(off)
emitter.off('foo', onFoo)  

// 取消所有事件
emitter.all.clear()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值