При использовании Composition API для работы с маршрутизатором Vue
Router главным инструментом становятся специальные хуки, предоставляемые
библиотекой. Наиболее важные из них — useRouter и
useRoute.
useRouter возвращает объект
маршрутизатора, который позволяет программно менять маршрут, добавлять
навигационные действия и получать доступ к глобальным методам
маршрутизатора.useRoute предоставляет реактивный
объект текущего маршрута, содержащий параметры, query-параметры, имя
маршрута и путь.Пример использования в компоненте:
import { defineComponent } from 'vue';
import { useRouter, useRoute } from 'vue-router';
export default defineComponent({
setup() {
const router = useRouter();
const route = useRoute();
const navigateToProfile = () => {
router.push({ name: 'Profile', params: { userId: 123 } });
};
return {
route,
navigateToProfile
};
}
});
В этом примере route автоматически реагирует на
изменения текущего маршрута, что позволяет отслеживать динамические
параметры без использования жизненных циклов компонентов Options
API.
Параметры маршрута доступны через объект route.params.
Они являются реактивными, поэтому изменения маршрута автоматически
отражаются в компоненте.
Пример:
import { computed } from 'vue';
import { useRoute } from 'vue-router';
export default {
setup() {
const route = useRoute();
const userId = computed(() => route.params.userId);
return { userId };
}
};
Особенности работы с query-параметрами:
Query-параметры можно получать через route.query,
который также реактивен. Это позволяет создавать динамические фильтры,
сортировку и поисковые запросы без перезагрузки страницы.
const searchQuery = computed(() => route.query.search || '');
useRouter предоставляет методы для программной
навигации:
router.push(location) — добавляет
новый маршрут в историю.router.replace(location) — заменяет
текущий маршрут.router.go(n) — перемещается на n шагов
в истории браузера.Метод location может принимать строку или объект с
ключами: name, path, params,
query.
router.push({ name: 'Dashboard', query: { filter: 'active' } });
Vue Router позволяет использовать глобальные, локальные и
компонентные охранники. В Composition API часто применяются
компонентные охранники через функции жизненного цикла
onBeforeRouteEnter, onBeforeRouteUpdate и
onBeforeRouteLeave.
import { onBeforeRouteUpdate } from 'vue-router';
export default {
setup() {
onBeforeRouteUpdate((to, from) => {
console.log(`Переход с ${from.fullPath} на ${to.fullPath}`);
});
}
};
onBeforeRouteEnter вызывается перед
входом в маршрут, но без доступа к this. Доступ к
компоненту можно получить через callback.onBeforeRouteUpdate срабатывает при
изменении текущего маршрута, если компонент повторно используется.onBeforeRouteLeave позволяет прервать
навигацию, например, при наличии несохранённых данных.Для маршрутов с динамическими параметрами используется синтаксис
:paramName в конфигурации маршрута:
const routes = [
{
path: '/users/:id',
name: 'UserProfile',
component: () => import('./components/UserProfile.vue')
}
];
Использование import() обеспечивает ленивую
загрузку компонентов, что сокращает первоначальный размер
бандла и ускоряет загрузку приложения.
В Composition API вложенные маршруты организуются через свойство
children в конфигурации маршрута:
const routes = [
{
path: '/dashboard',
component: DashboardLayout,
children: [
{ path: '', component: Overview },
{ path: 'stats', component: Stats },
{ path: 'settings', component: Settings }
]
}
];
Компонент рендерит активный дочерний
маршрут. Для вложенных можно
использовать атрибут name для множественных
представлений.
С помощью Composition API удобно создавать реактивные наблюдатели для параметров маршрута и query:
import { watch } from 'vue';
import { useRoute } from 'vue-router';
export default {
setup() {
const route = useRoute();
watch(
() => route.params.id,
(newId, oldId) => {
console.log(`ID изменился с ${oldId} на ${newId}`);
}
);
}
};
Это позволяет автоматически подгружать данные при изменении URL без пересоздания компонента.
Интеграция с Composition API упрощает навигацию по событиям интерфейса. Например, для кнопки:
setup() {
const router = useRouter();
const goHome = () => router.push({ name: 'Home' });
return { goHome };
}
Такой подход полностью исключает зависимость от Options API и сохраняет реактивность Vue.