@@ -13,11 +13,20 @@ import {
13
13
nodeOps ,
14
14
ref ,
15
15
render ,
16
+ serialize ,
16
17
serializeInner ,
17
18
withDirectives ,
18
19
} from '@vue/runtime-test'
19
- import { Fragment , createVNode } from '../../src/vnode'
20
+ import {
21
+ Fragment ,
22
+ createBlock ,
23
+ createCommentVNode ,
24
+ createTextVNode ,
25
+ createVNode ,
26
+ openBlock ,
27
+ } from '../../src/vnode'
20
28
import { compile , render as domRender } from 'vue'
29
+ import { toDisplayString } from '@vue/shared'
21
30
22
31
describe ( 'renderer: teleport' , ( ) => {
23
32
test ( 'should work' , ( ) => {
@@ -129,6 +138,41 @@ describe('renderer: teleport', () => {
129
138
expect ( serializeInner ( target ) ) . toMatchInlineSnapshot ( `"teleported"` )
130
139
} )
131
140
141
+ test ( 'should traverse comment node after updating in optimize mode' , async ( ) => {
142
+ const target = nodeOps . createElement ( 'div' )
143
+ const root = nodeOps . createElement ( 'div' )
144
+ const count = ref ( 0 )
145
+ let teleport
146
+
147
+ __DEV__ = false
148
+ render (
149
+ h ( ( ) => {
150
+ teleport =
151
+ ( openBlock ( ) ,
152
+ createBlock ( Teleport , { to : target } , [
153
+ createCommentVNode ( 'comment in teleport' ) ,
154
+ ] ) )
155
+ return h ( 'div' , null , [
156
+ createTextVNode ( toDisplayString ( count . value ) ) ,
157
+ teleport ,
158
+ ] )
159
+ } ) ,
160
+ root ,
161
+ )
162
+ const commentNode = teleport ! . children [ 0 ] . el
163
+ expect ( serializeInner ( root ) ) . toMatchInlineSnapshot ( `"<div>0</div>"` )
164
+ expect ( serializeInner ( target ) ) . toMatchInlineSnapshot (
165
+ `"<!--comment in teleport-->"` ,
166
+ )
167
+ expect ( serialize ( commentNode ) ) . toBe ( `<!--comment in teleport-->` )
168
+
169
+ count . value = 1
170
+ await nextTick ( )
171
+ __DEV__ = true
172
+ expect ( serializeInner ( root ) ) . toMatchInlineSnapshot ( `"<div>1</div>"` )
173
+ expect ( teleport ! . children [ 0 ] . el ) . toBe ( commentNode )
174
+ } )
175
+
132
176
test ( 'should remove children when unmounted' , ( ) => {
133
177
const target = nodeOps . createElement ( 'div' )
134
178
const root = nodeOps . createElement ( 'div' )
@@ -151,6 +195,33 @@ describe('renderer: teleport', () => {
151
195
testUnmount ( { to : target , disabled : true } )
152
196
testUnmount ( { to : null , disabled : true } )
153
197
} )
198
+ // #10747
199
+ test ( 'should unmount correctly when using top level comment in teleport' , async ( ) => {
200
+ const target = nodeOps . createElement ( 'div' )
201
+ const root = nodeOps . createElement ( 'div' )
202
+ const count = ref ( 0 )
203
+
204
+ __DEV__ = false
205
+ render (
206
+ h ( ( ) => {
207
+ return h ( 'div' , null , [
208
+ createTextVNode ( toDisplayString ( count . value ) ) ,
209
+ ( openBlock ( ) ,
210
+ createBlock ( Teleport , { to : target } , [
211
+ createCommentVNode ( 'comment in teleport' ) ,
212
+ ] ) ) ,
213
+ ] )
214
+ } ) ,
215
+ root ,
216
+ )
217
+
218
+ count . value = 1
219
+
220
+ await nextTick ( )
221
+ __DEV__ = true
222
+ render ( null , root )
223
+ expect ( root . children . length ) . toBe ( 0 )
224
+ } )
154
225
155
226
test ( 'component with multi roots should be removed when unmounted' , ( ) => {
156
227
const target = nodeOps . createElement ( 'div' )
0 commit comments