From 0367ddf7894bc1b42a060bac546aecd6660190a2 Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Wed, 2 Jun 2021 14:13:47 +0200 Subject: [PATCH 1/2] fix(v-slot): fix scoped slot normalization combined with v-if Fix #12102 --- src/core/vdom/helpers/normalize-scoped-slots.js | 2 +- .../unit/features/component/component-slot.spec.js | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/core/vdom/helpers/normalize-scoped-slots.js b/src/core/vdom/helpers/normalize-scoped-slots.js index 15ab396d209..8001aae503d 100644 --- a/src/core/vdom/helpers/normalize-scoped-slots.js +++ b/src/core/vdom/helpers/normalize-scoped-slots.js @@ -64,7 +64,7 @@ function normalizeScopedSlot(normalSlots, key, fn) { let vnode: VNode = res && res[0] return res && ( !vnode || - (vnode.isComment && !isAsyncPlaceholder(vnode)) // #9658, #10391 + (res.length === 1 && vnode.isComment && !isAsyncPlaceholder(vnode)) // #9658, #10391 ) ? undefined : res } diff --git a/test/unit/features/component/component-slot.spec.js b/test/unit/features/component/component-slot.spec.js index c6e20e49749..4412a1f0c7d 100644 --- a/test/unit/features/component/component-slot.spec.js +++ b/test/unit/features/component/component-slot.spec.js @@ -986,4 +986,18 @@ describe('Component slot', () => { expect(vm.$el.firstChild.innerHTML).toBe('2') }).then(done) }) + + // #12102 + it('v-if inside scoped slot', () => { + const vm = new Vue({ + template: ``, + components: { + test: { + template: `
` + } + } + }).$mount() + + expect(vm.$el.innerHTML).toBe(`b`) + }) }) From 878ec6eb7f1828c9b4838801e82e13efc0b5bba9 Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Wed, 2 Jun 2021 14:27:26 +0200 Subject: [PATCH 2/2] types: maybe type --- src/core/vdom/helpers/normalize-scoped-slots.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/vdom/helpers/normalize-scoped-slots.js b/src/core/vdom/helpers/normalize-scoped-slots.js index 8001aae503d..13df231f43c 100644 --- a/src/core/vdom/helpers/normalize-scoped-slots.js +++ b/src/core/vdom/helpers/normalize-scoped-slots.js @@ -61,7 +61,7 @@ function normalizeScopedSlot(normalSlots, key, fn) { res = res && typeof res === 'object' && !Array.isArray(res) ? [res] // single vnode : normalizeChildren(res) - let vnode: VNode = res && res[0] + let vnode: ?VNode = res && res[0] return res && ( !vnode || (res.length === 1 && vnode.isComment && !isAsyncPlaceholder(vnode)) // #9658, #10391