1
1
import { createRouter , createWebHistory , ScrollBehavior } from '../../src'
2
2
import { RouteComponent } from '../../src/types'
3
- import { createApp } from 'vue'
3
+ import { createApp , ref } from 'vue'
4
4
import { scrollWaiter } from './scrollWaiter'
5
5
6
6
const Home : RouteComponent = { template : '<div class="home">home</div>' }
@@ -28,19 +28,23 @@ const scrollBehavior: ScrollBehavior = async function (
28
28
) {
29
29
await scrollWaiter . promise
30
30
31
+ const behavior : ScrollOptions [ 'behavior' ] = smoothScroll . value
32
+ ? 'smooth'
33
+ : 'auto'
34
+
31
35
if ( savedPosition ) {
32
36
// savedPosition is only available for popstate navigations.
33
- return savedPosition
37
+ return { ... savedPosition , behavior }
34
38
} else {
35
39
let position : ReturnType < ScrollBehavior >
36
40
37
41
// scroll to anchor by returning the selector
38
42
if ( to . hash ) {
39
- position = { selector : decodeURI ( to . hash ) }
43
+ position = { selector : decodeURI ( to . hash ) , offset : { behavior } }
40
44
41
45
// specify offset of the element
42
46
if ( to . hash === '#anchor2' ) {
43
- position . offset = { top : 100 }
47
+ position . offset = { top : 100 , behavior }
44
48
}
45
49
46
50
if ( document . querySelector ( position . selector ) ) {
@@ -56,7 +60,7 @@ const scrollBehavior: ScrollBehavior = async function (
56
60
if ( to . matched . some ( m => m . meta . scrollToTop ) ) {
57
61
// coords will be used if no selector is provided,
58
62
// or if the selector didn't match any element.
59
- return { left : 0 , top : 0 }
63
+ return { left : 0 , top : 0 , behavior }
60
64
}
61
65
62
66
return false
@@ -76,9 +80,12 @@ const router = createRouter({
76
80
77
81
scrollWaiter . add ( )
78
82
83
+ const smoothScroll = ref ( false )
84
+
79
85
const app = createApp ( {
80
86
setup ( ) {
81
87
return {
88
+ smoothScroll,
82
89
hashWithNumber : { path : '/bar' , hash : '#\\31 number' } ,
83
90
flushWaiter : scrollWaiter . flush ,
84
91
setupWaiter : scrollWaiter . add ,
@@ -101,6 +108,9 @@ const app = createApp({
101
108
<li><router-link to="/bar#anchor2">/bar#anchor2</router-link></li>
102
109
<li><router-link :to="hashWithNumber">/bar#1number</router-link></li>
103
110
</ul>
111
+ <label>
112
+ <input type="checkbox" v-model="smoothScroll"> Use smooth scroll
113
+ </label>
104
114
<router-view class="view" v-slot="{ Component, props }">
105
115
<transition
106
116
name="fade"
0 commit comments