1 |
|
2 |
|
3 | import VNode from '../vnode'
|
4 | import { createFnInvoker } from './update-listeners'
|
5 | import { remove, isDef, isUndef, isTrue } from 'shared/util'
|
6 |
|
7 | export 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 |
|
17 |
|
18 | remove(invoker.fns, wrappedHook)
|
19 | }
|
20 |
|
21 | if (isUndef(oldHook)) {
|
22 |
|
23 | invoker = createFnInvoker([wrappedHook])
|
24 | } else {
|
25 |
|
26 | if (isDef(oldHook.fns) && isTrue(oldHook.merged)) {
|
27 |
|
28 | invoker = oldHook
|
29 | invoker.fns.push(wrappedHook)
|
30 | } else {
|
31 |
|
32 | invoker = createFnInvoker([oldHook, wrappedHook])
|
33 | }
|
34 | }
|
35 |
|
36 | invoker.merged = true
|
37 | def[hookKey] = invoker
|
38 | }
|