前置

  • Vue3移除了$on $off等自带的自定义事件相关方法,因此在vue3中他推荐我们下载mitt库来使用事件总线传递数据

安装

1
npm install mitt

使用mitt充当总线

  • 需要注意的是,每调用一个mitt(),都是一个总线,所以这里为什么要封装为一个工具库,就是只使用一个总线
  • 下列代码的效果为单击一个组件,传递给另外一个组件值
  • 当然,这里和vue2之前也是一样的,也是只能传递一个参数,需要传递多个参数的时候封装为一个对象,然后接受的时候结构就可以~

1.定义一个工具库为bus.js

1
2
3
4
5
6
7
8
9
import mitt from "mitt";

// export default mitt();

//也可以写完整嗲

const emitter = mitt();//每调用一个mitt,都是一个总线,所以这里为什么要封装为一个工具库,就是只使用一个总线

export default emitter;

2.组件中使用

one.vue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<template>
<p>从Two接收到的数据[{{receiveData}}]</p>
</template>

<script>
import { ref } from 'vue';
// 引入总线
import emitter from "@/utils/bus";
export default {
name: 'One',
setup(){
const receiveData = ref([]);
// 绑定总线(添加订阅)
emitter.on('giveOne',(value)=>{
// 回调函数
receiveData.value = value;
})
return {
receiveData,
}
}
}
</script>

two.vue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<template>
<button @click="giveValue">传递给One值</button>
</template>

<script>
import emitter from '@/utils/bus';
export default {
name: 'Two',
setup(){
function giveValue(){
// 调用总线,发布订阅
emitter.emit('giveOne',"我是从Two传递过来的值");
};
return {
giveValue,
}
}
}
</script>

app.vue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<template>
<One></One>
<Two></Two>
</template>

<script>
import One from "@/components/One"
import Two from "@/components/Two"
export default {
name: "App",
components: {
One,
Two,
},
};
</script>

<style>

演示效果

  • 代码的效果为单击一个组件,传递给另外一个组件值