File tree Expand file tree Collapse file tree 2 files changed +30
-1
lines changed Expand file tree Collapse file tree 2 files changed +30
-1
lines changed Original file line number Diff line number Diff line change @@ -125,7 +125,13 @@ export default abstract class BaseWrapper<ElementType extends Node>
125
125
}
126
126
127
127
if ( typeof selector === 'object' && 'ref' in selector ) {
128
- const result = currentComponent . refs [ selector . ref ]
128
+ let result = currentComponent . refs [ selector . ref ]
129
+
130
+ // When using ref inside v-for, then refs contains array of component instances
131
+ if ( Array . isArray ( result ) ) {
132
+ result = result . length ? result [ 0 ] : undefined
133
+ }
134
+
129
135
if ( result && ! ( result instanceof HTMLElement ) ) {
130
136
return createVueWrapper ( null , result as ComponentPublicInstance )
131
137
} else {
Original file line number Diff line number Diff line change @@ -358,6 +358,29 @@ describe('findComponent', () => {
358
358
expect ( compB [ 0 ] . vm . $el . querySelector ( '.content' ) . textContent ) . toBe ( '1' )
359
359
} )
360
360
361
+ it ( 'finds single by ref in v-for' , ( ) => {
362
+ const ChildComp = {
363
+ props : {
364
+ value : Number
365
+ } ,
366
+ template : '<span>{{value}}</span>'
367
+ }
368
+
369
+ const wrapper = mount ( {
370
+ components : { ChildComp } ,
371
+ template : `
372
+ <div>
373
+ <div v-for="value in 3" :key="value">
374
+ <ChildComp ref="child" :value="value" />
375
+ </div>
376
+ </div>
377
+ `
378
+ } )
379
+ const child = wrapper . findComponent ( { ref : 'child' } )
380
+ expect ( child . exists ( ) ) . toBe ( true )
381
+ expect ( child . props ( 'value' ) ) . toBe ( 1 )
382
+ } )
383
+
361
384
// https://github.com/vuejs/test-utils/pull/188
362
385
const slotComponent = defineComponent ( {
363
386
name : 'slotA' ,
You can’t perform that action at this time.
0 commit comments