File tree Expand file tree Collapse file tree 3 files changed +55
-1
lines changed Expand file tree Collapse file tree 3 files changed +55
-1
lines changed Original file line number Diff line number Diff line change @@ -45,7 +45,10 @@ export function processFor(
45
45
46
46
const keyProp = findProp ( node , 'key' )
47
47
const keyProperty = keyProp && propToExpression ( keyProp , context )
48
- const isComponent = isJSXComponent ( node )
48
+ const isComponent =
49
+ isJSXComponent ( node ) ||
50
+ // template v-for with a single component child
51
+ isTemplateWithSingleComponent ( node )
49
52
const id = context . reference ( )
50
53
context . dynamic . flags |= DynamicFlag . NON_TEMPLATE | DynamicFlag . INSERT
51
54
const [ render , exitBlock ] = createBranch ( node , context , true )
@@ -117,3 +120,10 @@ export function getForParseResult(
117
120
source,
118
121
}
119
122
}
123
+
124
+ function isTemplateWithSingleComponent ( node : JSXElement ) : boolean {
125
+ const nonCommentChildren = node . children . filter ( ( c ) => ! isEmptyText ( c ) )
126
+ return (
127
+ nonCommentChildren . length === 1 && isJSXComponent ( nonCommentChildren [ 0 ] )
128
+ )
129
+ }
Original file line number Diff line number Diff line change @@ -201,3 +201,27 @@ exports[`compiler: v-for > v-for aliases w/ complex expressions 1`] = `
201
201
return n0
202
202
"
203
203
` ;
204
+
205
+ exports [` compiler: v-for > v-for on component 1` ] = `
206
+ "
207
+ const n0 = _createFor(() => (list), (_for_item0) => {
208
+ const n3 = _createComponent (Comp )
209
+ const n2 = _child (n3 )
210
+ _setNodes (n2 , () => (_for_item0 .value ))
211
+ return [n2 , n3 ]
212
+ } , undefined, 2)
213
+ return n0
214
+ "
215
+ ` ;
216
+
217
+ exports [` compiler: v-for > v-for on template with single component child 1` ] = `
218
+ "
219
+ const n0 = _createFor(() => (list), (_for_item0) => {
220
+ const n3 = _createComponent (Comp )
221
+ const n2 = _child (n3 )
222
+ _setNodes (n2 , () => (_for_item0 .value ))
223
+ return [n2 , n3 ]
224
+ } , undefined, 2)
225
+ return n0
226
+ "
227
+ ` ;
Original file line number Diff line number Diff line change @@ -379,4 +379,24 @@ describe('compiler: v-for', () => {
379
379
} )
380
380
expect ( code ) . toMatchSnapshot ( )
381
381
} )
382
+
383
+ test ( 'v-for on component' , ( ) => {
384
+ const { code, ir } = compileWithVFor (
385
+ `<Comp v-for={item in list}>{item}</Comp>` ,
386
+ )
387
+ expect ( code ) . matchSnapshot ( )
388
+ expect (
389
+ ( ir . block . dynamic . children [ 0 ] . operation as ForIRNode ) . component ,
390
+ ) . toBe ( true )
391
+ } )
392
+
393
+ test ( 'v-for on template with single component child' , ( ) => {
394
+ const { code, ir } = compileWithVFor (
395
+ `<template v-for={item in list}><Comp>{item}</Comp></template>` ,
396
+ )
397
+ expect ( code ) . matchSnapshot ( )
398
+ expect (
399
+ ( ir . block . dynamic . children [ 0 ] . operation as ForIRNode ) . component ,
400
+ ) . toBe ( true )
401
+ } )
382
402
} )
You can’t perform that action at this time.
0 commit comments