@@ -14,6 +14,7 @@ import { Data } from '../src/component'
14
14
import { ShapeFlags , PatchFlags } from '@vue/shared'
15
15
import { h , reactive , isReactive } from '../src'
16
16
import { createApp , nodeOps , serializeInner } from '@vue/runtime-test'
17
+ import { setCurrentRenderingInstance } from '../src/componentRenderUtils'
17
18
18
19
describe ( 'vnode' , ( ) => {
19
20
test ( 'create with just tag' , ( ) => {
@@ -198,24 +199,55 @@ describe('vnode', () => {
198
199
expect ( cloned2 ) . toEqual ( node2 )
199
200
expect ( cloneVNode ( node2 ) ) . toEqual ( node2 )
200
201
expect ( cloneVNode ( node2 ) ) . toEqual ( cloned2 )
202
+ } )
201
203
204
+ test ( 'cloneVNode key normalization' , ( ) => {
202
205
// #1041 should use resolved key/ref
203
206
expect ( cloneVNode ( createVNode ( 'div' , { key : 1 } ) ) . key ) . toBe ( 1 )
204
207
expect ( cloneVNode ( createVNode ( 'div' , { key : 1 } ) , { key : 2 } ) . key ) . toBe ( 2 )
205
208
expect ( cloneVNode ( createVNode ( 'div' ) , { key : 2 } ) . key ) . toBe ( 2 )
209
+ } )
210
+
211
+ // ref normalizes to [currentRenderingInstance, ref]
212
+ test ( 'cloneVNode ref normalization' , ( ) => {
213
+ const mockInstance1 = { } as any
214
+ const mockInstance2 = { } as any
215
+
216
+ setCurrentRenderingInstance ( mockInstance1 )
217
+ const original = createVNode ( 'div' , { ref : 'foo' } )
218
+ expect ( original . ref ) . toEqual ( [ mockInstance1 , 'foo' ] )
219
+
220
+ // clone and preserve original ref
221
+ const cloned1 = cloneVNode ( original )
222
+ expect ( cloned1 . ref ) . toEqual ( [ mockInstance1 , 'foo' ] )
223
+
224
+ // cloning with new ref, but with same context instance
225
+ const cloned2 = cloneVNode ( original , { ref : 'bar' } )
226
+ expect ( cloned2 . ref ) . toEqual ( [ mockInstance1 , 'bar' ] )
227
+
228
+ // cloning and adding ref to original that has no ref
229
+ const original2 = createVNode ( 'div' )
230
+ const cloned3 = cloneVNode ( original2 , { ref : 'bar' } )
231
+ expect ( cloned3 . ref ) . toEqual ( [ mockInstance1 , 'bar' ] )
232
+
233
+ // cloning with different context instance
234
+ setCurrentRenderingInstance ( mockInstance2 )
235
+
236
+ // clone and preserve original ref
237
+ const cloned4 = cloneVNode ( original )
238
+ // #1311 should preserve original context instance!
239
+ expect ( cloned4 . ref ) . toEqual ( [ mockInstance1 , 'foo' ] )
240
+
241
+ // cloning with new ref, but with same context instance
242
+ const cloned5 = cloneVNode ( original , { ref : 'bar' } )
243
+ // new ref should use current context instance and overwrite orgiinal
244
+ expect ( cloned5 . ref ) . toEqual ( [ mockInstance2 , 'bar' ] )
245
+
246
+ // cloning and adding ref to original that has no ref
247
+ const cloned6 = cloneVNode ( original2 , { ref : 'bar' } )
248
+ expect ( cloned6 . ref ) . toEqual ( [ mockInstance2 , 'bar' ] )
206
249
207
- // ref normalizes to [currentRenderingInstance, ref]
208
- expect ( cloneVNode ( createVNode ( 'div' , { ref : 'foo' } ) ) . ref ) . toEqual ( [
209
- null ,
210
- 'foo'
211
- ] )
212
- expect (
213
- cloneVNode ( createVNode ( 'div' , { ref : 'foo' } ) , { ref : 'bar' } ) . ref
214
- ) . toEqual ( [ null , 'bar' ] )
215
- expect ( cloneVNode ( createVNode ( 'div' ) , { ref : 'bar' } ) . ref ) . toEqual ( [
216
- null ,
217
- 'bar'
218
- ] )
250
+ setCurrentRenderingInstance ( null )
219
251
} )
220
252
221
253
describe ( 'mergeProps' , ( ) => {
0 commit comments