Écriture manuscrite Mode de publication et d'abonnement EventEmitter

Écriture manuscrite Mode de publication et d'abonnement EventEmitter

1. Introduction

Récemment, j'ai découvert que de nombreuses grandes questions d'entrevue d'usine avaient un mode de publication-abonnement EventEmitter manuscrit. La raison en est que la communication entre les composants non parent-enfant de vue et react est réalisée par lui. Voici une version simple d'EventEmitter.

2. Code

// 发布订阅模式
class EventEmitter {
    
    
  constructor() {
    
    
    // 事件对象,存放订阅的名字和事件  如:  { click: [ handle1, handle2 ]  }
    this.events = {
    
    }
  }
  // 订阅事件的方法
  on(eventName, callback) {
    
    
    if (!this.events[eventName]) {
    
    
      // 一个名字可以订阅多个事件函数
      this.events[eventName] = [callback]
    } else {
    
    
      // 存在则push到指定数组的尾部保存
      this.events[eventName].push(callback)
    }
  }
  // 触发事件的方法
  emit(eventName, ...rest) {
    
    
    // 遍历执行所有订阅的事件
    this.events[eventName] &&
      this.events[eventName].forEach(f => f.apply(this, rest))
  }
  // 移除订阅事件
  remove(eventName, callback) {
    
    
    if (this.events[eventName]) {
    
    
      this.events[eventName] = this.events[eventName].filter(f => f != callback)
    }
  }
  // 只执行一次订阅的事件,然后移除
  once(eventName, callback) {
    
    
    // 绑定的时fn, 执行的时候会触发fn函数
    const fn = () => {
    
    
      callback() // fn函数中调用原有的callback
      this.remove(eventName, fn) // 删除fn, 再次执行的时候之后执行一次
    }
    this.on(eventName, fn)
  }
}

3. Utilisez

const event = new EventEmitter()

const handle = (...pyload) => console.log(pyload)

event.on('click', handle)

event.emit('click', 100, 200, 300, 100)

event.remove('click', handle)

event.once('dbclick', function() {
    
    
  console.log('click')
})

event.emit('dbclick', 100)


Lien de référence

1. https://www.fed123.com/javascriptnodejs/4681.html

2. https://www.jianshu.com/p/e0575e17de2a

Je suppose que tu aimes

Origine blog.csdn.net/qq_39953537/article/details/102685328
conseillé
Classement