@@ -6,7 +6,7 @@ import { defineComponent, shallowRef, useTemplateRef } from 'vue'
66import { useSortable } from './index'
77
88describe ( 'useSortable' , ( ) => {
9- it ( 'should initialise Sortable' , ( ) => {
9+ it ( 'should initialize Sortable' , ( ) => {
1010 const wrapper = mount ( defineComponent ( {
1111 template : '<div ref="el"></div>' ,
1212 setup ( ) {
@@ -179,4 +179,141 @@ describe('useSortable', () => {
179179 wrapper . unmount ( )
180180 }
181181 } )
182+
183+ describe ( 'watchElement' , ( ) => {
184+ it ( 'should auto-reinitialize when element changes with watchElement: true' , async ( ) => {
185+ const wrapper = mount ( defineComponent ( {
186+ template : '<div v-if="show" ref="el"></div>' ,
187+ setup ( ) {
188+ const el = useTemplateRef < HTMLElement > ( 'el' )
189+ const show = shallowRef ( true )
190+ const list = shallowRef < string [ ] > ( [ ] )
191+ const result = useSortable ( el , list , {
192+ watchElement : true ,
193+ } )
194+
195+ return { ...result , el, show }
196+ } ,
197+ } ) )
198+ const vm = wrapper . vm
199+ try {
200+ await wrapper . vm . $nextTick ( )
201+
202+ expect ( vm . el ) . toBeDefined ( )
203+ let sortable = Sortable . get ( vm . el ! )
204+ expect ( sortable ) . toBeDefined ( )
205+
206+ vm . show = false
207+ await wrapper . vm . $nextTick ( )
208+ expect ( vm . el ) . toBeNull ( )
209+
210+ vm . show = true
211+ await wrapper . vm . $nextTick ( )
212+ await wrapper . vm . $nextTick ( )
213+ expect ( vm . el ) . toBeDefined ( )
214+
215+ // Should be automatically reinitialized
216+ sortable = Sortable . get ( vm . el ! )
217+ expect ( sortable ) . toBeDefined ( )
218+ }
219+ finally {
220+ wrapper . unmount ( )
221+ }
222+ } )
223+
224+ it ( 'should NOT auto-reinitialize when element changes with watchElement: false' , async ( ) => {
225+ const wrapper = mount ( defineComponent ( {
226+ template : '<div v-if="show" ref="el"></div>' ,
227+ setup ( ) {
228+ const el = useTemplateRef < HTMLElement > ( 'el' )
229+ const show = shallowRef ( true )
230+ const list = shallowRef < string [ ] > ( [ ] )
231+ const result = useSortable ( el , list , {
232+ watchElement : false ,
233+ } )
234+
235+ return { ...result , el, show }
236+ } ,
237+ } ) )
238+ const vm = wrapper . vm
239+ try {
240+ expect ( vm . el ) . toBeDefined ( )
241+ const firstElement = vm . el !
242+ let sortable = Sortable . get ( firstElement )
243+ expect ( sortable ) . toBeDefined ( )
244+ const firstInstance = sortable
245+
246+ vm . show = false
247+ await wrapper . vm . $nextTick ( )
248+ expect ( vm . el ) . toBeNull ( )
249+
250+ vm . show = true
251+ await wrapper . vm . $nextTick ( )
252+ expect ( vm . el ) . toBeDefined ( )
253+ const secondElement = vm . el !
254+
255+ expect ( secondElement ) . not . toBe ( firstElement )
256+
257+ // New element should not have Sortable
258+ sortable = Sortable . get ( secondElement )
259+ expect ( sortable ) . toBeFalsy ( )
260+
261+ // Old instance still bound to removed element
262+ sortable = Sortable . get ( firstElement )
263+ expect ( sortable ) . toBe ( firstInstance )
264+
265+ // Manual cleanup and reinitialize required
266+ vm . stop ( )
267+ vm . start ( )
268+ sortable = Sortable . get ( secondElement )
269+ expect ( sortable ) . toBeDefined ( )
270+ }
271+ finally {
272+ wrapper . unmount ( )
273+ }
274+ } )
275+
276+ it ( 'should work with conditional rendering using watchElement: true' , async ( ) => {
277+ const wrapper = mount ( defineComponent ( {
278+ template : `
279+ <div>
280+ <div v-if="condition === 'a'" ref="el" data-test="a"></div>
281+ <div v-if="condition === 'b'" ref="el" data-test="b"></div>
282+ </div>
283+ ` ,
284+ setup ( ) {
285+ const el = useTemplateRef < HTMLElement > ( 'el' )
286+ const condition = shallowRef < 'a' | 'b' > ( 'a' )
287+ const list = shallowRef < string [ ] > ( [ ] )
288+ const result = useSortable ( el , list , {
289+ watchElement : true ,
290+ } )
291+
292+ return { ...result , el, condition }
293+ } ,
294+ } ) )
295+ const vm = wrapper . vm
296+ try {
297+ await wrapper . vm . $nextTick ( )
298+
299+ expect ( vm . el ?. getAttribute ( 'data-test' ) ) . toBe ( 'a' )
300+ let sortable = Sortable . get ( vm . el ! )
301+ expect ( sortable ) . toBeDefined ( )
302+ const firstInstance = sortable
303+
304+ vm . condition = 'b'
305+ await wrapper . vm . $nextTick ( )
306+ await wrapper . vm . $nextTick ( )
307+ expect ( vm . el ?. getAttribute ( 'data-test' ) ) . toBe ( 'b' )
308+
309+ // Should be a new instance
310+ sortable = Sortable . get ( vm . el ! )
311+ expect ( sortable ) . toBeDefined ( )
312+ expect ( sortable ) . not . toBe ( firstInstance )
313+ }
314+ finally {
315+ wrapper . unmount ( )
316+ }
317+ } )
318+ } )
182319} )
0 commit comments