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

相关文章
|
8月前
|
JavaScript 前端开发 UED
Event详解
Event详解
事件对象(event)
1.event 就是一个事件对象,写到侦听函数的小括号里,当作形参来看。 2.事件对象只有有了事件才会存在,它是系统给我们自动创建的,不需要我们传递参数。 3.事件对象是我们事件的一系列跟事件相关的数据的集合。比如鼠标点击事件里面就包含了鼠标的相关信息,如鼠标的坐标,如果是键盘事件里面就包含的是键盘事件的信息,如判断用户按下哪个按键。
|
10月前
|
前端开发 JavaScript
前端|event.target与event.currentTarget的区别
前端|event.target与event.currentTarget的区别
60 0
|
C#
C# 事件(Event)
C# 事件(Event) 事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。 C# 中使用事件机制实现线程间的通信
152 0
|
JavaScript
48、Event 对象
事件发生以后,会产生一个事件对象,作为参数传给监听函数。浏览器原生提供一个Event对象,所有的事件都是这个对象的实例,或者说继承了Event.prototype对象。
84 0
|
JavaScript 容器
JS Event handler example - event capture and bubble
JS Event handler example - event capture and bubble
104 0
JS Event handler example - event capture and bubble
|
C++
C++ 事件(event)使用总结
C++ 事件(event)使用总结
1212 0
C++ 事件(event)使用总结

热门文章

最新文章