iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 23
0
Modern Web

技術在走,Vue.js 要有系列 第 23

|D23| 從原始碼看 Vue 擴展 (1) - 自定義 event

  • 分享至 

  • xImage
  •  

除了原生 DOM 事件,Vue 可以自定義事件,但只能作用在元件上。如果要在元件上使用原生事件,需要加 .native 修飾詞,普通元素上使用 .native 是無效的

元件透過 createComponent 創建 vnode

// src/core/vdom/create-component.js

export function createComponent (
  Ctor: Class<Component> | Function | Object | void,
  data: ?VNodeData,
  context: Component,
  children: ?Array<VNode>,
  tag?: string
): VNode | Array<VNode> | void {
  // ...
  
  /************************************************************
    data.on 賦值給 listeners
    data.nativeOn 賦值給 data.on
    原生 DOM 事件的處理是在當前元件環境
    而自定義事件,
    則因為把 listeners 作為 vnode 的 componentOptions 傳入,
    componentOptions 是在子元件初始化階段處理,
    所以自定義事件的處理是在子元件環境
  *************************************************************/
  const listeners = data.on
  data.on = data.nativeOn
  
  // ...
  const name = Ctor.options.name || tag
  const vnode = new VNode(
    `vue-component-${Ctor.cid}${name ? `-${name}` : ''}`,
    data, undefined, undefined, undefined, context,
    { Ctor, propsData, listeners, tag, children },
    asyncFactory
  )

  return vnode
}


上一篇
|D22| 從原始碼看 Vue 響應式原理 (8) - watch
下一篇
|D24| 從原始碼看 Vue 擴展 (3) - v-model
系列文
技術在走,Vue.js 要有30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言