Skip to content
Перевод синхронизирован с документацией от , хэш коммита 960662d.

Метаданные маршрутов

Иногда вам может потребоваться прикрепить произвольную информацию к маршрутам, например: имена переходов анимации или роли пользователей для управления доступом к маршруту и т. д. Это можно сделать с помощью свойства meta, которое принимает объект свойств и может быть доступно на странице маршрута и навигационных хуках. Вы можете определить meta свойства следующим образом:

js
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 полей от родителя к потомку. Это означает, что вы можете просто написать:

js
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
// Этот код может быть напрямую добавлен в любой из ваших файлов `.ts`,
// например `router.ts`
// Он также может быть добавлен в файл `.d.ts`.
// Убедитесь, что он включен в  "файлы" tsconfig.json проекта
import 'vue-router'

// Для того чтобы он рассматривался как модуль,
// добавьте хотя бы один оператор `export`
export {}

declare module 'vue-router' {
  interface RouteMeta {
    // опционально
    isAdmin?: boolean
    // должно быть определено для каждого маршрута
    requiresAuth: boolean
  }
}

Released under the MIT License.