@@ -14,10 +14,19 @@ import {
14
14
h as originalH ,
15
15
ref ,
16
16
render ,
17
+ serialize ,
17
18
serializeInner ,
18
19
withDirectives ,
19
20
} from '@vue/runtime-test'
20
- import { Fragment , createCommentVNode , createVNode } from '../../src/vnode'
21
+ import {
22
+ Fragment ,
23
+ createBlock ,
24
+ createCommentVNode ,
25
+ createTextVNode ,
26
+ createVNode ,
27
+ openBlock ,
28
+ } from '../../src/vnode'
29
+ import { toDisplayString } from '@vue/shared'
21
30
import { compile , createApp as createDOMApp , render as domRender } from 'vue'
22
31
import type { HMRRuntime } from '../../src/hmr'
23
32
@@ -248,6 +257,39 @@ describe('renderer: teleport', () => {
248
257
expect ( serializeInner ( target ) ) . toBe ( `teleported` )
249
258
} )
250
259
260
+ test ( 'should traverse comment node after updating in optimize mode' , async ( ) => {
261
+ const target = nodeOps . createElement ( 'div' )
262
+ const root = nodeOps . createElement ( 'div' )
263
+ const count = ref ( 0 )
264
+ let teleport
265
+
266
+ __DEV__ = false
267
+ render (
268
+ h ( ( ) => {
269
+ teleport =
270
+ ( openBlock ( ) ,
271
+ createBlock ( Teleport , { to : target } , [
272
+ createCommentVNode ( 'comment in teleport' ) ,
273
+ ] ) )
274
+ return h ( 'div' , null , [
275
+ createTextVNode ( toDisplayString ( count . value ) ) ,
276
+ teleport ,
277
+ ] )
278
+ } ) ,
279
+ root ,
280
+ )
281
+ const commentNode = teleport ! . children [ 0 ] . el
282
+ expect ( serializeInner ( root ) ) . toBe ( `<div>0</div>` )
283
+ expect ( serializeInner ( target ) ) . toBe ( `<!--comment in teleport-->` )
284
+ expect ( serialize ( commentNode ) ) . toBe ( `<!--comment in teleport-->` )
285
+
286
+ count . value = 1
287
+ await nextTick ( )
288
+ __DEV__ = true
289
+ expect ( serializeInner ( root ) ) . toBe ( `<div>1</div>` )
290
+ expect ( teleport ! . children [ 0 ] . el ) . toBe ( commentNode )
291
+ } )
292
+
251
293
test ( 'should remove children when unmounted' , ( ) => {
252
294
const target = nodeOps . createElement ( 'div' )
253
295
const root = nodeOps . createElement ( 'div' )
@@ -274,6 +316,34 @@ describe('renderer: teleport', () => {
274
316
testUnmount ( { to : null , disabled : true } )
275
317
} )
276
318
319
+ // #10747
320
+ test ( 'should unmount correctly when using top level comment in teleport' , async ( ) => {
321
+ const target = nodeOps . createElement ( 'div' )
322
+ const root = nodeOps . createElement ( 'div' )
323
+ const count = ref ( 0 )
324
+
325
+ __DEV__ = false
326
+ render (
327
+ h ( ( ) => {
328
+ return h ( 'div' , null , [
329
+ createTextVNode ( toDisplayString ( count . value ) ) ,
330
+ ( openBlock ( ) ,
331
+ createBlock ( Teleport , { to : target } , [
332
+ createCommentVNode ( 'comment in teleport' ) ,
333
+ ] ) ) ,
334
+ ] )
335
+ } ) ,
336
+ root ,
337
+ )
338
+
339
+ count . value = 1
340
+
341
+ await nextTick ( )
342
+ __DEV__ = true
343
+ render ( null , root )
344
+ expect ( root . children . length ) . toBe ( 0 )
345
+ } )
346
+
277
347
test ( 'component with multi roots should be removed when unmounted' , ( ) => {
278
348
const target = nodeOps . createElement ( 'div' )
279
349
const root = nodeOps . createElement ( 'div' )
0 commit comments