Skip to content

Commit 21fbe63

Browse files
fix(Carousel): ensure plugins init after client-side navigation (#5117)
1 parent 8adfdbe commit 21fbe63

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
@@ -114,7 +114,7 @@ export interface CarouselEmits {
114114
</script>
115115

116116
<script setup lang="ts" generic="T extends CarouselItem">
117-
import { computed, ref, watch, onMounted } from 'vue'
117+
import { computed, ref, watch, onMounted, onBeforeUnmount } from 'vue'
118118
import useEmblaCarousel from 'embla-carousel-vue'
119119
import { Primitive, useForwardProps } from 'reka-ui'
120120
import { reactivePick } from '@vueuse/core'
@@ -212,13 +212,16 @@ async function loadPlugins() {
212212
plugins.value = emblaPlugins
213213
}
214214
215-
watch(() => [props.autoplay, props.autoScroll, props.autoHeight, props.classNames, props.fade, props.wheelGestures], loadPlugins, { immediate: true })
215+
watch(() => [props.autoplay, props.autoScroll, props.autoHeight, props.classNames, props.fade, props.wheelGestures], async () => {
216+
await loadPlugins()
217+
emblaApi.value?.reInit(options.value, plugins.value)
218+
}, { immediate: true })
216219
217-
const [emblaRef, emblaApi] = useEmblaCarousel(options.value, plugins.value)
220+
const [emblaRef, emblaApi] = useEmblaCarousel(options, plugins)
218221
219-
watch([options, plugins], () => {
222+
watch(options, () => {
220223
emblaApi.value?.reInit(options.value, plugins.value)
221-
})
224+
}, { flush: 'post' })
222225
223226
function scrollPrev() {
224227
emblaApi.value?.scrollPrev()
@@ -280,11 +283,23 @@ onMounted(() => {
280283
return
281284
}
282285
283-
emblaApi.value?.on('init', onInit)
284-
emblaApi.value?.on('init', onSelect)
285-
emblaApi.value?.on('reInit', onInit)
286-
emblaApi.value?.on('reInit', onSelect)
287-
emblaApi.value?.on('select', onSelect)
286+
emblaApi.value.on('init', onInit)
287+
emblaApi.value.on('init', onSelect)
288+
emblaApi.value.on('reInit', onInit)
289+
emblaApi.value.on('reInit', onSelect)
290+
emblaApi.value.on('select', onSelect)
291+
})
292+
293+
onBeforeUnmount(() => {
294+
if (!emblaApi.value) {
295+
return
296+
}
297+
298+
emblaApi.value.off('init', onInit)
299+
emblaApi.value.off('init', onSelect)
300+
emblaApi.value.off('reInit', onInit)
301+
emblaApi.value.off('reInit', onSelect)
302+
emblaApi.value.off('select', onSelect)
288303
})
289304
290305
defineExpose({

0 commit comments

Comments
 (0)