|
1 | 1 | /* @flow */
|
2 | 2 |
|
| 3 | +import { cached } from 'shared/util' |
3 | 4 | import { warn } from 'core/util/index'
|
4 | 5 |
|
| 6 | +const normalizeEvent = cached((name: string): { |
| 7 | + name: string, |
| 8 | + once: boolean, |
| 9 | + capture: boolean |
| 10 | +} => { |
| 11 | + const once = name.charAt(0) === '~' // Prefixed last, checked first |
| 12 | + name = once ? name.slice(1) : name |
| 13 | + const capture = name.charAt(0) === '!' |
| 14 | + name = capture ? name.slice(1) : name |
| 15 | + return { |
| 16 | + name, |
| 17 | + once, |
| 18 | + capture |
| 19 | + } |
| 20 | +}) |
| 21 | + |
| 22 | +function createEventHandle (fn: Function | Array<Function>): { |
| 23 | + fn: Function | Array<Function>; |
| 24 | + invoker: Function; |
| 25 | +} { |
| 26 | + const handle = { |
| 27 | + fn, |
| 28 | + invoker: function () { |
| 29 | + const fn = handle.fn |
| 30 | + if (Array.isArray(fn)) { |
| 31 | + for (let i = 0; i < fn.length; i++) { |
| 32 | + fn[i].apply(null, arguments) |
| 33 | + } |
| 34 | + } else { |
| 35 | + fn.apply(null, arguments) |
| 36 | + } |
| 37 | + } |
| 38 | + } |
| 39 | + return handle |
| 40 | +} |
| 41 | + |
5 | 42 | export function updateListeners (
|
6 | 43 | on: Object,
|
7 | 44 | oldOn: Object,
|
8 | 45 | add: Function,
|
9 | 46 | remove: Function,
|
10 | 47 | vm: Component
|
11 | 48 | ) {
|
12 |
| - let name, cur, old, curIsArray, oldIsArray, fn, event, capture, once |
| 49 | + let name, cur, old, event |
13 | 50 | for (name in on) {
|
14 | 51 | cur = on[name]
|
15 | 52 | old = oldOn[name]
|
16 |
| - curIsArray = Array.isArray(cur) |
17 |
| - oldIsArray = Array.isArray(old) |
| 53 | + event = normalizeEvent(name) |
18 | 54 | if (!cur) {
|
19 | 55 | process.env.NODE_ENV !== 'production' && warn(
|
20 |
| - `Invalid handler for event "${name}": got ` + String(cur), |
| 56 | + `Invalid handler for event "${event.name}": got ` + String(cur), |
21 | 57 | vm
|
22 | 58 | )
|
23 | 59 | } else if (!old) {
|
24 |
| - once = name.charAt(0) === '~' // Prefixed last, checked first |
25 |
| - event = once ? name.slice(1) : name |
26 |
| - capture = event.charAt(0) === '!' |
27 |
| - event = capture ? event.slice(1) : event |
28 |
| - if (curIsArray) { |
29 |
| - add(event, (cur.invoker = arrInvoker(cur)), once, capture) |
30 |
| - } else { |
31 |
| - if (!cur.invoker) { |
32 |
| - fn = cur |
33 |
| - cur = on[name] = {} |
34 |
| - cur.fn = fn |
35 |
| - cur.invoker = fnInvoker(cur) |
36 |
| - } |
37 |
| - add(event, cur.invoker, once, capture) |
| 60 | + if (!cur.invoker) { |
| 61 | + cur = on[name] = createEventHandle(cur) |
38 | 62 | }
|
| 63 | + add(event.name, cur.invoker, event.once, event.capture) |
39 | 64 | } else if (cur !== old) {
|
40 |
| - if (curIsArray || oldIsArray) { |
41 |
| - if (!curIsArray) cur = [cur] |
42 |
| - if (!oldIsArray) old = [old] |
43 |
| - old.length = cur.length |
44 |
| - for (let i = 0; i < old.length; i++) old[i] = cur[i] |
45 |
| - on[name] = old |
46 |
| - } else { |
47 |
| - old.fn = cur |
48 |
| - on[name] = old |
49 |
| - } |
| 65 | + old.fn = cur |
| 66 | + on[name] = old |
50 | 67 | }
|
51 | 68 | }
|
52 | 69 | for (name in oldOn) {
|
53 | 70 | if (!on[name]) {
|
54 |
| - once = name.charAt(0) === '~' // Prefixed last, checked first |
55 |
| - event = once ? name.slice(1) : name |
56 |
| - capture = event.charAt(0) === '!' |
57 |
| - event = capture ? event.slice(1) : event |
58 |
| - remove(event, oldOn[name].invoker, capture) |
59 |
| - } |
60 |
| - } |
61 |
| -} |
62 |
| - |
63 |
| -function arrInvoker (arr: Array<Function>): Function { |
64 |
| - return function (ev) { |
65 |
| - const single = arguments.length === 1 |
66 |
| - for (let i = 0; i < arr.length; i++) { |
67 |
| - single ? arr[i](ev) : arr[i].apply(null, arguments) |
| 71 | + event = normalizeEvent(name) |
| 72 | + remove(event.name, oldOn[name].invoker, event.capture) |
68 | 73 | }
|
69 | 74 | }
|
70 | 75 | }
|
71 |
| - |
72 |
| -function fnInvoker (o: { fn: Function }): Function { |
73 |
| - return function (ev) { |
74 |
| - const single = arguments.length === 1 |
75 |
| - single ? o.fn(ev) : o.fn.apply(null, arguments) |
76 |
| - } |
77 |
| -} |
0 commit comments