Программная навигация — это возможность управлять маршрутизацией приложения через код, а не через ссылки в шаблоне. В Vue.js она реализуется с помощью Vue Router, официального маршрутизатора для Vue. Этот инструмент позволяет динамически изменять состояние маршрутов, передавать параметры и управлять переходами между страницами без перезагрузки.
router.pushМетод router.push используется для перехода на указанный
маршрут. Он принимает объект или строку. Основные варианты
использования:
// Переход по имени маршрута
this.$router.push({ name: 'home' });
// Переход с параметрами
this.$router.push({ name: 'user', params: { id: 123 } });
// Переход по пути
this.$router.push('/about');
Особенности:
params
можно использовать только при указании name маршрута.this.$router.push({ name: 'user', params: { id: 123 } })
.then(() => console.log('Навигация успешна'))
.catch(err => console.error(err));
router.replaceМетод router.replace аналогичен push, но не
добавляет новый элемент в историю браузера. Это полезно для ситуаций,
когда не требуется возвращаться на предыдущий маршрут.
this.$router.replace({ name: 'login' });
Использование replace удобно для редиректов после
авторизации или завершения формы.
Можно передавать объект state через
router.push и router.replace, что позволяет
сохранять данные между маршрутами без использования глобального
состояния или Vuex.
this.$router.push({ name: 'dashboard', state: { from: 'login' } });
Доступ к state осуществляется через
history.state:
console.log(window.history.state);
Query-параметры позволяют передавать данные через URL:
this.$router.push({ path: '/search', query: { q: 'vue' } });
В компоненте они доступны через объект
this.$route.query:
console.log(this.$route.query.q); // "vue"
Использование query удобно для фильтров, поиска и других динамических данных.
Vue Router предоставляет глобальные и локальные охранники, которые позволяют контролировать переходы между маршрутами. Программная навигация может быть заблокирована с их помощью.
Пример глобального охранника:
router.beforeEach((to, from, next) => {
if (to.name === 'dashboard' && !isLoggedIn()) {
next({ name: 'login' });
} else {
next();
}
});
Локальный охранник в компоненте:
export default {
beforeRouteEnter(to, from, next) {
if (!isAuthorized()) {
next({ name: 'login' });
} else {
next();
}
}
};
Эти механизмы позволяют реализовывать авторизацию, контроль доступа и проверку данных перед переходом.
При переходе между маршрутами можно управлять положением прокрутки страницы:
const router = new VueRouter({
routes,
scrollBehavior(to, from, savedPosition) {
if (savedPosition) {
return savedPosition;
} else {
return { x: 0, y: 0 };
}
}
});
Программная навигация сохраняет состояние скролла при возврате на предыдущую страницу и позволяет создавать плавный пользовательский опыт.
Методы push и replace поддерживают
асинхронные операции. Например, можно дождаться загрузки данных перед
переходом:
async function goToProfile(id) {
const exists = await checkUserExists(id);
if (exists) {
router.push({ name: 'profile', params: { id } });
} else {
router.push({ name: 'notfound' });
}
}
Это обеспечивает гибкую обработку логики переходов и минимизирует вероятность ошибок при навигации.
Программная навигация может вызывать ошибки, особенно при попытке
перехода на текущий маршрут. Для их обработки используется блок
catch:
router.push({ name: 'home' })
.catch(err => {
if (err.name !== 'NavigationDuplicated') {
console.error(err);
}
});
Ошибка NavigationDuplicated возникает при повторном
переходе на текущий маршрут и не требует реакции со стороны
приложения.
router.push и router.replace позволяют
управлять маршрутами через код.params дают гибкость в передаче
данных.Программная навигация во Vue.js формирует основу динамических одностраничных приложений, обеспечивая полный контроль над переходами и состоянием маршрутов.