event emit 实现

简介: event emit 实现

事件中心

vm.$on

Vue.prototype.$on = function (event, fn) {
   
    const vm: Component = this
    if (Array.isArray(event)) {
   
        for (let i = 0, l = event.length; i < l; i++) {
   
            this.$on(event[i], fn)
        }
    } else {
   
        (vm._events[event] || (vm._events[event] = [])).push(fn)
    }
    return vm
}

vm.$emit

Vue.prototype.$emit = function (event: string): Component {
   
    const vm: Component = this
    let cbs = vm._events[event]
    if (cbs) {
   
      cbs = cbs.length > 1 ? toArray(cbs) : cbs
      const args = toArray(arguments, 1)
      for (let i = 0, l = cbs.length; i < l; i++) {
   
        try {
   
          cbs[i].apply(vm, args)
        } catch (e) {
   
          handleError(e, vm, `event handler for "${
     event}"`)
        }
      }
    }
    return vm
  }
}

vm.$off

Vue.prototype.$off = function (event, fn) {
   
    const vm: Component = this
    // all
    if (!arguments.length) {
   
        vm._events = Object.create(null)
        return vm
    }
    // array of events
    if (Array.isArray(event)) {
   
        for (let i = 0, l = event.length; i < l; i++) {
   
            this.$off(event[i], fn)
        }
        return vm
    }
    // specific event
    const cbs = vm._events[event]
    if (!cbs) {
   
        return vm
    }
    if (!fn) {
   
        vm._events[event] = null
        return vm
    }
    if (fn) {
   
        // specific handler
        let cb
        let i = cbs.length
        while (i--) {
   
            cb = cbs[i]
            if (cb === fn || cb.fn === fn) {
   
                cbs.splice(i, 1)
                break
            }
        }
    }
    return vm
}

vm.$once

Vue.prototype.$once = function (event, fn) {
   
    const vm: Component = this
    function on () {
   
        vm.$off(event, on)
        fn.apply(vm, arguments)
    }
    on.fn = fn
    vm.$on(event, on)
    return vm
}

https://vue-js.com/learn-vue/instanceMethods/event.html#_4-vm-once

相关文章
|
2月前
|
传感器 JavaScript 前端开发
Event Loop
【10月更文挑战第29天】
36 4
|
6月前
(20):event()
(20):event()
|
6月前
|
UED
event事件
event事件
51 1
|
7月前
|
存储 JavaScript 前端开发
说说你对Event Loop的理解是什么
Event Loop(事件循环)是JavaScript中处理异步操作的一种机制,它帮助我们协调和处理各种任务的执行顺序。
63 0
|
JavaScript 前端开发 UED
Event详解
Event详解
218 0
|
JavaScript
event loop的理解
event loop的理解
事件对象(event)
1.event 就是一个事件对象,写到侦听函数的小括号里,当作形参来看。 2.事件对象只有有了事件才会存在,它是系统给我们自动创建的,不需要我们传递参数。 3.事件对象是我们事件的一系列跟事件相关的数据的集合。比如鼠标点击事件里面就包含了鼠标的相关信息,如鼠标的坐标,如果是键盘事件里面就包含的是键盘事件的信息,如判断用户按下哪个按键。
|
前端开发 JavaScript
前端|event.target与event.currentTarget的区别
前端|event.target与event.currentTarget的区别
92 0
|
C#
C# 事件(Event)
C# 事件(Event) 事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。 C# 中使用事件机制实现线程间的通信
182 0