Vue eventBus $on与$off

最近公司项目碰到一个问题,就是$on $off的用法问题

是这么封装的(因为是用的qiankun,eventbus挂载到window上了)。

export async function getPatients(fn) {
  window.eventBus.$on(events.GET_PATIENT_INFO, (...res) => {
    fn(...res)
  })
}

export function offPatients(fn) {
  console.log('暂时取消移除方法')
  window.eventBus.$off(events.GET_PATIENT_INFO, fn)
  window.eventBus.$off(events.GET_PATIENTLIST_INFO, fn)
  window.eventBus.$off(events.TASK_CENTER_INFO, fn)
}

之前也比较少用eventBus去做事件的监听,然后无脑的抄了波作业。呃呃,这么抄用的

import { getPatients as PatientWatcher, offPatients } from '@/event-emitter/on'

created() {
    PatientWatcher(() => {
        this.init()
      })
},

beforeDestroy() {
      offPatients(this.init)
    }

嗯。没毛病....本地好像可以用,还测了一把 window.eventBus.$emit('SET_CURRENT_PATIENT_INFO', {encounterId: '10000009', bizRoleId: '0'})

然后测试线上测出各种莫名奇妙的问题。数据加载不出来。重复的相同请求会拦截掉

贴上官网说明

vm.$off( [event, callback] )

  • 参数:

    • {string | Array<string>} event (只在 2.2.2+ 支持数组)
    • {Function} [callback]
  • 用法:

    移除自定义事件监听器。

    • 如果没有提供参数,则移除所有的事件监听器;

    • 如果只提供了事件,则移除该事件所有的监听器;

    • 如果同时提供了事件与回调,则只移除这个回调的监听器

因为是微服务架构,移除事件监听使用第三种方式

上述使用,封装有问题,调用也有问题。$on(event, callback)与$off(event, callback)中的callback,必须为同一个函数对象,否则不会移除监听事件,重复进入组件或者该路由,会导致重复监听。轻则性能问题,重则整个页面出现问题。

修改后:

// 修改
export async function getPatients(fn) {
  window.eventBus.$on(events.GET_PATIENT_INFO, fn)
}

export function offPatients(fn) {
  console.log('暂时取消移除方法')
  window.eventBus.$off(events.GET_PATIENT_INFO, fn)
  window.eventBus.$off(events.GET_PATIENTLIST_INFO, fn)
  window.eventBus.$off(events.TASK_CENTER_INFO, fn)
}

// 调用

import { getPatients as PatientWatcher, offPatients } from '@/event-emitter/on'

created() {
    PatientWatcher(this.init)
},

beforeDestroy() {
      offPatients(this.init)
    }

呃呃,干掉封装及调用的箭头函数

 

posted @ 2021-02-02 15:13  微木Vmumu  阅读(1201)  评论(0编辑  收藏  举报