模式实现vue事件总线

本文介绍了如何在MYVue类中模拟实现发布订阅模式,包括$on方法添加事件监听,$off方法移除事件和特定函数,以及$once方法执行一次后自动移除。实例展示了如何在Vue实例中使用这些方法来处理自定义事件。
摘要由CSDN通过智能技术生成

前言:发布订阅模式,还具有解除订阅功能

模拟实现

function fn1(n1, n2) {console.log('first add', n1, n2)}
function fn2(n1, n2) {console.log('second add', n1, n2)}
function fn3(n1, n2) {console.log('third add', n1, n2)}

class MYVue {
  constructor() {
    this._events = Object.create(null) // 存放各种自定义事件的对象
  }
  $on(event, fn) {
    if (Array.isArray(event)) {
      event.forEach(v => {this.$on(v, fn)})
    } else {
      if (!this._events[event]) this._events[event] = []
      this._events[event].push(fn)
    }
  }
  $off(event, fn) {
    if (!arguments.length) { // 移除所有事件
      this._events = Object.create(null)
      return
    }
    if (Array.isArray(event)) {
      event.forEach(v => {this.$off(v, fn)})
      return
    }
    const item = this._events[event]
    if (!item) return
    if (!fn) { // 移除某个事件所有订阅的函数
      this._events[event] = null
      return
    }
    const it = item.findIndex(v => v === fn)
    if (it !== -1) item.splice(it,1)
  }
  $once(event, fn) {
    function on() {
      this.$off(event, on)
      fn.apply(this, arguments)
    }
    on.fn = fn
    this.$on(event, on)
  }
  $emit(event) {
    let item = this._events[event]
    if (!item) return
    item.forEach(fn => {
      fn.apply(this, [...arguments].slice(1))
    })
  }
}

const myvue = new MYVue()
myvue.$on('first',fn1)
myvue.$on('second',fn2)
myvue.$once('third',fn3)
myvue.$emit('first', 20, 30)
myvue.$emit('second', 60, 70)
myvue.$emit('third', 100, 200)
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值