美文网首页
一个自定义事件封装,WeakMap的应用

一个自定义事件封装,WeakMap的应用

作者: 前端人 | 来源:发表于2021-06-08 10:11 被阅读0次

本事件封装类特色是支持对象事件名,支持弱应用,可以确保监听自动删除

// 用 Symbol模拟私有变量
const event = Symbol("eventPropery");
const eventWeak = Symbol("eventProperyWeak");
const getEvent = Symbol("getEvent");
const isWeakEvent = Symbol("isWeakEvent");
/**
 * 一个公共的事件处理器 用于夸组件通信
 */
 class EventSelf {
  constructor() {
    this[event] = {};
    this[eventWeak] = new WeakMap();
  }

  [isWeakEvent](eventName) {
    return eventName !== null && typeof eventName === "object";
  }

  [getEvent](eventName) {
    let funs = null;
    if (this[isWeakEvent](eventName)) {
      funs = this[eventWeak].get(eventName);
    } else {
      funs = this[event][eventName];
    }
    return funs;
  }

  /**
   * 监听事件
   * @param {*} eventName  任意值
   * @param {*} fun 必须是一个函数
   * @returns 返回一个解除事件监听函数
   */
  on(eventName, fun) {
    let voidFun = () => {};
    if (!fun || !(fun instanceof Function)) {
      return voidFun;
    }
    if (!eventName) {
      return voidFun;
    }

    const funs = this[getEvent](eventName);

    if (!funs) {
      if (this[isWeakEvent](eventName)) {
        this[eventWeak].set(eventName, [fun]);
      } else {
        this[event][eventName] = [fun];
      }
    } else {
      funs.push(fun);
    }

    return () => {
      this.unBind(eventName, fun);
    };
  }
  /**
   * 触发事件
   * @param {*} eventName  任意值
   * @param {*} val 任意值
   * @returns
   */
  emit(eventName, val) {
    if (!eventName) {
      return;
    }
    const funs = this[getEvent](eventName);

    if (!funs || funs.length === 0) {
      return;
    }

    for (const fun of funs) {
      if (fun && fun instanceof Function) {
        fun(val);
      }
    }
  }

  /**
   * 解除事件监听
   * @param {*} eventName  任意值
   * @param {*} fun 必须是函数
   * @returns
   */
  unBind(eventName, fun) {
    const funs = this[getEvent](eventName);
    if (!funs || funs.length === 0) {
      return;
    }
    if (!(fun instanceof Function)) {
      return;
    }
    console.log('解绑函数开始执行',eventName,funs)
    const index = funs.findIndex((item) => item === fun);
    if (index !== -1) {
      funs.splice(index, 1);
    }

    console.log('解绑函数被执行',eventName,funs)
  }
}
export const gEventName = { login: "login" };
export const gEvent = new EventSelf();

相关文章

  • 一个自定义事件封装,WeakMap的应用

    本事件封装类特色是支持对象事件名,支持弱应用,可以确保监听自动删除

  • jQuery事件

    jQuery事件是DOM事件的封装,同时支持自定义的扩展。绑定事件:bind、on、live、delegate、k...

  • JavaScript自定义事件封装与应用

    最近在研究webRTC的封装库,在阅读其源码的过程中,对js原生的自定义事件封装与调用机制有了新的认识,记录下来分...

  • 6-2 事件-代码演示

    绑定点击事件和取消默认行为 自定义一个绑定事件,封装 点击激活,先显示激活,后显示取消。点击取消,正常显示。事件的...

  • DOM事件

    基本概念 DOM事件类型 DOM事件流 DOM事件捕获的具体流程 Event对象的常见应用 自定义事件

  • 前端知识点之DOM 事件类

    知识点:--DOM 事件的级别--DOM 事件模型和事件流--Event 对象的常见应用--自定义事件 DOM 事...

  • 【PyQt】事件机制

    信号与槽机制是对事件机制的高级封装事件机制更偏向于底层 每个 Qt 应用程序对应一个 QAppliation 对象...

  • DOM事件

    DOM事件的级别 DOM事件模型 DOM事件流 描述DOM时间捕获的具体流程 Event对象的常见应用 自定义事件...

  • 3-3 DOM 事件

    一、事件级别 二、事件模型 三、事件流 四、描述DOM事件捕获的具体流程 五、Event对象的常见应用 六、自定义...

  • AppBarLayout的理解

    介绍AppBarLayout实际是一个垂直方向的LinearLayout,在它的内部做了很多滚动事件的封装,并应用...

网友评论

      本文标题:一个自定义事件封装,WeakMap的应用

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