美文网首页
02. 认识 Vue 对象(二)

02. 认识 Vue 对象(二)

作者: KimYYX | 来源:发表于2019-03-06 10:01 被阅读0次

接上篇 :01. 认识 Vue 对象(一)


今天我们接着来看 eventsMixin(Vue),这个方法给 Vue 赋予了如下功能:

  • Vue.prototype.$on
  • Vue.prototype.$emit
  • Vue.prototype.$once
  • Vue.prototype.$off

我们最熟悉的,当属 $on$emit 了吧😀。

✨ $on

Vue.prototype.$on = function (event: string | Array<string>, fn: Function): Component {
  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)
    // optimize hook:event cost by using a boolean flag marked at registration instead of a hash lookup
    if (hookRE.test(event)) {
      vm._hasHookEvent = true
    }
  }
  return vm
}

Vue 实例的事件是添加在 _events 属性上的,这个属性是一个对象,事件名称就是这个对象的键值,每个键的值是个数组。同时, Vue 为了优化性能,当实例接收了一个以 hook 开头的事件 时,会把 _hasHookEvent 设置为 true

_hasHookEvent 是一个用于提升性能的属性,作用是在调用生命周期钩子的时候,不用再遍历事件了。

✨ $emit

Vue.prototype.$emit = function (event: string): Component {
  const vm: Component = this
  if (process.env.NODE_ENV !== 'production') {
    const lowerCaseEvent = event.toLowerCase()
    if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {
      tip()
    }
  }
  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
}

这个方法里面,有两点需要注意:

  1. 第一个 if 的判断,是用于提示驼峰式 (camelCase) 或短横线分隔 (kebab-case)写法的,意思是:因为 HTML 是大小写不敏感的,所以你不能在 HTML 里使用驼峰写法。

  2. toArray(list: any, start: number) 方法是将类数组(Array-like)对象转换成真正的数组对象。接受两个参数,第一个是待转换的对象,第二个用于截取。

✨ $off & $once

这两个方法都比较常规,代码 + API 一目了然。


❓ 遗留问题

  1. this._events 是什么时候初始化的?

下一篇:03. 认识 Vue 对象(三)

相关文章

  • 02. 认识 Vue 对象(二)

    接上篇 :01. 认识 Vue 对象(一) 今天我们接着来看 eventsMixin(Vue),这个方法给 Vue...

  • 03. 认识 Vue 对象(三)

    接上篇:02. 认识 Vue 对象(二) 今天我们一口气,把剩下的 lifecycleMixin(Vue) 和 r...

  • 00. 我和 Vue.js 没一点新意的故事

    ? Catalog 00. 我和 Vue.js 没一点新意的故事 01. 认识 Vue 对象(一) 02. 认识 ...

  • 02.认识Seurat对象

    关于Seurat对象的构建请参考:01.单细胞入门-Seurat对象创建[https://www.jianshu....

  • Day12 面向对象基础

    01.迭代器和生成器 02.认识面向对象 03.类的声明 04.对象的属性 05.对象属性的增删改查 06.slo...

  • 2018-09-11 vue 第一节

    一、认识vue 二、 vue的指令---------------- v-for 循环操 三、表格

  • Vue2.0基础-生命周期(二)

    一、Vue对象实例化 其中Vue函数称为构造函数,使用new就可以实例化出来一个实例化对象。 二、Vue的生命周期...

  • 2019-05-23Vue基础

    Vue主要包含两个部分:Vue对象和指令 1.Vue对象 var 对象名 = new Vue({el:关键对象的选...

  • 02.对象Objects

    对象 1.Parse.Object 在Parse上使用Parse.Object存储数据。每个Parse.Objec...

  • 01. 认识 Vue 对象(一)

    前篇:00. 我和 Vue.js 没一点新意的故事 我们知道 JS 的面向对象,是基于原型(Prototype)的...

网友评论

      本文标题:02. 认识 Vue 对象(二)

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