简介:官方已经移除了eventBus作为兄弟组件通信的方案,推荐使用第三方库mitt工具
一,安装mitt
npm install --save mitt
二,按需引入
在src
目录下,新建utils
文件夹,在其新建bus.js
或bus.ts
文件
// bus.js文件
mport mitt from 'mitt'
const $bus = mitt()
export default $bus
三,使用
父组件
<template><Test1></Test1> <Test2></Test2>
</template><script setup lang=ts>
import Test1 from "./components/Test1";
import Test2 from "./components/Test2";
</script>
子组件 Test1.vue
<template><div><div>我是子组件Test1</div><button @click="btnClick">给兄弟组件Test2传值</button></div></template><script setup lang="ts">
import $bus from "@/utils/bus"const btnClick = () => {$bus.emit('eventBusClick', { name: 'coderkey', age: 18 })}
</script>
子组件 Test2.vue
<template><div>我是子组件Test2</div><div>兄弟组件Test1传过来的:{{ obj }}</div>
</template><script setup>
import $bus from "@/utils/bus"
import {onBeforeUnmount, ref} from "vue";let obj= ref()$bus.on('eventBusClick', ( data ) => {obj.value = data // { name: 'coderkey' , age: 18 }
})onBeforeUnmount(() => {$bus.off('eventBusClick') //关闭事件
})
</script>
四,其他方法
监听全部事件
emitter.on('*', (type, e) => { console.log(type, e) })
清除所有的事件写法
emitter.all.clear()
五,注意
Vue3
中推荐的兄弟组件通信方案是通过props
和事件进行父子组件之间的通信,使用provide
和inject
进行组件与插槽内容之间的通信,或者使用Vuex/Pinia
进行全局状态管理。