Skip to content

Commit ed20859

Browse files
committed
ensure mergeVNodeHook does not inject duplicate hooks
1 parent 44128f2 commit ed20859

File tree

3 files changed

+9
-13
lines changed

3 files changed

+9
-13
lines changed

flow/vnode.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ declare interface VNodeData {
4545
on?: ?{ [key: string]: Function | Array<Function> };
4646
nativeOn?: { [key: string]: Function | Array<Function> };
4747
transition?: Object;
48-
transitionInjected?: boolean; // marker for transition insert hook injection
4948
show?: boolean; // marker for v-show
5049
inlineTemplate?: {
5150
render: Function;

src/core/vdom/helpers.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,13 @@ export function getFirstComponentChild (children: ?Array<any>) {
6363
export function mergeVNodeHook (def: Object, key: string, hook: Function) {
6464
const oldHook = def[key]
6565
if (oldHook) {
66-
def[key] = function () {
67-
oldHook.apply(this, arguments)
68-
hook.apply(this, arguments)
66+
const injectedHash = def.__injected || (def.__injected = {})
67+
if (!injectedHash[key]) {
68+
injectedHash[key] = true
69+
def[key] = function () {
70+
oldHook.apply(this, arguments)
71+
hook.apply(this, arguments)
72+
}
6973
}
7074
} else {
7175
def[key] = hook

src/platforms/web/runtime/modules/transition.js

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -94,21 +94,14 @@ export function enter (vnode: VNodeWithData) {
9494

9595
if (!vnode.data.show) {
9696
// remove pending leave element on enter by injecting an insert hook
97-
var hooks = vnode.data.hook || (vnode.data.hook = {})
98-
hooks._transitionInsert = () => {
97+
mergeVNodeHook(vnode.data.hook || (vnode.data.hook = {}), 'insert', () => {
9998
const parent = el.parentNode
10099
const pendingNode = parent && parent._pending && parent._pending[vnode.key]
101100
if (pendingNode && pendingNode.tag === vnode.tag && pendingNode.elm._leaveCb) {
102101
pendingNode.elm._leaveCb()
103102
}
104103
enterHook && enterHook(el, cb)
105-
}
106-
if (!vnode.data.transitionInjected) {
107-
vnode.data.transitionInjected = true
108-
mergeVNodeHook(hooks, 'insert', () => {
109-
hooks._transitionInsert()
110-
})
111-
}
104+
})
112105
}
113106

114107
// start enter transition

0 commit comments

Comments
 (0)