Domina la navegación en aplicaciones de una sola página con View Router: desde crear rutas básicas y enlaces con Router Link, hasta manejar rutas dinámicas con parámetros, consumir la API por ID y hacer navegación programática con $router.push. Además, activa history mode para URLs limpias sin hash y mejora la UX con renderizado condicional.
¿Cómo crear rutas y navegar con elementos HTML?
Crear un componente simple y asociarlo a una ruta es el primer paso. Se construye About.vue dentro de Components con solo HTML y se define su ruta en routes.js. Al principio, la navegación por URL funciona con hash, pero la idea es ofrecer enlaces visibles al usuario con Router Link dentro de header.vue.
Crea About.vue con un título Nosotros.
Define la ruta en routes.js y pruébala escribiendo /about en la URL.
Usa Router Link con la propiedad to para enlazar a rutas existentes.
Ajusta paths coherentes: la ruta de búsqueda es '/'.
También puedes pasar un objeto con v-bind:to para usar name en lugar de path.
Ejemplo de rutas en routes.js:
importAboutfrom'@/components/About.vue'exportdefault[{path:'/about',name:'About',component:About},// raíz para buscar{path:'/',name:'search',component:Search}]
Router Link y propiedad to para navegación declarativa.
v-bind y objetos con name para preparar rutas con parámetros.
Coherencia de URLs y nombres de ruta.
¿Cómo construir rutas dinámicas con parámetros y consumir la API?
Para mostrar el detalle de una canción, se crea TrackDetail.vue y una ruta parametrizada. El patrón /track/:id permite cambiar el contenido según el id. Se integra un servicio que obtiene la canción por ID usando un template string de ECMAScript 2015 y se renderiza el componente PM track cuando la data está lista.
Crea la ruta dinámica /track/:id en routes.js.
Importa el componente Track y regístralo como pm-track.
Implementa trackService.getById(id) con template string y .then para devolver la data.
En el hook created, lee this.$route.params.id y consulta la API.
Usa v-if para evitar renderizar hasta que existan track y track.album.
Ajusta el layout con clases de Bulma: container, columns, column.
Ruta parametrizada con /track/:id para contenido dinámico.
this.$route.params para leer parámetros de la URL.
Consumo de API por ID y template strings con backticks.
Renderizado condicional con v-if para evitar errores.
Integración de componentes y layout con Bulma.
¿Cómo navegar programáticamente y activar history mode?
Cuando se necesita cambiar de ruta desde el código, se usa this.$router.push. Es clave diferenciar $route (información de la ruta actual) de $router (control del enrutador). Finalmente, al activar history mode, las URLs se limpian y desaparece el hash; se requiere soporte en el servidor.
Agrega un gatillo UI (por ejemplo, un botón) que invoque goToTrack(id).
Implementa goToTrack con this.$router.push y params dinámicos.
Diferencia $route vs $router: información vs control.
Activa mode: 'history' al crear el router.
Track.vue (método y uso):
<!-- dentro del template -->
<button @click="goToTrack(track.id)">🌐</button>
<script>
export default {
methods: {
goToTrack(id) {
this.$router.push({ name: 'track', params: { id } })
}
}
}
</script>
De echo, Vue tiene un router-link component para hacer este tipo de accion que si es ARIA accesible.
Gracias por el aporte. Es muy importante seguir las practicas de accesibilidad e incluir a todos los posibles usuarios.
A veces para poder mostrar los ejemplos concretos es mas practico omitir cosas por temas de practicidad. Pero es realmente muy bueno que lo aclares.
El componente router-link tambien lo usamos cuando vemos la parte del menu. En este caso la idea era mostrar como podemos navegar las rutas usando código, es por eso que lo hacemos con este patron.
Te felicito por tu vision de ir mas alla, esto es demasiado importante destacar, ya que la mayoria de programadores no les interesa!
Saludos a todos! quiero compartir el proyecto personal que hice como metodo de practica luego de ver el cusro de vue basico y profesional, el objetivo es que sigamos aprendiendo de la mejor manera que es poniendo en practica lo que vemos en las clases.
pueden hacer le fork al proyecto proponer aportes eso seria excelente.
Url en github pages
Url del repo
Muy bueno, gracias por compartir!
Hola @ianaya89, excelente tus clases. Me inspiraron hacer ese proyecto como método de practica para ganar experiencia con vue. Seguiré aprendiendo y compartiendo con la comunidad.
Cuando se instancia el vue-router se obtienen 2 objetos:
$route: la cual contiene información de un ruta especifica como parametros, url, path, etc
$router: sirve para usar las funcionalidades del vue-router, como por ejemplo la navegación programática que vemos en esté capitulo del curso
Les recomiendo separar sus archivos de pagina dentro de una carpeta llamada view ya que este es el estandar que se usa para nombrar este tipo de componentes y poderlos diferenciar de los componentes normales, en este caso esos componentes serian Search, About y TrackDetails
$router -> sirve para navegar programáticamente y acceder a la funcionalidad del router
$route -> tiene información de la ruta especifica
Hola.
Cunado introduzco la linea:
Pm-track(:track=?)
me aparece el siguente error
1|
2| Pm-track(:track=?)
-------------------------------^
3|
Dicendome que no puede compilar por el signo de interrogacion.
Agradeceria ayuda
a mi también me pasó lo mismo, puse el mismo código que richard2701, sólo que no supe ¿por qué pasó? ¿será por la versión?
Estos serían los estilos de Bulma hoy para el navbar
<template lang="pug"> section.hero.is-success
.hero-head
header.navbar.container.navbar-start
.navbar-item
strong 📻 PlatziMusic.navbar-end.navbar-menu
router-link.navbar-item(to="/")Buscar router-link.navbar-item(to="about")Nosotros.hero-body
.container.has-text-centered
h1.titlePlatziMusic h2.subtitleCanciones que están Vue-nísimas! pm-player
</template>
Buenas, tengo entendido que es posible pasar objetos por las rutas del vue-router, como puedo hacer eso?
Lo ideal es que uses Vuex, sin embargo es posible,
Vue-nisima clase @ianaya89 de los mejores cursos que he tomado dentro de esta plataforma, me ha costado un poco de trabajo pero siempre cumpliendo con los retos y siguiendo todas las instrucciones.
Con base en algunos comentarios. Necesito me corrijan.
Es posible arreglar el error de todo SPA (ir hacia atras o hacia adelante) guardando la información dentro de localStorage?.
o existe otra manera
No te recomiendo que uses el localStorage. Te recomiendo que uses mejor vue-router y le des una mirada a la opcion mode.
Acá puedes ver la parte de History mode de VueRouter, es muy sencillo de usar y nada complicado, con esto te ahorras un montón de trabajo al no usar LocalStorage. Puedes buscar más ejemplos con esto claro.
¿hay alguna diferencia entre usar el $route.push y usar un router-link dentro del componente para ir a otra sección? ej: cuando se le da click al componente para ver su detalle
El router link necesita la interaccion del usuario. El $route push sirve para cambiar la ruta de manera programatica.
pero ya no se como es la url para buscar por id de canción, ya lo intente agregango /track/id y nada
Muchas gracias por tu comentario
Buenos tardes, disculpen, alguien sabe si con Vue Route puedo hacer algo con respecto al manejo de metas ? esto para sitios como e-commerce y poder generar un feed o una tarjeta cuando lo compartes por face, whats, skype etc etc
Para uso de Metas y SSR, debes usar Nuxtjs .. no existe ningun framework ni libreria JS que te maneje los metas correctamente sin hacer uso del SSR
yo agregue el plugin de vuetify y en vez de usar clases de bulma utilice v-navigation-drawer de vuetify.
Me gusta que con esto se pueden crear SPA, aunque a mi por alguna razón me sigue mostrando el "#" en la URL...
Eso es un hash el cual se activa en Vue3 llamando al metodo createWebHashHistory y en Vue2, segun lo que lei se activa por defecto aunque cuando yo use vue2 no me aparecia el hash, la razon de este hash es que con el puedes crear links a secciones dentro de la pagina, o lo puedes usar para crear animaciones con el scroll, es muy poderoso ese hash
Yo normalmente hago una carpeta llamada screens o pages y ahí coloco las páginas principales de mi aplicación
Agrego también lo siguiente yaque el profesor usa notaciones mas cortas, también pueden cambiar esas funciones a :
trackService.search = (q) => {}
trackService.getById = (id) => {}
Hola, el API esta muy lenta y en ocasiones no responde nunca, por ende se dificulta o imposibilita seguir el curso.
Hola, estoy moniterando la API y todo pareciera estar funcionando correctamente, de todos modos vamos a ver como podemos mejorar el tiempo de respuesta. Muchas gracias!
Hola Nacho, muy exelente el curso sólo falle una pregunta al dar la prueba y es sobre el funcionamiento de los plugins, al parecer me confundí un poco. Pero aprovecho para felicitarte y agradecerte por el curso. Dios te bendiga.
Este es el código completo de loader.vue agregando un loader