@@ -115,7 +115,7 @@ export interface CarouselEmits {
115
115
</script >
116
116
117
117
<script setup lang="ts" generic =" T extends CarouselItem " >
118
- import { computed , ref , watch , onMounted } from ' vue'
118
+ import { computed , ref , watch , onMounted , onBeforeUnmount } from ' vue'
119
119
import useEmblaCarousel from ' embla-carousel-vue'
120
120
import { Primitive , useForwardProps } from ' reka-ui'
121
121
import { reactivePick } from ' @vueuse/core'
@@ -213,13 +213,16 @@ async function loadPlugins() {
213
213
plugins .value = emblaPlugins
214
214
}
215
215
216
- watch (() => [props .autoplay , props .autoScroll , props .autoHeight , props .classNames , props .fade , props .wheelGestures ], loadPlugins , { immediate: true })
216
+ watch (() => [props .autoplay , props .autoScroll , props .autoHeight , props .classNames , props .fade , props .wheelGestures ], async () => {
217
+ await loadPlugins ()
218
+ emblaApi .value ?.reInit (options .value , plugins .value )
219
+ }, { immediate: true })
217
220
218
- const [emblaRef, emblaApi] = useEmblaCarousel (options . value , plugins . value )
221
+ const [emblaRef, emblaApi] = useEmblaCarousel (options , plugins )
219
222
220
- watch ([ options , plugins ] , () => {
223
+ watch (options , () => {
221
224
emblaApi .value ?.reInit (options .value , plugins .value )
222
- })
225
+ }, { flush: ' post ' } )
223
226
224
227
function scrollPrev() {
225
228
emblaApi .value ?.scrollPrev ()
@@ -281,11 +284,23 @@ onMounted(() => {
281
284
return
282
285
}
283
286
284
- emblaApi .value ?.on (' init' , onInit )
285
- emblaApi .value ?.on (' init' , onSelect )
286
- emblaApi .value ?.on (' reInit' , onInit )
287
- emblaApi .value ?.on (' reInit' , onSelect )
288
- emblaApi .value ?.on (' select' , onSelect )
287
+ emblaApi .value .on (' init' , onInit )
288
+ emblaApi .value .on (' init' , onSelect )
289
+ emblaApi .value .on (' reInit' , onInit )
290
+ emblaApi .value .on (' reInit' , onSelect )
291
+ emblaApi .value .on (' select' , onSelect )
292
+ })
293
+
294
+ onBeforeUnmount (() => {
295
+ if (! emblaApi .value ) {
296
+ return
297
+ }
298
+
299
+ emblaApi .value .off (' init' , onInit )
300
+ emblaApi .value .off (' init' , onSelect )
301
+ emblaApi .value .off (' reInit' , onInit )
302
+ emblaApi .value .off (' reInit' , onSelect )
303
+ emblaApi .value .off (' select' , onSelect )
289
304
})
290
305
291
306
defineExpose ({
0 commit comments