@@ -193,25 +193,40 @@ describe('renderer: VaporTeleport', () => {
193193
194194 const { component : Child } = define ( {
195195 __hmrId : childId ,
196- render ( ) {
197- return template ( '<div>teleported</div>' ) ( )
196+ setup ( ) {
197+ const msg = ref ( 'teleported' )
198+ return { msg }
199+ } ,
200+ render ( ctx ) {
201+ const n0 = template ( `<div> </div>` ) ( )
202+ const x0 = child ( n0 as any )
203+ renderEffect ( ( ) => setText ( x0 as any , ctx . msg ) )
204+ return [ n0 ]
198205 } ,
199206 } )
200207 createRecord ( childId , Child as any )
201208
202209 const { mount, component : Parent } = define ( {
203210 __hmrId : parentId ,
204- render ( ) {
211+ setup ( ) {
212+ const msg = ref ( 'root' )
213+ const disabled = ref ( false )
214+ return { msg, disabled }
215+ } ,
216+ render ( ctx ) {
205217 const n0 = createComp (
206218 VaporTeleport ,
207219 {
208220 to : ( ) => target ,
221+ disabled : ( ) => ctx . disabled ,
209222 } ,
210223 {
211224 default : ( ) => createComp ( Child ) ,
212225 } ,
213226 )
214- const n1 = template ( '<div>root</div>' ) ( )
227+ const n1 = template ( `<div> </div>` ) ( )
228+ const x0 = child ( n1 as any )
229+ renderEffect ( ( ) => setText ( x0 as any , ctx . msg ) )
215230 return [ n0 , n1 ]
216231 } ,
217232 } ) . create ( )
@@ -221,38 +236,187 @@ describe('renderer: VaporTeleport', () => {
221236 expect ( root . innerHTML ) . toBe ( '<!--teleport--><div>root</div>' )
222237 expect ( target . innerHTML ) . toBe ( '<div>teleported</div>' )
223238
224- // reload child
239+ // reload child by changing msg
225240 reload ( childId , {
226241 __hmrId : childId ,
227242 __vapor : true ,
228- render ( ) {
229- return template ( '<div>teleported 2</div>' ) ( )
243+ setup ( ) {
244+ const msg = ref ( 'teleported 2' )
245+ return { msg }
246+ } ,
247+ render ( ctx : any ) {
248+ const n0 = template ( `<div> </div>` ) ( )
249+ const x0 = child ( n0 as any )
250+ renderEffect ( ( ) => setText ( x0 as any , ctx . msg ) )
251+ return [ n0 ]
230252 } ,
231253 } )
232254 expect ( root . innerHTML ) . toBe ( '<!--teleport--><div>root</div>' )
233255 expect ( target . innerHTML ) . toBe ( '<div>teleported 2</div>' )
234256
235- // reload parent
257+ // reload parent by changing msg
236258 reload ( parentId , {
237259 __hmrId : parentId ,
238260 __vapor : true ,
239- render ( ) {
261+ setup ( ) {
262+ const msg = ref ( 'root 2' )
263+ const disabled = ref ( false )
264+ return { msg, disabled }
265+ } ,
266+ render ( ctx : any ) {
240267 const n0 = createComp (
241268 VaporTeleport ,
242269 {
243270 to : ( ) => target ,
271+ disabled : ( ) => ctx . disabled ,
244272 } ,
245273 {
246274 default : ( ) => createComp ( Child ) ,
247275 } ,
248276 )
249- const n1 = template ( '<div>root 2</div>' ) ( )
277+ const n1 = template ( `<div> </div>` ) ( )
278+ const x0 = child ( n1 as any )
279+ renderEffect ( ( ) => setText ( x0 as any , ctx . msg ) )
250280 return [ n0 , n1 ]
251281 } ,
252282 } )
253283
254284 expect ( root . innerHTML ) . toBe ( '<!--teleport--><div>root 2</div>' )
255285 expect ( target . innerHTML ) . toBe ( '<div>teleported 2</div>' )
286+
287+ // reload parent again by changing disabled
288+ reload ( parentId , {
289+ __hmrId : parentId ,
290+ __vapor : true ,
291+ setup ( ) {
292+ const msg = ref ( 'root 2' )
293+ const disabled = ref ( true )
294+ return { msg, disabled }
295+ } ,
296+ render ( ctx : any ) {
297+ const n0 = createComp (
298+ VaporTeleport ,
299+ {
300+ to : ( ) => target ,
301+ disabled : ( ) => ctx . disabled ,
302+ } ,
303+ {
304+ default : ( ) => createComp ( Child ) ,
305+ } ,
306+ )
307+ const n1 = template ( `<div> </div>` ) ( )
308+ const x0 = child ( n1 as any )
309+ renderEffect ( ( ) => setText ( x0 as any , ctx . msg ) )
310+ return [ n0 , n1 ]
311+ } ,
312+ } )
313+
314+ expect ( root . innerHTML ) . toBe (
315+ '<div>teleported 2</div><!--teleport--><div>root 2</div>' ,
316+ )
317+ expect ( target . innerHTML ) . toBe ( '' )
318+ } )
319+
320+ test . todo ( 'reload child + toggle disabled' , async ( ) => {
321+ const target = document . createElement ( 'div' )
322+ const root = document . createElement ( 'div' )
323+ const childId = 'test3-child'
324+ const parentId = 'test3-parent'
325+
326+ const disabled = ref ( true )
327+ const { component : Child } = define ( {
328+ __hmrId : childId ,
329+ setup ( ) {
330+ const msg = ref ( 'teleported' )
331+ return { msg }
332+ } ,
333+ render ( ctx ) {
334+ const n0 = template ( `<div> </div>` ) ( )
335+ const x0 = child ( n0 as any )
336+ renderEffect ( ( ) => setText ( x0 as any , ctx . msg ) )
337+ return [ n0 ]
338+ } ,
339+ } )
340+ createRecord ( childId , Child as any )
341+
342+ const { mount, component : Parent } = define ( {
343+ __hmrId : parentId ,
344+ setup ( ) {
345+ const msg = ref ( 'root' )
346+ return { msg, disabled }
347+ } ,
348+ render ( ctx ) {
349+ const n0 = createComp (
350+ VaporTeleport ,
351+ {
352+ to : ( ) => target ,
353+ disabled : ( ) => ctx . disabled ,
354+ } ,
355+ {
356+ default : ( ) => createComp ( Child ) ,
357+ } ,
358+ )
359+ const n1 = template ( `<div> </div>` ) ( )
360+ const x0 = child ( n1 as any )
361+ renderEffect ( ( ) => setText ( x0 as any , ctx . msg ) )
362+ return [ n0 , n1 ]
363+ } ,
364+ } ) . create ( )
365+ createRecord ( parentId , Parent as any )
366+ mount ( root )
367+
368+ expect ( root . innerHTML ) . toBe (
369+ '<div>teleported</div><!--teleport--><div>root</div>' ,
370+ )
371+ expect ( target . innerHTML ) . toBe ( '' )
372+
373+ // reload child by changing msg
374+ reload ( childId , {
375+ __hmrId : childId ,
376+ __vapor : true ,
377+ setup ( ) {
378+ const msg = ref ( 'teleported 2' )
379+ return { msg }
380+ } ,
381+ render ( ctx : any ) {
382+ const n0 = template ( `<div> </div>` ) ( )
383+ const x0 = child ( n0 as any )
384+ renderEffect ( ( ) => setText ( x0 as any , ctx . msg ) )
385+ return [ n0 ]
386+ } ,
387+ } )
388+ expect ( root . innerHTML ) . toBe (
389+ '<div>teleported 2</div><!--teleport--><div>root</div>' ,
390+ )
391+ expect ( target . innerHTML ) . toBe ( '' )
392+
393+ // reload child again by changing msg
394+ reload ( childId , {
395+ __hmrId : childId ,
396+ __vapor : true ,
397+ setup ( ) {
398+ const msg = ref ( 'teleported 3' )
399+ return { msg }
400+ } ,
401+ render ( ctx : any ) {
402+ const n0 = template ( `<div> </div>` ) ( )
403+ const x0 = child ( n0 as any )
404+ renderEffect ( ( ) => setText ( x0 as any , ctx . msg ) )
405+ return [ n0 ]
406+ } ,
407+ } )
408+ expect ( root . innerHTML ) . toBe (
409+ '<div>teleported 3</div><!--teleport--><div>root</div>' ,
410+ )
411+ expect ( target . innerHTML ) . toBe ( '' )
412+
413+ //bug: child reload not update teleport fragment's nodes
414+
415+ // toggle disabled
416+ disabled . value = false
417+ await nextTick ( )
418+ expect ( root . innerHTML ) . toBe ( '<!--teleport--><div>root</div>' )
419+ expect ( target . innerHTML ) . toBe ( '<div>teleported 3</div>' )
256420 } )
257421 } )
258422} )
0 commit comments