Vue Router cho phép kiểm soát scroll behavior khi navigate:
typescript
const router = createRouter({
history: createWebHistory(),
routes,
scrollBehavior(to, from, savedPosition) {
// savedPosition: vị trí scroll trước đó khi dùng browser back/forward
if (savedPosition) {
return savedPosition // Restore khi back/forward
}
// Scroll đến named anchor
if (to.hash) {
return {
el: to.hash,
behavior: 'smooth',
top: 80, // Offset cho fixed header
}
}
// Scroll về đầu trang khi navigate thường
return { top: 0, behavior: 'smooth' }
},
})
// Async scroll — chờ transition xong
scrollBehavior(to, from, savedPosition) {
return new Promise((resolve) => {
setTimeout(() => {
resolve({ top: 0, behavior: 'smooth' })
}, 300) // Chờ page transition 300ms
})
}Dùng savedPosition để implement proper back/forward scroll restoration — trải nghiệm native-like.