Introducción
Las guardias de navegación en Vue Router son funciones que se ejecutan antes de que una navegación se resuelva. Estas guardias permiten controlar el acceso a las rutas, realizar redirecciones, o ejecutar cualquier lógica antes de que la navegación ocurra. Son esenciales para implementar características como autenticación, autorización y otras verificaciones previas a la carga de una ruta.
Tipos de Guardias de Navegación
Vue Router proporciona varios tipos de guardias de navegación:
- Guardias Globales: Se aplican a todas las rutas.
- Guardias de Ruta: Se aplican a rutas específicas.
- Guardias de Componentes: Se aplican a componentes específicos.
Guardias Globales
Las guardias globales se definen en la instancia del router y se aplican a todas las rutas. Hay tres tipos de guardias globales:
beforeEach
: Se ejecuta antes de que la navegación ocurra.beforeResolve
: Se ejecuta después de que todas las guardias de la ruta y del componente se hayan resuelto.afterEach
: Se ejecuta después de que la navegación haya sido confirmada.
Ejemplo de beforeEach
const router = new VueRouter({ routes: [ { path: '/home', component: Home }, { path: '/about', component: About } ] }); router.beforeEach((to, from, next) => { console.log('Navegando a:', to.path); next(); // Permite la navegación });
Guardias de Ruta
Las guardias de ruta se definen directamente en las rutas y se aplican solo a esas rutas específicas. Hay dos tipos principales:
beforeEnter
: Se ejecuta antes de que la navegación a la ruta ocurra.
Ejemplo de beforeEnter
const router = new VueRouter({ routes: [ { path: '/dashboard', component: Dashboard, beforeEnter: (to, from, next) => { if (isAuthenticated()) { next(); // Permite la navegación } else { next('/login'); // Redirige a la página de login } } } ] });
Guardias de Componentes
Las guardias de componentes se definen dentro de los componentes y se aplican solo cuando el componente está siendo cargado. Hay tres tipos principales:
beforeRouteEnter
: Se ejecuta antes de que la navegación a la ruta ocurra.beforeRouteUpdate
: Se ejecuta cuando la ruta actualizada reutiliza el componente.beforeRouteLeave
: Se ejecuta antes de que la navegación desde la ruta ocurra.
Ejemplo de beforeRouteEnter
const User = { template: '<div>User {{ id }}</div>', data() { return { id: null }; }, beforeRouteEnter(to, from, next) { // Llamar a next con una función para acceder a la instancia del componente next(vm => { vm.id = to.params.id; }); } };
Ejercicio Práctico
Ejercicio 1: Implementar una Guardia de Autenticación
Objetivo: Crear una guardia de navegación global que redirija a los usuarios no autenticados a una página de login.
- Configura el router con las rutas
/home
,/dashboard
, y/login
. - Implementa una guardia global
beforeEach
que verifique si el usuario está autenticado. - Redirige a
/login
si el usuario no está autenticado y trata de acceder a/dashboard
.
Solución
const isAuthenticated = () => { // Simulación de autenticación return localStorage.getItem('auth') === 'true'; }; const router = new VueRouter({ routes: [ { path: '/home', component: Home }, { path: '/dashboard', component: Dashboard }, { path: '/login', component: Login } ] }); router.beforeEach((to, from, next) => { if (to.path === '/dashboard' && !isAuthenticated()) { next('/login'); // Redirige a la página de login } else { next(); // Permite la navegación } });
Ejercicio 2: Implementar una Guardia de Ruta
Objetivo: Crear una guardia de ruta que solo permita el acceso a /admin
si el usuario tiene el rol de administrador.
- Configura el router con las rutas
/home
,/admin
, y/login
. - Implementa una guardia de ruta
beforeEnter
en la ruta/admin
. - Redirige a
/login
si el usuario no tiene el rol de administrador.
Solución
const isAdmin = () => { // Simulación de verificación de rol return localStorage.getItem('role') === 'admin'; }; const router = new VueRouter({ routes: [ { path: '/home', component: Home }, { path: '/admin', component: Admin, beforeEnter: (to, from, next) => { if (isAdmin()) { next(); // Permite la navegación } else { next('/login'); // Redirige a la página de login } }}, { path: '/login', component: Login } ] });
Conclusión
Las guardias de navegación en Vue Router son una herramienta poderosa para controlar el flujo de navegación en tu aplicación. Permiten implementar lógica de autenticación, autorización y otras verificaciones antes de que una ruta se cargue. Con los ejemplos y ejercicios proporcionados, deberías tener una comprensión sólida de cómo utilizar las guardias de navegación en tus proyectos Vue.js.
En el próximo módulo, exploraremos cómo gestionar el estado de la aplicación utilizando Vuex, lo que te permitirá manejar datos de manera más eficiente y estructurada.
Curso de Vue.js
Módulo 1: Introducción a Vue.js
- ¿Qué es Vue.js?
- Configuración del Entorno de Desarrollo
- Creando Tu Primera Aplicación Vue
- Entendiendo la Instancia de Vue
Módulo 2: Conceptos Básicos de Vue.js
- Sintaxis de Plantillas
- Vinculación de Datos
- Propiedades Computadas y Observadores
- Vinculación de Clases y Estilos
- Renderizado Condicional
- Renderizado de Listas
Módulo 3: Componentes de Vue.js
- Introducción a los Componentes
- Props y Eventos Personalizados
- Slots
- Componentes Dinámicos y Asíncronos
- Comunicación entre Componentes
Módulo 4: Vue Router
- Introducción a Vue Router
- Configuración de Vue Router
- Rutas Dinámicas
- Rutas Anidadas
- Guardias de Navegación
Módulo 5: Gestión de Estado con Vuex
- Introducción a Vuex
- Estado, Getters, Mutaciones y Acciones
- Módulos en Vuex
- Usando Vuex en Componentes
- Patrones Avanzados de Vuex
Módulo 6: Directivas de Vue.js
Módulo 7: Plugins de Vue.js
Módulo 8: Pruebas en Vue.js
- Pruebas Unitarias con Vue Test Utils
- Pruebas de Extremo a Extremo con Cypress
- Simulación de Dependencias
Módulo 9: Conceptos Avanzados de Vue.js
- Funciones de Renderizado y JSX
- Renderizado del Lado del Servidor (SSR) con Nuxt.js
- API de Composición de Vue 3
- Optimización del Rendimiento
Módulo 10: Construcción y Despliegue de Aplicaciones Vue.js
- Construcción para Producción
- Despliegue de Aplicaciones Vue.js
- Integración y Despliegue Continuos (CI/CD)