Skip to content

Commit 0f7a1b7

Browse files
committed
fix(Carousel): ensure plugins init after client-side navigation (#5117)
1 parent fb6b586 commit 0f7a1b7

File tree

1 file changed

+25
-10
lines changed

1 file changed

+25
-10
lines changed

src/runtime/components/Carousel.vue

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ export interface CarouselEmits {
115115
</script>
116116

117117
<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'
119119
import useEmblaCarousel from 'embla-carousel-vue'
120120
import { Primitive, useForwardProps } from 'reka-ui'
121121
import { reactivePick } from '@vueuse/core'
@@ -213,13 +213,16 @@ async function loadPlugins() {
213213
plugins.value = emblaPlugins
214214
}
215215
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 })
217220
218-
const [emblaRef, emblaApi] = useEmblaCarousel(options.value, plugins.value)
221+
const [emblaRef, emblaApi] = useEmblaCarousel(options, plugins)
219222
220-
watch([options, plugins], () => {
223+
watch(options, () => {
221224
emblaApi.value?.reInit(options.value, plugins.value)
222-
})
225+
}, { flush: 'post' })
223226
224227
function scrollPrev() {
225228
emblaApi.value?.scrollPrev()
@@ -281,11 +284,23 @@ onMounted(() => {
281284
return
282285
}
283286
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)
289304
})
290305
291306
defineExpose({

0 commit comments

Comments
 (0)