From 77b5330c5498a6b14a83197371e9a2dbf9939a9c Mon Sep 17 00:00:00 2001 From: ygj6 Date: Fri, 16 Apr 2021 23:34:34 +0800 Subject: [PATCH] fix: force update between two components with and without slot (#11795) --- src/core/instance/lifecycle.js | 3 ++- .../component/component-scoped-slot.spec.js | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/core/instance/lifecycle.js b/src/core/instance/lifecycle.js index b7265df0..c35129a4 100644 --- a/src/core/instance/lifecycle.js +++ b/src/core/instance/lifecycle.js @@ -234,7 +234,8 @@ export function updateChildComponent ( const hasDynamicScopedSlot = !!( (newScopedSlots && !newScopedSlots.$stable) || (oldScopedSlots !== emptyObject && !oldScopedSlots.$stable) || - (newScopedSlots && vm.$scopedSlots.$key !== newScopedSlots.$key) + (newScopedSlots && vm.$scopedSlots.$key !== newScopedSlots.$key) || + (!newScopedSlots && vm.$scopedSlots.$key) ) // Any static slot children from the parent may have changed during parent's diff --git a/test/unit/features/component/component-scoped-slot.spec.js b/test/unit/features/component/component-scoped-slot.spec.js index 28369814..8e9d584a 100644 --- a/test/unit/features/component/component-scoped-slot.spec.js +++ b/test/unit/features/component/component-scoped-slot.spec.js @@ -1325,4 +1325,28 @@ describe('Component scoped slot', () => { expect(vm.$el.textContent).toMatch(`1`) }).then(done) }) + + // #11652 + it('should update when swtching between two components with slot and without slot', done => { + const Child = { + template: `
` + } + + const parent = new Vue({ + template: `
+ + +
`, + data: { + flag: true + }, + components: { Child } + }).$mount() + + expect(parent.$el.textContent).toMatch(`foo`) + parent.flag=false + waitForUpdate(()=>{ + expect(parent.$el.textContent).toMatch(``) + }).then(done) + }) })