模式实现vue事件总线

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

模拟实现

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)

相关推荐

  1. 模式实现vue事件总线

    2024-03-26 07:02:07       18 阅读
  2. Vue-45、Vue中全局事件总线

    2024-03-26 07:02:07       33 阅读
  3. vue实例事件

    2024-03-26 07:02:07       35 阅读
  4. vue3+TypeScript全局事件总线mitt

    2024-03-26 07:02:07       42 阅读
  5. vue3事件总线mitt使用方式

    2024-03-26 07:02:07       35 阅读
  6. C# 如何实现一个事件总线

    2024-03-26 07:02:07       27 阅读
  7. 事件处理模式--reactor原理与实现

    2024-03-26 07:02:07       14 阅读
  8. vue 实现 下拉触底事件

    2024-03-26 07:02:07       16 阅读
  9. 前端vue2学习(事件处理)总结

    2024-03-26 07:02:07       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-26 07:02:07       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-26 07:02:07       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-26 07:02:07       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-26 07:02:07       20 阅读

热门阅读

  1. 全量知识系统 灵活的模块化框架 (Q&A)

    2024-03-26 07:02:07       22 阅读
  2. 【flutter】flutter基础总结1

    2024-03-26 07:02:07       19 阅读
  3. postman和express

    2024-03-26 07:02:07       18 阅读
  4. 自动驾驶技术的应用场景和限制

    2024-03-26 07:02:07       16 阅读
  5. Android 8.1 不可安装应用

    2024-03-26 07:02:07       17 阅读
  6. 无线网络与物联网

    2024-03-26 07:02:07       16 阅读
  7. Sentinel

    Sentinel

    2024-03-26 07:02:07      15 阅读
  8. Qt实现TFTP Server和 TFTP Client(二)

    2024-03-26 07:02:07       15 阅读
  9. AcWing 1015. 摘花生

    2024-03-26 07:02:07       25 阅读
  10. Ubuntu 安装Docker 和 Docker Compose

    2024-03-26 07:02:07       18 阅读
  11. Spark SQL

    Spark SQL

    2024-03-26 07:02:07      15 阅读