Skip to content

Commit 660132d

Browse files
authored
fix(Transition): fix transition memory leak edge case (#12182)
close #12181
1 parent 4aeff31 commit 660132d

File tree

1 file changed

+15
-6
lines changed

1 file changed

+15
-6
lines changed

packages/runtime-core/src/components/BaseTransition.ts

+15-6
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,7 @@ const BaseTransitionImpl: ComponentOptions = {
198198
setTransitionHooks(innerChild, enterHooks)
199199
}
200200

201-
const oldChild = instance.subTree
202-
const oldInnerChild = oldChild && getInnerChild(oldChild)
201+
let oldInnerChild = instance.subTree && getInnerChild(instance.subTree)
203202

204203
// handle mode
205204
if (
@@ -208,7 +207,7 @@ const BaseTransitionImpl: ComponentOptions = {
208207
!isSameVNodeType(innerChild, oldInnerChild) &&
209208
recursiveGetSubtree(instance).type !== Comment
210209
) {
211-
const leavingHooks = resolveTransitionHooks(
210+
let leavingHooks = resolveTransitionHooks(
212211
oldInnerChild,
213212
rawProps,
214213
state,
@@ -228,6 +227,7 @@ const BaseTransitionImpl: ComponentOptions = {
228227
instance.update()
229228
}
230229
delete leavingHooks.afterLeave
230+
oldInnerChild = undefined
231231
}
232232
return emptyPlaceholder(child)
233233
} else if (mode === 'in-out' && innerChild.type !== Comment) {
@@ -238,18 +238,27 @@ const BaseTransitionImpl: ComponentOptions = {
238238
) => {
239239
const leavingVNodesCache = getLeavingNodesForType(
240240
state,
241-
oldInnerChild,
241+
oldInnerChild!,
242242
)
243-
leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild
243+
leavingVNodesCache[String(oldInnerChild!.key)] = oldInnerChild!
244244
// early removal callback
245245
el[leaveCbKey] = () => {
246246
earlyRemove()
247247
el[leaveCbKey] = undefined
248248
delete enterHooks.delayedLeave
249+
oldInnerChild = undefined
250+
}
251+
enterHooks.delayedLeave = () => {
252+
delayedLeave()
253+
delete enterHooks.delayedLeave
254+
oldInnerChild = undefined
249255
}
250-
enterHooks.delayedLeave = delayedLeave
251256
}
257+
} else {
258+
oldInnerChild = undefined
252259
}
260+
} else if (oldInnerChild) {
261+
oldInnerChild = undefined
253262
}
254263

255264
return child

0 commit comments

Comments
 (0)