Campos de Meta da Rota
Algumas vezes, podes querer anexar informações arbitrárias às rotas como: nomes de transições, ou rótulos para controlar quem pode acessar a rota, etc. Isto pode ser alcançado através da propriedade meta
que aceita um objeto de propriedades e pode ser acessado na localização da rota e nas guardas da navegação. Tu podes definir as propriedades de meta
tais como:
const routes = [
{
path: '/posts',
component: PostsLayout,
children: [
{
path: 'new',
component: PostsNew,
// apenas utilizadores autenticados podem fazer publicações
meta: { requiresAuth: true }
},
{
path: ':id',
component: PostsDetail,
// qualquer um pode ler uma publicação
meta: { requiresAuth: false }
}
]
}
]
const routes = [
{
path: '/posts',
component: PostsLayout,
children: [
{
path: 'new',
component: PostsNew,
// apenas utilizadores autenticados podem fazer publicações
meta: { requiresAuth: true }
},
{
path: ':id',
component: PostsDetail,
// qualquer um pode ler uma publicação
meta: { requiresAuth: false }
}
]
}
]
Então como acessamos este campo meta
?
Primeiro, cada objeto de rota na configuração de routes
é chamado de um registo de rota. Os registos de rota podem ser encaixados. Portanto quando uma rota é correspondida, ela pode potencialmente corresponder mais do que um registo de rota.
Por exemplo, com a configuração de rota acima, a URL /posts/new
corresponderá ambos registo de rota pai (path: '/posts'
) e o registo de rota filha (path: 'new'
).
Todos registos de rota correspondidos por uma rota são expostos sobre o objeto $route
(e igualmente os objetos de rota nas guardas da navegação) como o arranjo $route.matched
. Nós poderíamos percorrer este arranjo para verificar todos campos meta
, porém a Vue Router também fornece-te um $route.meta
que é uma combinação não recursiva de todos campos meta
desde o pai ao filho. Quer dizer que podes simplesmente escrever:
router.beforeEach((to, from) => {
// no lugar de ter que verificar cada registo de rota com
// to.matched.some(record => record.meta.requiresAuth)
if (to.meta.requiresAuth && !auth.isLoggedIn()) {
// esta rota exige autenticação, verifica se está iniciado
// se não, redireciona para página de inicialização `login`
return {
path: '/login',
// guarde a localização de onde estávamos para voltarmos mais tarde
query: { redirect: to.fullPath },
}
}
})
router.beforeEach((to, from) => {
// no lugar de ter que verificar cada registo de rota com
// to.matched.some(record => record.meta.requiresAuth)
if (to.meta.requiresAuth && !auth.isLoggedIn()) {
// esta rota exige autenticação, verifica se está iniciado
// se não, redireciona para página de inicialização `login`
return {
path: '/login',
// guarde a localização de onde estávamos para voltarmos mais tarde
query: { redirect: to.fullPath },
}
}
})
TypeScript
É possível definir tipo para o campo meta
pela extensão da interface RouteMeta
da vue-router
:
// Isto pode ser diretamente adicionado para todos os teus ficheiros `.ts` como `router.ts`
// Ele pode também ser adicionado para um ficheiro `.d.ts`,
// no qual caso precisas adicionar uma exportação
// para garantir que ele está a ser tratado como um módulo
export {}
import 'vue-router'
declare module 'vue-router' {
interface RouteMeta {
// é opcional
isAdmin?: boolean
// deve ser declarado por cada rota
requiresAuth: boolean
}
}
// Isto pode ser diretamente adicionado para todos os teus ficheiros `.ts` como `router.ts`
// Ele pode também ser adicionado para um ficheiro `.d.ts`,
// no qual caso precisas adicionar uma exportação
// para garantir que ele está a ser tratado como um módulo
export {}
import 'vue-router'
declare module 'vue-router' {
interface RouteMeta {
// é opcional
isAdmin?: boolean
// deve ser declarado por cada rota
requiresAuth: boolean
}
}