UNPKG

1.01 kBJavaScriptView Raw
1/* @flow */
2
3import VNode from '../vnode'
4import { createFnInvoker } from './update-listeners'
5import { remove, isDef, isUndef, isTrue } from 'shared/util'
6
7export function mergeVNodeHook (def: Object, hookKey: string, hook: Function) {
8 if (def instanceof VNode) {
9 def = def.data.hook || (def.data.hook = {})
10 }
11 let invoker
12 const oldHook = def[hookKey]
13
14 function wrappedHook () {
15 hook.apply(this, arguments)
16 // important: remove merged hook to ensure it's called only once
17 // and prevent memory leak
18 remove(invoker.fns, wrappedHook)
19 }
20
21 if (isUndef(oldHook)) {
22 // no existing hook
23 invoker = createFnInvoker([wrappedHook])
24 } else {
25 /* istanbul ignore if */
26 if (isDef(oldHook.fns) && isTrue(oldHook.merged)) {
27 // already a merged invoker
28 invoker = oldHook
29 invoker.fns.push(wrappedHook)
30 } else {
31 // existing plain hook
32 invoker = createFnInvoker([oldHook, wrappedHook])
33 }
34 }
35
36 invoker.merged = true
37 def[hookKey] = invoker
38}