Skip to content

Commit ba5fb31

Browse files
committed
fix transition insert hook duplicate invocation on slot nodes (fix #3474)
1 parent 6bdb577 commit ba5fb31

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

flow/vnode.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ declare interface VNodeData {
4646
on?: ?{ [key: string]: Function | Array<Function> };
4747
nativeOn?: { [key: string]: Function | Array<Function> };
4848
transition?: Object;
49+
transitionInjected?: boolean;
4950
inlineTemplate?: {
5051
render: Function;
5152
staticRenderFns: Array<Function>;

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

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

9595
if (!vnode.data.show) {
9696
// remove pending leave element on enter by injecting an insert hook
97-
mergeVNodeHook(vnode.data.hook || (vnode.data.hook = {}), 'insert', () => {
97+
const hooks = vnode.data.hook || (vnode.data.hook = {})
98+
hooks._transitionInsert = () => {
9899
const parent = el.parentNode
99-
const pendingNode = parent._pending && parent._pending[vnode.key]
100+
const pendingNode = parent && parent._pending && parent._pending[vnode.key]
100101
if (pendingNode && pendingNode.tag === vnode.tag && pendingNode.elm._leaveCb) {
101102
pendingNode.elm._leaveCb()
102103
}
103104
enterHook && enterHook(el, cb)
104-
})
105+
}
106+
if (!vnode.data.transitionInjected) {
107+
vnode.data.transitionInjected = true
108+
mergeVNodeHook(hooks, 'insert', () => {
109+
hooks._transitionInsert()
110+
})
111+
}
105112
}
106113

107114
// start enter transition

0 commit comments

Comments
 (0)