与消息订阅与发布(pubsub
)功能类似,可以实现任意组件间通信。
1npm install --save mitt
1// 引入mitt
2import mitt from 'mitt'
3
4// 调用mitt
5const emitter = mitt()
6
7// 暴露
8export default emitter
:::
拿到所有绑定事件
1// 清除所有事件
2emitter.all.clear()
监听事件
1// 监听某个事件
2emitter.on('事件名', (e) => {
3 console.log
4});
5
6// 监听所有事件
7emitter.on('*', (type, e) => console.log(type, e) )
解绑事件
1// 解绑某个事件
2emitter.off('事件名', (e) => {});
触发事件
1// 触发某个事件
2emitter.emit('事件名', { a: 'b' })
提供数据的组件,在合适的时候触发事件
接收数据的组件:绑定事件、同时在销毁前解绑事
1<template>
2 <h2>父组件</h2>
3 <hr/>
4 <child-comp/>
5 <hr/>
6 <brother-comp/>
7</template>
8
9<script lang="ts" name="ParentComp" setup>
10import ChildComp from "@/components/ChildComp.vue";
11import BrotherComp from "@/components/BrotherComp.vue";
12
13</script>
1<template>
2 <h2>子组件</h2>
3 <p>玩具:{{ toy }}</p>
4 <button @click="emitter.emit('send-toy', toy)">玩具给兄弟</button>
5</template>
6
7<script lang="ts" name="ChildComp" setup>
8import {ref} from 'vue'
9import emitter from "@/utils/emitter";
10
11let toy = ref('钢铁侠')
12</script>
1<template>
2 <h2>兄弟组件</h2>
3 <p>哥哥给的玩具:{{ toys }}</p>
4</template>
5
6<script lang="ts" name="BrotherComp" setup>
7import emitter from "@/utils/emitter";
8
9import {onUnmounted, ref} from "vue";
10
11let toys = ref('')
12
13emitter.on('send-toy', (value: string) => {
14 toys.value = value
15})
16
17// 在组件卸载时解绑send-toy事件
18onUnmounted(() => {
19 emitter.off('send-toy')
20})
21</script>
:::