Метаданные маршрутов
Иногда вам может потребоваться прикрепить произвольную информацию к маршрутам, например: имена переходов анимации или роли пользователей для управления доступом к маршруту и т. д. Это можно сделать с помощью свойства meta, которое принимает объект свойств и может быть доступно на странице маршрута и навигационных хуках. Вы можете определить meta свойства следующим образом:
const routes = [
{
path: '/posts',
component: PostsLayout,
children: [
{
path: 'new',
component: PostsNew,
// только авторизованные пользователи могут создавать сообщения
meta: { requiresAuth: true },
},
{
path: ':id',
component: PostsDetail,
// кто угодно может прочитать сообщение
meta: { requiresAuth: false },
},
],
},
]Как же получить доступ к этому meta полю?
Во-первых, каждый объект маршрута в конфигурации routes называется записью маршрута. Записи маршрутов могут быть вложенными. Поэтому при сопоставлении маршрута он может соответствовать более чем одной записи маршрута.
Например, в приведенной выше конфигурации маршрута URL /posts/new будет соответствовать как родительской записи маршрута (path: '/posts'), так и дочерней записи (path: 'new').
Все совпавшие записи маршрутов оказываются доступны в объекте route (а также через объекты маршрутов в навигационных хуках) как массив route.matched. Таким образом, для проверки метаданных в записях маршрутов нам понадобится обойти route.matched в цикле, но Vue Router также предоставляет объект route.meta, который представляет собой не рекурсивное объединение всех meta полей от родителя к потомку. Это означает, что вы можете просто написать:
router.beforeEach((to, from) => {
// вместо того, чтобы проверять каждую запись маршрута с помощью
// to.matched.some(record => record.meta.requiresAuth)
if (to.meta.requiresAuth && !auth.isLoggedIn()) {
// данный маршрут требует авторизации, проверяем,
// вошел ли пользователь в систему
// если нет, то перенаправляем на страницу входа.
return {
path: '/login',
// сохранить адрес, в котором мы находились,
// чтобы вернуться к нему позже
query: { redirect: to.fullPath },
}
}
})TypeScript
Чтобы типизировать meta поля, необходимо расширить интерфейс RouteMeta из vue-router:
// Этот код может быть напрямую добавлен в любой из ваших файлов `.ts`,
// например `router.ts`
// Он также может быть добавлен в файл `.d.ts`.
// Убедитесь, что он включен в "файлы" tsconfig.json проекта
import 'vue-router'
// Для того чтобы он рассматривался как модуль,
// добавьте хотя бы один оператор `export`
export {}
declare module 'vue-router' {
interface RouteMeta {
// опционально
isAdmin?: boolean
// должно быть определено для каждого маршрута
requiresAuth: boolean
}
}