赞
踩
src/main.js
import Vue from 'vue'
// main.js 中
// 第一种定义方式
Vue.prototype.$eventBus = new Vue()
// 第二种定义方式
window.eventBus = new Vue();
A组件
methods:{
confirm(){
this.$message.success('修改成功!')
//使用方式一定义时
// params 多个参数 // A组件触发
this.$eventBus.$emit('eventName', param1,param2,...)
//使用方式二定义时
eventBus.$emit('eventName', param1,param2,...)
// window.eventBus.$emit('setInfo')
// window.eventBus.$emit('setInfo','小明')
}
}
B组件
mounted() { // created(){}中也可 //使用方式一定义时 // B组件监听 注意,在触发之前B组件这一定要先加载出来 this.$eventBus.$on('eventName', (param1,param2,...)=>{ //需要执行 逻辑代码 // params 多个参数 }) //使用方式二定义时 eventBus.$on('eventName', (param1,param2,...)=>{ //需要执行 逻辑代码 }) // this.getTableData() // window.eventBus.$on('setInfo', ()=>{ // this.getTableData() //被触发事件 // }) // window.eventBus.$on('setInfo', (name)=>{ // console.log('接收参数',name) //被触发事件 显示 小明 // }) },
在开发的过程中,我们要及时移除不使用的 eventBus ,原因:
① 为了避免在监听时,事件被反复触发
② 由于热更新,事件可能会被多次绑定监听,这时也需要移除事件监听
③ 未及时移除的 eventBus 会导致内存泄漏
methods:{ finish(){ //使用移除 //为了避免在监听时,事件被反复触发,通常需要在页面销毁时移除事件监听。或者在开发过程中,由于热更新,事件可能会被多次绑定监听,这时也需要移除事件监听。 this.$EventBus.$off('eventName', (param1,param2,...)=>{ // 需要执行的代码 } //使用方式一定义时 this.$eventBus.$off('eventName'); //使用方式二定义时 eventBus.$off('eventName'); const res = response.data; if (Number(res.code) !== 2000 && Number(res.code) !== 0) { Message({ message: res.msg || res.message, type: 'error', duration: 3000 }) } // window.eventBus.$off('setInfo') return response.data; } }
用 class 来实现我们自己的 EventBus:
class MyEventBus { constructor() { // 存储所有事件对应的回调的对应关系 /** * key : [ callback, callback ] */ this.items = {}; } // 监听 $on(eventName, callback) { if (!this.items[eventName]) { //一个事件可能有多个监听者 this.items[eventName] = []; } this.items[eventName].push(callback) // 简化版写法 等同于上面 // (this.items[eventName] ||= []).push(callback) } // 触发监听 $emit(eventName, ...args) { if (!this.items[eventName]) return; this.items[eventName].forEach(ca => ca(...args)) } // 去掉监听 $off(eventName) { this.items[eventName] = [] } } export default new MyEventBus();
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。