Skip to content

Commit

Permalink
fix(compiler-core): fix the detection of forwarded slots with v-if or…
Browse files Browse the repository at this point in the history
… v-for (#3353)

fix #3347
  • Loading branch information
HcySunYang authored Mar 22, 2021
1 parent 6cb9475 commit 602b58e
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 11 deletions.
21 changes: 18 additions & 3 deletions packages/compiler-core/__tests__/transforms/vSlot.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import { transformElement } from '../../src/transforms/transformElement'
import { transformOn } from '../../src/transforms/vOn'
import { transformBind } from '../../src/transforms/vBind'
import { transformExpression } from '../../src/transforms/transformExpression'
import { transformSlotOutlet } from '../../src/transforms/transformSlotOutlet'
import {
trackSlotScopes,
trackVForSlotScopes
Expand All @@ -34,6 +35,7 @@ function parseWithSlots(template: string, options: CompilerOptions = {}) {
...(options.prefixIdentifiers
? [trackVForSlotScopes, transformExpression]
: []),
transformSlotOutlet,
transformElement,
trackSlotScopes
],
Expand Down Expand Up @@ -737,9 +739,8 @@ describe('compiler: transform component slots', () => {
expect(generate(root, { prefixIdentifiers: true }).code).toMatchSnapshot()
})

test('generate flag on forwarded slots', () => {
const { slots } = parseWithSlots(`<Comp><slot/></Comp>`)
expect(slots).toMatchObject({
describe('forwarded slots', () => {
const toMatch = {
type: NodeTypes.JS_OBJECT_EXPRESSION,
properties: [
{
Expand All @@ -751,6 +752,20 @@ describe('compiler: transform component slots', () => {
value: { content: `3 /* FORWARDED */` }
}
]
}
test('<slot> tag only', () => {
const { slots } = parseWithSlots(`<Comp><slot/></Comp>`)
expect(slots).toMatchObject(toMatch)
})

test('<slot> tag w/ v-if', () => {
const { slots } = parseWithSlots(`<Comp><slot v-if="ok"/></Comp>`)
expect(slots).toMatchObject(toMatch)
})

test('<slot> tag w/ v-for', () => {
const { slots } = parseWithSlots(`<Comp><slot v-for="a in b"/></Comp>`)
expect(slots).toMatchObject(toMatch)
})
})

Expand Down
27 changes: 19 additions & 8 deletions packages/compiler-core/src/transforms/vSlot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -368,14 +368,25 @@ function buildDynamicSlot(
function hasForwardedSlots(children: TemplateChildNode[]): boolean {
for (let i = 0; i < children.length; i++) {
const child = children[i]
if (child.type === NodeTypes.ELEMENT) {
if (
child.tagType === ElementTypes.SLOT ||
(child.tagType === ElementTypes.ELEMENT &&
hasForwardedSlots(child.children))
) {
return true
}
switch (child.type) {
case NodeTypes.ELEMENT:
if (
child.tagType === ElementTypes.SLOT ||
(child.tagType === ElementTypes.ELEMENT &&
hasForwardedSlots(child.children))
) {
return true
}
break
case NodeTypes.IF:
if (hasForwardedSlots(child.branches)) return true
break
case NodeTypes.IF_BRANCH:
case NodeTypes.FOR:
if (hasForwardedSlots(child.children)) return true
break
default:
break
}
}
return false
Expand Down

0 comments on commit 602b58e

Please sign in to comment.