Skip to content

Commit 3bb997d

Browse files
authored
feat: add slide lifetime hooks (#1688)
1 parent 4f62e89 commit 3bb997d

File tree

3 files changed

+24
-1
lines changed

3 files changed

+24
-1
lines changed

docs/custom/vue-context.md

+4-1
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,14 @@ If you want to get the context programmatically (also type-safely), you can impo
121121

122122
```vue
123123
<script setup>
124-
import { useDarkMode, useNav, useSlideContext } from '@slidev/client'
124+
import { onSlideEnter, onSlideLeave, useDarkMode, useIsSlideActive, useNav, useSlideContext } from '@slidev/client'
125125
126126
const { $slidev } = useSlideContext()
127127
const { currentPage, currentLayout, currentSlideRoute } = useNav()
128128
const { isDark } = useDarkMode()
129+
const isActive = useIsSlideActive()
130+
onSlideEnter(() => { /* ... */ })
131+
onSlideLeave(() => { /* ... */ })
129132
// ...
130133
</script>
131134
```

packages/client/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export { useSlideContext } from './context'
77
export { useNav } from './composables/useNav'
88
export { useDrawings } from './composables/useDrawings'
99
export { useDarkMode } from './composables/useDarkMode'
10+
export { useIsSlideActive, onSlideEnter, onSlideLeave } from './logic/slides'
1011

1112
export * from './layoutHelper'
1213
export * from './env'

packages/client/logic/slides.ts

+19
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
import type { SlideRoute } from '@slidev/types'
2+
import { computed, watch, watchEffect } from 'vue'
3+
import { useSlideContext } from '../context'
4+
import { useNav } from '../composables/useNav'
25
import { slides } from '#slidev/slides'
36

47
export { slides }
@@ -18,3 +21,19 @@ export function getSlidePath(
1821
const no = route.meta.slide?.frontmatter.routeAlias ?? route.no
1922
return presenter ? `/presenter/${no}` : `/${no}`
2023
}
24+
25+
export function useIsSlideActive() {
26+
const { $page } = useSlideContext()
27+
const { currentSlideNo } = useNav()
28+
return computed(() => $page.value === currentSlideNo.value)
29+
}
30+
31+
export function onSlideEnter(cb: () => void) {
32+
const isActive = useIsSlideActive()
33+
watchEffect(() => isActive.value && cb())
34+
}
35+
36+
export function onSlideLeave(cb: () => void) {
37+
const isActive = useIsSlideActive()
38+
watch(isActive, () => !isActive.value && cb())
39+
}

0 commit comments

Comments
 (0)