@@ -97,10 +97,11 @@ describe('component: slots', () => {
97
97
98
98
const { render } = define ( {
99
99
render ( ) {
100
- return createComponent ( Child , { } , { _ : 2 as any } , ( ) => [
101
- flag1 . value
102
- ? { name : 'one' , fn : ( ) => template ( '<span></span>' ) ( ) }
103
- : { name : 'two' , fn : ( ) => template ( '<div></div>' ) ( ) } ,
100
+ return createComponent ( Child , { } , { _ : 2 as any } , [
101
+ ( ) =>
102
+ flag1 . value
103
+ ? { name : 'one' , fn : ( ) => template ( '<span></span>' ) ( ) }
104
+ : { name : 'two' , fn : ( ) => template ( '<div></div>' ) ( ) } ,
104
105
] )
105
106
} ,
106
107
} )
@@ -132,10 +133,11 @@ describe('component: slots', () => {
132
133
133
134
const { render } = define ( {
134
135
setup ( ) {
135
- return createComponent ( Child , { } , { } , ( ) => [
136
- flag1 . value
137
- ? [ { name : 'header' , fn : ( ) => template ( 'header' ) ( ) } ]
138
- : [ { name : 'footer' , fn : ( ) => template ( 'footer' ) ( ) } ] ,
136
+ return createComponent ( Child , { } , { } , [
137
+ ( ) =>
138
+ flag1 . value
139
+ ? [ { name : 'header' , fn : ( ) => template ( 'header' ) ( ) } ]
140
+ : [ { name : 'footer' , fn : ( ) => template ( 'footer' ) ( ) } ] ,
139
141
] )
140
142
} ,
141
143
} )
@@ -178,8 +180,8 @@ describe('component: slots', () => {
178
180
return template ( 'content' ) ( )
179
181
} ,
180
182
} ,
181
- ( ) => [
182
- [
183
+ [
184
+ ( ) => [
183
185
{
184
186
name : 'inVFor' ,
185
187
fn : ( ) => {
@@ -188,14 +190,14 @@ describe('component: slots', () => {
188
190
} ,
189
191
} ,
190
192
] ,
191
- {
193
+ ( ) => ( {
192
194
name : 'inVIf' ,
193
195
key : '1' ,
194
196
fn : ( ) => {
195
197
instanceInVIfSlot = getCurrentInstance ( )
196
198
return template ( 'content' ) ( )
197
199
} ,
198
- } ,
200
+ } ) ,
199
201
] ,
200
202
)
201
203
} ,
@@ -206,6 +208,61 @@ describe('component: slots', () => {
206
208
expect ( instanceInVIfSlot ) . toBe ( instance )
207
209
} )
208
210
211
+ test ( 'dynamicSlots should update separately' , async ( ) => {
212
+ const flag1 = ref ( true )
213
+ const flag2 = ref ( true )
214
+ const slotFn1 = vitest . fn ( )
215
+ const slotFn2 = vitest . fn ( )
216
+
217
+ let instance : any
218
+ const Child = ( ) => {
219
+ instance = getCurrentInstance ( )
220
+ return template ( 'child' ) ( )
221
+ }
222
+
223
+ const { render } = define ( {
224
+ render ( ) {
225
+ return createComponent ( Child , { } , { } , [
226
+ ( ) => {
227
+ slotFn1 ( )
228
+ return flag1 . value
229
+ ? { name : 'one' , fn : ( ) => template ( 'one' ) ( ) }
230
+ : { name : 'two' , fn : ( ) => template ( 'two' ) ( ) }
231
+ } ,
232
+ ( ) => {
233
+ slotFn2 ( )
234
+ return flag2 . value
235
+ ? { name : 'three' , fn : ( ) => template ( 'three' ) ( ) }
236
+ : { name : 'four' , fn : ( ) => template ( 'four' ) ( ) }
237
+ } ,
238
+ ] )
239
+ } ,
240
+ } )
241
+
242
+ render ( )
243
+
244
+ expect ( instance . slots ) . toHaveProperty ( 'one' )
245
+ expect ( instance . slots ) . toHaveProperty ( 'three' )
246
+ expect ( slotFn1 ) . toHaveBeenCalledTimes ( 1 )
247
+ expect ( slotFn2 ) . toHaveBeenCalledTimes ( 1 )
248
+
249
+ flag1 . value = false
250
+ await nextTick ( )
251
+
252
+ expect ( instance . slots ) . toHaveProperty ( 'two' )
253
+ expect ( instance . slots ) . toHaveProperty ( 'three' )
254
+ expect ( slotFn1 ) . toHaveBeenCalledTimes ( 2 )
255
+ expect ( slotFn2 ) . toHaveBeenCalledTimes ( 1 )
256
+
257
+ flag2 . value = false
258
+ await nextTick ( )
259
+
260
+ expect ( instance . slots ) . toHaveProperty ( 'two' )
261
+ expect ( instance . slots ) . toHaveProperty ( 'four' )
262
+ expect ( slotFn1 ) . toHaveBeenCalledTimes ( 2 )
263
+ expect ( slotFn2 ) . toHaveBeenCalledTimes ( 2 )
264
+ } )
265
+
209
266
test . todo ( 'should respect $stable flag' , async ( ) => {
210
267
// TODO: $stable flag?
211
268
} )
@@ -299,8 +356,11 @@ describe('component: slots', () => {
299
356
300
357
const { host } = define ( ( ) => {
301
358
// dynamic slot
302
- return createComponent ( Comp , { } , { } , ( ) => [
303
- { name : 'header' , fn : ( { title } ) => template ( `${ title ( ) } ` ) ( ) } ,
359
+ return createComponent ( Comp , { } , { } , [
360
+ ( ) => ( {
361
+ name : 'header' ,
362
+ fn : ( { title } ) => template ( `${ title ( ) } ` ) ( ) ,
363
+ } ) ,
304
364
] )
305
365
} ) . render ( )
306
366
@@ -363,10 +423,11 @@ describe('component: slots', () => {
363
423
} )
364
424
365
425
const { host } = define ( ( ) => {
366
- return createComponent ( Child , { } , { } , ( ) => [
367
- flag1 . value
368
- ? { name : 'one' , fn : ( ) => template ( 'one content' ) ( ) }
369
- : { name : 'two' , fn : ( ) => template ( 'two content' ) ( ) } ,
426
+ return createComponent ( Child , { } , { } , [
427
+ ( ) =>
428
+ flag1 . value
429
+ ? { name : 'one' , fn : ( ) => template ( 'one content' ) ( ) }
430
+ : { name : 'two' , fn : ( ) => template ( 'two content' ) ( ) } ,
370
431
] )
371
432
} ) . render ( )
372
433
0 commit comments