1
1
<script setup lang="ts">
2
- import { TransitionGroup , computed , shallowRef , watch } from ' vue'
2
+ import { TransitionGroup , computed , shallowRef , watchEffect } from ' vue'
3
3
import { recomputeAllPoppers } from ' floating-vue'
4
+ import type { SlideRoute } from ' @slidev/types'
4
5
import { useNav } from ' ../composables/useNav'
5
6
import { useViewTransition } from ' ../composables/useViewTransition'
6
7
import { skipTransition } from ' ../logic/hmr'
@@ -19,20 +20,34 @@ const {
19
20
currentSlideRoute,
20
21
currentTransition,
21
22
getPrimaryClicks,
23
+ prevRoute,
22
24
nextRoute,
23
25
slides,
24
26
isPrintMode,
25
27
isPrintWithClicks,
26
28
clicksDirection,
27
29
} = useNav ()
28
30
29
- // preload next route
30
- watch (currentSlideRoute , () => {
31
- if (currentSlideRoute .value ?.meta && currentSlideRoute .value .meta .preload !== false )
32
- currentSlideRoute .value .meta .__preloaded = true
33
- if (nextRoute .value ?.meta && nextRoute .value .meta .preload !== false )
34
- nextRoute .value .meta .__preloaded = true
35
- }, { immediate: true })
31
+ function preloadRoute(route : SlideRoute ) {
32
+ if (route .meta .preload !== false ) {
33
+ route .meta .__preloaded = true
34
+ route .load ()
35
+ }
36
+ }
37
+ // preload current, prev and next slides
38
+ watchEffect (() => {
39
+ preloadRoute (currentSlideRoute .value )
40
+ preloadRoute (prevRoute .value )
41
+ preloadRoute (nextRoute .value )
42
+ })
43
+ // preload all slides after 3s
44
+ watchEffect ((onCleanup ) => {
45
+ const routes = slides .value
46
+ const timeout = setTimeout (() => {
47
+ routes .forEach (preloadRoute )
48
+ }, 3000 )
49
+ onCleanup (() => clearTimeout (timeout ))
50
+ })
36
51
37
52
const hasViewTransition = useViewTransition ()
38
53
@@ -67,14 +82,15 @@ function onAfterLeave() {
67
82
}"
68
83
@after-leave =" onAfterLeave"
69
84
>
70
- <SlideWrapper
71
- v-for =" route of loadedRoutes"
72
- v-show =" route === currentSlideRoute"
73
- :key =" route.no"
74
- :clicks-context =" isPrintMode && !isPrintWithClicks ? createFixedClicks(route, CLICKS_MAX) : getPrimaryClicks(route)"
75
- :route =" route"
76
- :render-context =" renderContext"
77
- />
85
+ <template v-for =" route of loadedRoutes " :key =" route .no " >
86
+ <SlideWrapper
87
+ v-if =" Math.abs(route.no - currentSlideRoute.no) <= 20"
88
+ v-show =" route === currentSlideRoute"
89
+ :clicks-context =" isPrintMode && !isPrintWithClicks ? createFixedClicks(route, CLICKS_MAX) : getPrimaryClicks(route)"
90
+ :route =" route"
91
+ :render-context =" renderContext"
92
+ />
93
+ </template >
78
94
</component >
79
95
80
96
<DragControl v-if =" activeDragElement" :data =" activeDragElement" />
0 commit comments