前置
- Vue3移除了$on $off等自带的自定义事件相关方法,因此在vue3中他推荐我们下载mitt库来使用事件总线传递数据
安装
npm install mitt
- 在线演示地址
- https://codesandbox.io/s/mittzong-xian-de-shi-yong-ro4ili?file=/src/App.vue
使用mitt充当总线
- 需要注意的是,每调用一个
mitt()
,都是一个总线,所以这里为什么要封装为一个工具库,就是只使用一个总线 - 下列代码的效果为单击一个组件,传递给另外一个组件值
- 当然,这里和vue2之前也是一样的,也是只能传递一个参数,需要传递多个参数的时候封装为一个对象,然后接受的时候结构就可以~
1.定义一个工具库为bus.js
import mitt from "mitt";
// export default mitt();
//也可以写完整嗲
const emitter = mitt();//每调用一个mitt,都是一个总线,所以这里为什么要封装为一个工具库,就是只使用一个总线
export default emitter;
2.组件中使用
one.vue
<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
<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
<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>
演示效果
- 代码的效果为单击一个组件,传递给另外一个组件值