Las rutas dinámicas son rutas que pueden cambiar en función de ciertos parámetros o valores.
Esto nos permite mostrar contenido construir rutas que pueden adaptarse a diferentes contenidos o datos (como perfiles de usuario, detalles de productos)
Es decir, en vez de definir una ruta fija como /user
, podemos definir una ruta dinámica como /user/:id
, donde :id
es un parámetro que puede tomar cualquier valor.
Definición de parámetros en rutas
En Vue Router, los parámetros de ruta se definen utilizando el prefijo :
seguido del nombre del parámetro. Por ejemplo:
{ path: '/producto/:productoId', component: ProductDetails }
Aquí,
:productoId
es un parámetro dinámico que puede tomar cualquier valor.- Cuando un usuario accede a una ruta como
/producto/123
, el valor123
se asignará al parámetroproductoId
.
Parámetros múltiples
También es posible definir rutas con múltiples parámetros. Por ejemplo:
{ path: '/category/:categoryId/product/:productId', component: ProductDetail }
En este caso, la ruta /category/5/product/10
asignará 5
a categoryId
y 10
a productId
.
Parámetros opcionales
A veces, es útil definir parámetros que no son obligatorios. Para ello, podemos utilizar el símbolo ?
después del nombre del parámetro. Por ejemplo:
{ path: '/user/:userId?', component: UserProfile }
En este caso, la ruta /user
también será válida, y el parámetro userId
será undefined
.
Rutas anidadas
Las rutas dinámicas también pueden combinarse con rutas anidadas para crear estructuras más complejas. Por ejemplo:
const routes = [
{
path: '/user/:userId',
component: UserLayout,
children: [
{ path: 'profile', component: UserProfile },
{ path: 'settings', component: UserSettings }
]
}
];
En este caso, las rutas /user/1/profile
y /user/1/settings
estarán disponibles dentro del layout UserLayout
.
Acceso a parámetros en componentes
Una vez que hemos definido una ruta dinámica, necesitamos acceder a los parámetros en nuestro componente para poder mostrar el contenido correspondiente.
Vue Router proporciona dos formas principales de acceder a los parámetros, en función de que estemos usando Composition API, o Options API.
En la Composition API, utilizamos la función useRoute()
para acceder a los parámetros de ruta:
import { useRoute } from 'vue-router';
export default {
setup() {
const route = useRoute();
const userId = route.params.userId;
console.log(`User ID: ${userId}`);
// Aquí podríamos hacer una llamada a una API para obtener los datos del usuario
}
};
En la Options API, podemos acceder a los parámetros de ruta a través de this.$route.params
. Por ejemplo:
export default {
name: 'UserProfile',
created() {
const userId = this.$route.params.userId;
console.log(`User ID: ${userId}`);
// Aquí podríamos hacer una llamada a una API para obtener los datos del usuario
}
};
Reactividad de los parámetros
Los parámetros de ruta son reactivos. Es decir, significa que si el valor de un parámetro cambia (por ejemplo, al navegar de /user/1
a /user/2
), el componente se actualizará automáticamente.
Si necesitas realizar una acción específica cuando cambia un parámetro, puedes usar un watch
en el parámetro:
<script setup>
import { watch } from 'vue';
import { useRoute } from 'vue-router';
const route = useRoute();
watch(() => route.params.userId, newUserId => {
console.log(`User ID changed to: ${newUserId}`);
// Llamada a la API para obtener los nuevos datos del usuario
});
</script>
Validación de parámetros
En algunos casos, es útil validar los parámetros de ruta para asegurarnos de que cumplen ciertos criterios antes de renderizar el componente.
Vue Router permite definir validadores de ruta utilizando la propiedad props
.
Por ejemplo, supongamos que queremos asegurarnos de que el parámetro userId
sea un número:
const routes = [
{
path: '/user/:userId',
component: UserProfile,
props: (route) => ({
userId: Number(route.params.userId) || 0
})
}
];
En este ejemplo, si el parámetro userId
no es un número, se asignará el valor 0
por defecto.
Ejemplos prácticos
Perfil de usuario
Supongamos que estamos construyendo una aplicación de redes sociales. Podemos definir una ruta dinámica para los perfiles de usuario:
const routes = [
{ path: '/profile/:username', component: UserProfile }
];
En el componente UserProfile
, accedemos al parámetro username
para cargar los datos del usuario:
export default {
setup() {
const route = useRoute();
const username = route.params.username;
// Llamada a la API para obtener los datos del usuario
}
};
Detalles de producto
En una tienda en línea, podemos definir una ruta dinámica para los detalles de los productos:
const routes = [
{ path: '/product/:productId', component: ProductDetail }
];
En el componente ProductDetail
, accedemos al parámetro productId
para cargar los detalles del producto:
export default {
setup() {
const route = useRoute();
const productId = route.params.productId;
// Llamada a la API para obtener los detalles del producto
}
};