美文网首页
手写一个简单的(EventEmitter)事件发布和订阅

手写一个简单的(EventEmitter)事件发布和订阅

作者: may505 | 来源:发表于2020-03-05 10:05 被阅读0次

事件订阅类

class Event {
  constructor() {
    this.events = {} // 存放订阅事件队列
  }
  // 订阅事件
  on(eventName, callback) {
    // 如果订阅的事件存在,同一个事件名可订阅多好函数
    if (this.events[eventName]) {
      this.events[eventName].push(callback)
    } else {
      this.events[eventName] = [callback]
    }
  }
  // 触发事件
  emitter(eventName, params) {
    this.events[eventName] && this.events[eventName].forEach(fn => fn.apply(this, [params]))
  }
  // 移除订阅事件
  remove(eventName, callback) {
    this.events[eventName] && this.events[eventName].filter(fn => fn != callback)
  }
}
export default Event

使用方法

import React from 'react'
import { Button } from 'antd'

import Event from '@/utils/EventEmitter'


class EventEmitter extends React.Component {


  constructor(props) {
    super(props)
    this.event = new Event()
    this.event.on("click", this.handleone)
    this.event.on("click", this.handleTwo)

  }

  handleone = params => {
    console.log("第一件", params);
  }
  handleTwo = params => {
    console.log('第二件', params);
  }


  handleClick = () => {
    this.event.emitter('click', { name: 'click' })
  }

  render() {
    return (
      <Button type="primary" onClick={this.handleClick}>触发</Button>
    )
  }
}
export default EventEmitter

输出效果


image.png

相关文章

网友评论

      本文标题:手写一个简单的(EventEmitter)事件发布和订阅

      本文链接:https://www.haomeiwen.com/subject/psjsactx.html