Skip to content

Commit 864ef21

Browse files
committed
fix deeply nested keep-alive components not being destroyed (fix #3882)
1 parent 03ea9f0 commit 864ef21

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

src/core/vdom/patch.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,10 @@ export function createPatchFunction (backend) {
202202
if (isDef(i = data.hook) && isDef(i = i.destroy)) i(vnode)
203203
for (i = 0; i < cbs.destroy.length; ++i) cbs.destroy[i](vnode)
204204
}
205-
if (isDef(i = vnode.child) && !data.keepAlive) {
205+
if (isDef(i = vnode.child) && (
206+
!data.keepAlive ||
207+
vnode.context._isBeingDestroyed
208+
)) {
206209
invokeDestroyHook(i._vnode)
207210
}
208211
if (isDef(i = vnode.children)) {

test/unit/features/component/component-keep-alive.spec.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,31 @@ describe('Component keep-alive', () => {
8282
}).then(done)
8383
})
8484

85+
// #3882
86+
it('deeply nested keep-alive should be destroyed properly', done => {
87+
one.template = `<div><keep-alive><two></two></keep-alive></div>`
88+
one.components = { two }
89+
const vm = new Vue({
90+
template: `<div><parent v-if="ok"></parent></div>`,
91+
data: { ok: true },
92+
components: {
93+
parent: {
94+
template: `<div><keep-alive><one></one></keep-alive></div>`,
95+
components: { one }
96+
}
97+
}
98+
}).$mount()
99+
100+
assertHookCalls(one, [1, 1, 1, 0, 0])
101+
assertHookCalls(two, [1, 1, 1, 0, 0])
102+
103+
vm.ok = false
104+
waitForUpdate(() => {
105+
assertHookCalls(one, [1, 1, 1, 1, 1])
106+
assertHookCalls(two, [1, 1, 1, 1, 1])
107+
}).then(done)
108+
})
109+
85110
if (!isIE9) {
86111
it('with transition-mode out-in', done => {
87112
let next

0 commit comments

Comments
 (0)