Функция scrollBehavior в Vue Router отвечает за
управление положением прокрутки при навигации между маршрутами. Она
позволяет задавать, где на странице пользователь окажется после перехода
на новый маршрут: в начале страницы, в сохранённой позиции или в
произвольном месте. Это особенно важно для одностраничных приложений
(SPA), где переход между компонентами не вызывает полной перезагрузки
страницы.
Функция задаётся при создании экземпляра маршрутизатора в объекте конфигурации:
import { createRouter, createWebHistory } from 'vue-router'
import Home from './components/Home.vue'
import About from './components/About.vue'
const routes = [
{ path: '/', component: Home },
{ path: '/about', component: About }
]
const router = createRouter({
history: createWebHistory(),
routes,
scrollBehavior(to, from, savedPosition) {
// логика прокрутки
}
})
export default router
Параметры функции:
to — объект маршрута, на который происходит
переход.from — объект маршрута, с которого осуществляется
переход.savedPosition — объект с координатами прокрутки, если
навигация инициирована кнопками назад/вперёд браузера.Функция scrollBehavior должна возвращать объект с
координатами прокрутки или false:
return { left: 0, top: 0 } // переместить в начало страницы
return { selector: '#elementId' } // прокрутить к конкретному элементу
return false // оставить прокрутку на текущем месте
Ключевые моменты:
left — горизонтальная координата прокрутки.top — вертикальная координата прокрутки.selector — CSS-селектор элемента, к которому нужно
прокрутить страницу.behavior — опциональный параметр, задающий плавность
прокрутки ('smooth' или 'auto').savedPositionПри навигации с помощью кнопок браузера savedPosition
содержит координаты предыдущей позиции прокрутки:
scrollBehavior(to, from, savedPosition) {
if (savedPosition) {
return savedPosition
} else {
return { top: 0 }
}
}
Это обеспечивает привычное поведение для пользователя: при возврате на предыдущую страницу он оказывается там же, где был.
Можно автоматически перемещать пользователя к определённой секции страницы:
scrollBehavior(to) {
if (to.hash) {
return { selector: to.hash, beh * avior: 'smooth' }
} else {
return { top: 0 }
}
}
to.hash содержит фрагмент URL, например
#section1.beh * avior: 'smooth'.Функция scrollBehavior может возвращать промис, что
позволяет выполнять прокрутку после завершения анимаций или асинхронных
операций:
scrollBehavior(to, from, savedPosition) {
return new Promise(resolve => {
setTimeout(() => {
resolve(savedPosition || { top: 0 })
}, 300)
})
}
Это полезно, когда контент страницы загружается динамически и высота элементов меняется после рендера.
savedPosition для навигации
назад/вперёд. Это обеспечивает привычное поведение для
пользователей.beh * avior: 'smooth' делает переходы более приятными.Прокрутка к верхней части страницы при переходе на новый маршрут:
scrollBehavior() {
return { top: 0 }
}
Сохранение позиции при возврате на предыдущую страницу:
scrollBehavior(to, from, savedPosition) {
return savedPosition || { top: 0 }
}
Плавная прокрутка к якорю на странице:
scrollBehavior(to) {
if (to.hash) {
return { selector: to.hash, beh * avior: 'smooth' }
}
return { top: 0 }
}
Асинхронная прокрутка после загрузки контента:
scrollBehavior(to, from, savedPosition) {
return new Promise(resolve => {
fetchData().then(() => {
resolve(savedPosition || { top: 0 })
})
})
}
Функция scrollBehavior является мощным инструментом для
управления пользовательским опытом навигации в SPA, позволяя задавать
гибкие правила прокрутки и обеспечивая согласованное поведение на всех
маршрутах.