vue:事件总线

vue:事件总线

  1. 定义: 组件间的通信方式,可以用于任意组件之间的通信
  2. 安装全局事件总线:newVue{beforeCreate(){Vue.prototype.$bus=this}}
  3. 使用事件总线:
    A组件接收数据,methods:{ a(data){}} mounted(){this.$on('demo',this.a)}
    B组件传输数据,methods:{this.$bus.$emit('demo',this.data)}
  4. 在destryBefore钩子中解绑该组件用到的事件this.$bus.$off
### 一、UniApp中的事件总线实现 在 UniApp 中,事件总线的实现与 Vue事件总线类似。以下是详细说明和代码示例: #### 1. 监听事件 `uni.$on()` 通过 `uni.$on()` 方法可以监听某个事件,并在事件触发时执行回调函数[^1]。 ```javascript // 在组件 A 中监听事件 export default { mounted() { uni.$on('eventName', (data) => { console.log('接收到的数据:', data); }); } }; ``` #### 2. 触发事件 `uni.$emit()` 通过 `uni.$emit()` 方法可以触发某个事件,并传递数据给监听者[^1]。 ```javascript // 在组件 B 中触发事件 export default { methods: { sendData() { const data = { message: 'Hello from Component B' }; uni.$emit('eventName', data); } } }; ``` #### 3. 只监听一次 `uni.$once()` 如果希望某个事件只被监听一次,可以使用 `uni.$once()` 方法[^1]。 ```javascript // 在组件 C 中只监听一次事件 export default { mounted() { uni.$once('eventName', (data) => { console.log('只接收一次的数据:', data); }); } }; ``` #### 4. 移除监听 `uni.$off()` 为了防止内存泄漏或重复监听,可以在组件销毁时移除事件监听[^1]。 ```javascript // 在组件 A 中移除事件监听 export default { beforeDestroy() { uni.$off('eventName'); } }; ``` --- ### 二、Vue 3 中的事件总线实现 在 Vue 3 中,由于 Vue 实例化方式的变化,事件总线的实现需要使用 `mitt` 或其他轻量级事件库。以下是具体实现方法: #### 1. 安装 `mitt` 库 首先需要安装 `mitt` 库作为事件管理工具。 ```bash npm install mitt ``` #### 2. 创建全局事件总线 在项目入口文件(如 `main.js`)中创建一个全局事件总线实例[^2]。 ```javascript import { createApp } from 'vue'; import App from './App.vue'; import mitt from 'mitt'; // 创建事件总线 const bus = mitt(); // 将事件总线挂载到全局 const app = createApp(App); app.config.globalProperties.$bus = bus; app.mount('#app'); ``` #### 3. 使用事件总线 - **监听事件**:在组件中使用 `$bus.on()` 方法监听事件。 - **触发事件**:在组件中使用 `$bus.emit()` 方法触发事件。 - **移除监听**:在组件销毁时使用 `$bus.off()` 方法移除事件监听。 ```javascript // 在组件 A 中监听事件 export default { mounted() { this.$bus.on('hello', (data) => { console.log('接收到的数据:', data); }); }, beforeDestroy() { this.$bus.off('hello'); // 移除事件监听 } }; ``` ```javascript // 在组件 B 中触发事件 export default { methods: { sendData() { const data = { message: 'Hello from Component B' }; this.$bus.emit('hello', data); // 触发事件并传递数据 } } }; ``` --- ### 三、注意事项 1. **性能优化**:确保在组件销毁时移除事件监听,避免内存泄漏。 2. **跨组件通信**:事件总线适合简单的跨组件通信场景,但如果项目复杂度较高,建议使用 Vuex 或 Pinia 进行状态管理。 3. **兼容性**:在 Vue 3 中,原生的 `Vue.prototype` 不再支持直接扩展,因此推荐使用 `mitt` 替代传统事件总线[^2]。 --- ### 四、总结 无论是 UniApp 还是 Vue 3,事件总线都是一种有效的跨组件通信方式。但在实际开发中,需根据项目需求选择合适的工具和方法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值