Guardas de Navegação no Vue Router: Globais, de Rota e de Componente

Guardas de Navegação Globais

No Vue Router, guardas de navegação globais são hooks que interceptam todas as transições de rota. O router.beforeEach é usado antes de a navegação ser confirmada.

Os parâmetros da função de retorno incluem to (rota de destino), from (rota de origem) e next (uma função para controlar a continuação). Para ilustrar, configure um guarda global em um aplicativo Vue para verificar autenticação.

import VueRouter from 'vue-router';

const rotas = [
  { path: '/home', component: HomeComponent },
  { path: '/perfil', component: ProfileComponent, meta: { requerAuth: true } }
];

const roteador = new VueRouter({ routes: rotas });

roteador.beforeEach((para, de, proximo) => {
  const rotasPublicas = ['/home'];
  if (rotasPublicas.includes(para.path) || localStorage.getItem('token')) {
    proximo();
  } else {
    alert('Autenticação necessária. Redirecionando para login.');
    proximo('/login');
  }
});

O hook global router.afterEach é acionado após cada navegação e não requer uma chamada a next.

roteador.afterEach((para, de) => {
  console.log(`Navegou de ${de.path} para ${para.path}`);
});

Para verificações baseadas em estado, como Vuex, você pode acessar store.getters.estaAutenticado dentro do guarda.

Guardas Dentro do Componente

Componantes Vue podem ter guardas de navegação específicos. O beforeRouteEnter é chamado entes de o componente ser inserido no DOM, acessando instâncias via callback.

<script>
export default {
  data() {
    return {
      usuario: 'Carlos'
    };
  },
  beforeRouteEnter(para, de, proximo) {
    proximo(instancia => {
      alert('Bem-vindo, ' + instancia.usuario);
    });
  }
};
</script>

O beforeRouteLeave é útil para confirmar ações do usuário antes de sair da rota.

export default {
  beforeRouteLeave(para, de, proximo) {
    const confirmacao = confirm('Tem certeza que deseja sair?');
    if (confirmacao) {
      proximo();
    } else {
      proximo(false);
    }
  }
};

Guardas Específicos de Rota

Guardas de navegação podem ser definidos diretamente na configuração da rota usando beforeEnter. Eles seguem a mesma sintaxe dos guardas globais, mas afetam apenas rotas definidas.

const rotas = [
  {
    path: '/admin',
    component: AdminComponent,
    beforeEnter(para, de, proximo) {
      if (localStorage.getItem('adminAccess')) {
        proximo();
      } else {
        alert('Acesso restrito.');
        proximo('/home');
      }
    }
  }
];

Tags: vue vue-router navigation-guards guards javascript

Publicado em 7-17 03:20