Skip to content

Commit 504fa10

Browse files
authored
fix(compiler-vapor): prevent v-for components from being single root (#13149)
1 parent ed05053 commit 504fa10

File tree

4 files changed

+199
-175
lines changed

4 files changed

+199
-175
lines changed

packages/compiler-vapor/__tests__/transforms/__snapshots__/transformElement.spec.ts.snap

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,18 @@ export function render(_ctx) {
188188
}"
189189
`;
190190

191+
exports[`compiler: element transform > component > v-for on component should not mark as single root 1`] = `
192+
"import { createComponent as _createComponent, createFor as _createFor } from 'vue';
193+
194+
export function render(_ctx, $props, $emit, $attrs, $slots) {
195+
const n0 = _createFor(() => (_ctx.items), (_for_item0) => {
196+
const n2 = _createComponent(_ctx.Comp)
197+
return n2
198+
}, (item) => (item), 2)
199+
return n0
200+
}"
201+
`;
202+
191203
exports[`compiler: element transform > component > v-on expression is a function call 1`] = `
192204
"import { resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback } from 'vue';
193205

packages/compiler-vapor/__tests__/transforms/transformElement.spec.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
transformElement,
77
transformText,
88
transformVBind,
9+
transformVFor,
910
transformVOn,
1011
} from '../../src'
1112
import {
@@ -15,7 +16,12 @@ import {
1516
} from '@vue/compiler-core'
1617

1718
const compileWithElementTransform = makeCompile({
18-
nodeTransforms: [transformElement, transformChildren, transformText],
19+
nodeTransforms: [
20+
transformVFor,
21+
transformElement,
22+
transformChildren,
23+
transformText,
24+
],
1925
directiveTransforms: {
2026
bind: transformVBind,
2127
on: transformVOn,
@@ -170,6 +176,17 @@ describe('compiler: element transform', () => {
170176
expect(code).contains('_createComponent(_ctx.Comp)')
171177
})
172178

179+
test('v-for on component should not mark as single root', () => {
180+
const { code } = compileWithElementTransform(
181+
`<Comp v-for="item in items" :key="item"/>`,
182+
{
183+
bindingMetadata: { Comp: BindingTypes.SETUP_CONST },
184+
},
185+
)
186+
expect(code).toMatchSnapshot()
187+
expect(code).contains('_createComponent(_ctx.Comp)')
188+
})
189+
173190
test('static props', () => {
174191
const { code, ir } = compileWithElementTransform(
175192
`<Foo id="foo" class="bar" />`,

packages/compiler-vapor/src/transforms/transformElement.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ function transformComponentElement(
137137
tag,
138138
props: propsResult[0] ? propsResult[1] : [propsResult[1]],
139139
asset,
140-
root: singleRoot,
140+
root: singleRoot && !context.inVFor,
141141
slots: [...context.slots],
142142
once: context.inVOnce,
143143
dynamic: dynamicComponent,

0 commit comments

Comments
 (0)