@@ -106,6 +106,134 @@ describe('useTemplateRef', () => {
106
106
expect ( tRef ! . value ) . toBe ( null )
107
107
} )
108
108
109
+ test ( 'should work when used with direct ref value with ref_key' , ( ) => {
110
+ let tRef : ShallowRef
111
+ const key = 'refKey'
112
+ const Comp = {
113
+ setup ( ) {
114
+ tRef = useTemplateRef ( key )
115
+ return ( ) => h ( 'div' , { ref : tRef , ref_key : key } )
116
+ } ,
117
+ }
118
+ const root = nodeOps . createElement ( 'div' )
119
+ render ( h ( Comp ) , root )
120
+
121
+ expect ( 'target is readonly' ) . not . toHaveBeenWarned ( )
122
+ expect ( tRef ! . value ) . toBe ( root . children [ 0 ] )
123
+ } )
124
+
125
+ test ( 'should work when used with direct ref value with ref_key and ref_for' , ( ) => {
126
+ let tRef : ShallowRef
127
+ const key = 'refKey'
128
+ const Comp = {
129
+ setup ( ) {
130
+ tRef = useTemplateRef ( key )
131
+ } ,
132
+ render ( ) {
133
+ return h (
134
+ 'div' ,
135
+ [ 1 , 2 , 3 ] . map ( x =>
136
+ h ( 'span' , { ref : tRef , ref_key : key , ref_for : true } , x . toString ( ) ) ,
137
+ ) ,
138
+ )
139
+ } ,
140
+ }
141
+ const root = nodeOps . createElement ( 'div' )
142
+ render ( h ( Comp ) , root )
143
+
144
+ expect ( 'target is readonly' ) . not . toHaveBeenWarned ( )
145
+ expect ( tRef ! . value ) . toHaveLength ( 3 )
146
+ } )
147
+
148
+ test ( 'should work when used with direct ref value with ref_key and dynamic value' , async ( ) => {
149
+ const refMode = ref ( 'h1-ref' )
150
+
151
+ let tRef : ShallowRef
152
+ const key = 'refKey'
153
+
154
+ const Comp = {
155
+ setup ( ) {
156
+ tRef = useTemplateRef ( key )
157
+ } ,
158
+ render ( ) {
159
+ switch ( refMode . value ) {
160
+ case 'h1-ref' :
161
+ return h ( 'h1' , { ref : tRef , ref_key : key } )
162
+ case 'h2-ref' :
163
+ return h ( 'h2' , { ref : tRef , ref_key : key } )
164
+ case 'no-ref' :
165
+ return h ( 'span' )
166
+ case 'nothing' :
167
+ return null
168
+ }
169
+ } ,
170
+ }
171
+
172
+ const root = nodeOps . createElement ( 'div' )
173
+ render ( h ( Comp ) , root )
174
+
175
+ expect ( tRef ! . value . tag ) . toBe ( 'h1' )
176
+
177
+ refMode . value = 'h2-ref'
178
+ await nextTick ( )
179
+ expect ( tRef ! . value . tag ) . toBe ( 'h2' )
180
+
181
+ refMode . value = 'no-ref'
182
+ await nextTick ( )
183
+ expect ( tRef ! . value ) . toBeNull ( )
184
+
185
+ refMode . value = 'nothing'
186
+ await nextTick ( )
187
+ expect ( tRef ! . value ) . toBeNull ( )
188
+
189
+ expect ( 'target is readonly' ) . not . toHaveBeenWarned ( )
190
+ } )
191
+
192
+ test ( 'should work when used with dynamic direct refs and ref_keys' , async ( ) => {
193
+ const refKey = ref ( 'foo' )
194
+
195
+ let tRefs : Record < string , ShallowRef >
196
+
197
+ const Comp = {
198
+ setup ( ) {
199
+ tRefs = {
200
+ foo : useTemplateRef ( 'foo' ) ,
201
+ bar : useTemplateRef ( 'bar' ) ,
202
+ }
203
+ } ,
204
+ render ( ) {
205
+ return h ( 'div' , { ref : tRefs [ refKey . value ] , ref_key : refKey . value } )
206
+ } ,
207
+ }
208
+
209
+ const root = nodeOps . createElement ( 'div' )
210
+ render ( h ( Comp ) , root )
211
+
212
+ expect ( tRefs ! [ 'foo' ] . value ) . toBe ( root . children [ 0 ] )
213
+ expect ( tRefs ! [ 'bar' ] . value ) . toBeNull ( )
214
+
215
+ refKey . value = 'bar'
216
+ await nextTick ( )
217
+ expect ( tRefs ! [ 'foo' ] . value ) . toBeNull ( )
218
+ expect ( tRefs ! [ 'bar' ] . value ) . toBe ( root . children [ 0 ] )
219
+
220
+ expect ( 'target is readonly' ) . not . toHaveBeenWarned ( )
221
+ } )
222
+
223
+ test ( 'should not work when used with direct ref value without ref_key (in dev mode)' , ( ) => {
224
+ let tRef : ShallowRef
225
+ const Comp = {
226
+ setup ( ) {
227
+ tRef = useTemplateRef ( 'refKey' )
228
+ return ( ) => h ( 'div' , { ref : tRef } )
229
+ } ,
230
+ }
231
+ const root = nodeOps . createElement ( 'div' )
232
+ render ( h ( Comp ) , root )
233
+
234
+ expect ( tRef ! . value ) . toBeNull ( )
235
+ } )
236
+
109
237
test ( 'should work when used as direct ref value (compiled in prod mode)' , ( ) => {
110
238
__DEV__ = false
111
239
try {
@@ -125,4 +253,65 @@ describe('useTemplateRef', () => {
125
253
__DEV__ = true
126
254
}
127
255
} )
256
+
257
+ test ( 'should work when used as direct ref value with ref_key and ref_for (compiled in prod mode)' , ( ) => {
258
+ __DEV__ = false
259
+ try {
260
+ let tRef : ShallowRef
261
+ const key = 'refKey'
262
+ const Comp = {
263
+ setup ( ) {
264
+ tRef = useTemplateRef ( key )
265
+ } ,
266
+ render ( ) {
267
+ return h (
268
+ 'div' ,
269
+ [ 1 , 2 , 3 ] . map ( x =>
270
+ h (
271
+ 'span' ,
272
+ { ref : tRef , ref_key : key , ref_for : true } ,
273
+ x . toString ( ) ,
274
+ ) ,
275
+ ) ,
276
+ )
277
+ } ,
278
+ }
279
+
280
+ const root = nodeOps . createElement ( 'div' )
281
+ render ( h ( Comp ) , root )
282
+
283
+ expect ( 'target is readonly' ) . not . toHaveBeenWarned ( )
284
+ expect ( tRef ! . value ) . toHaveLength ( 3 )
285
+ } finally {
286
+ __DEV__ = true
287
+ }
288
+ } )
289
+
290
+ test ( 'should work when used as direct ref value with ref_for but without ref_key (compiled in prod mode)' , ( ) => {
291
+ __DEV__ = false
292
+ try {
293
+ let tRef : ShallowRef
294
+ const Comp = {
295
+ setup ( ) {
296
+ tRef = useTemplateRef ( 'refKey' )
297
+ } ,
298
+ render ( ) {
299
+ return h (
300
+ 'div' ,
301
+ [ 1 , 2 , 3 ] . map ( x =>
302
+ h ( 'span' , { ref : tRef , ref_for : true } , x . toString ( ) ) ,
303
+ ) ,
304
+ )
305
+ } ,
306
+ }
307
+
308
+ const root = nodeOps . createElement ( 'div' )
309
+ render ( h ( Comp ) , root )
310
+
311
+ expect ( 'target is readonly' ) . not . toHaveBeenWarned ( )
312
+ expect ( tRef ! . value ) . toHaveLength ( 3 )
313
+ } finally {
314
+ __DEV__ = true
315
+ }
316
+ } )
128
317
} )
0 commit comments