Navegación con rutas en Vuejs
Este es el segundo tutorial de la serie Fundamentos puros y duros de Vuejs donde aprenderemos a utilizar rutas para navegar entre las vistas de nuestro proyecto Vue. Si tienes experiencia en el desarrollo web, está de más recordar la importancia del manejo de rutas en un proyecto web ya que gracias a ellas sucede la magia de un SPA (Single page application), una página web con muchas vistas que no necesita recargarse al cambiar de vistas. Así que te animo a terminar este tutorial donde al fin aprenderá a hacer un Single Page Application (SPA) en toda su regla.
Índice
- Instalando y usando Router
- Rutas con parámetros
- Utilizando el click para ir a una ruta
- Tu turno
- El código
1. Instalando y usando Router
Para crear un proyecto usando rutas debemos utilizar la herramienta Router que podemos instalar desde el CLI de Vue. Así que al momento de escoger las herramientas que tendrá nuestro proyecto también debemos seleccionar Router
y en la siguiente pantalla de configuración del CLI escogeremos usar el History mode, a groso modo, esto nos permitirá cambiar de ruta sin necesidad de que la página recargue cada vez que lo haga.
Si utilizamos la terminal para crear nuestro proyecto Si utilizamos Vue ui para crear nuestro proyecto
Y si es que ya tienes un proyecto pero este no tiene instalado vue router
lo único que debes hacer es utilizar el siguiente comando para instalarlo.
vue add router
Utilizar esa configuración o el comando que mostramos en la linea anterior creará una carpeta llamada router
en el cual se encontrará el archivo index.js
donde declararemos las rutas que queremos en nuestro proyecto. También agregará el código necesario en el archivo main.js
para que las rutas puedan funcionar correctamente. Antes de continuar expliquemos un poco el código que hay en el archivo router/index.js
.
// 💬 Importamos Vue
import Vue from "vue";
// 💬 Importamos la librería de router
import VueRouter from "vue-router";
// 💬 Importamos la primera vista desde la carpeta views
import Home from "../views/Home.vue";
// 💬 Le indicamos a Vue que utilice VueRouter
Vue.use(VueRouter);
// 💬 Definimos las rutas, en este ejemplo solo tenemos dos rutas Home y About
const routes = [
{
path: "/",
name: "Home",
component: Home,
},
// 💬 Esta segunda ruta que tenemos como ejemplo importa su componente de manera directa
// para esto utiliza un arrow function y usa el método import()
{
path: "/about",
name: "About",
// route level code-splitting
// this generates a separate chunk (about.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () =>
import(/* webpackChunkName: "about" */ "../views/About.vue"),
// Este es solo otra forma de importar las rutas en nuestro proyecto
},
];
// 💬 Aquí instanciamos VueRouter utilizando las rutas que definimos anteriormente en el objeto routes
// Recuerda que si la propiedad tiene el mismo nombre que su valor ( routes: routes )
// podemos abreviar colocando simplemente routes
const router = new VueRouter({
mode: "history",
base: process.env.BASE_URL,
// esto es igual que routes : routes
routes,
});
// 💬 Exponemos la instancia de VueRouter que creamos
export default router;
<template>
<div class="home">
<h2>Hola mundo</h2>
</div>
</template>
Otro punto importante al trabajar con rutas es el lugar donde nuestras vistas se renderizarán. Para este objetivo vue nos proporciona una etiqueta especial llamada <router-view/>
. Así que, esta etiqueta debe estar ubicada en el lugar donde queremos que se rendericen las vistas. Por otro lado, para crear los botones del menú de navegación entre rutas también tenemos una etiqueta especial llamada <router-link>
en cuyo atributo to
debemos colocar la ruta de nuestro View.
Un buen uso de estas dos etiquetas sería crear un menú de navegación y en la parte inferior colocar la etiqueta donde se renderizará cada vista al cambiar de rutas mediante el menú de navegación. Veamos el siguiente ejemplo.
<div>
<div id="nav">
<router-link to="/">Home</router-link> |
<router-link to="/about">About</router-link>
</div>
<router-view />
</div>
Vue también nos proporciona una forma de cambiar el estilo a estas etiquetas cuando la ruta a la que apuntan están activas. El selector CSS que nos brinda Vue es a.router-link-exact-active
que para que funcione correctamente se debe colocar dentro de alguna etiqueta, generalmente div, que tenga un id. Como en el siguiente ejemplo dondo el id que contiene a las etiquetas <router-link>
es #nav
.
#nav a.router-link-exact-active {
color: #42b983;
}
Listo!! ya somos capaces de crear rutas para navegar entre las vistas de nuestro proyecto.
2. Rutas con parámetros
Las rutas con parámetros también son muy usadas y se usan para enviar información hacia alguna ruta especifica de tal manera que ese parámetros se recupere en la vista y podamos realizar alguna acción como buscar información con dicho parámetro.
Para crear este tipo de rutas en router/index.js
nuestra nueva ruta debe tener la siguiente forma. Donde id
es el nombre del parámetro que se enviará a esa vista.
{
path: '/foto/:id',
name: 'fotos',
component: Fotos
}
Ahora para obtener el parámetro que fue enviado por la ruta solo debemos usamos el siguiente código dentro de nuestra vista.
<h1>Id: {{$route.params.id}}</h1>
Ya sabemos como definir nuestras rutas con parámetros y también como obtener el parámetro que enviamos. Ahora la pregunta que nos queda es ¿Cómo accionar esa ruta y enviar parámetros por ahí? 🤔.
Para esto tenemos dos casos. El primer caso es enviar parámetros estáticos. Como en el siguiente ejemplo, donde abrimos la ruta services
y enviando el parámetro 5
.
<router-link to="/service/5">Click me</router-link>
Esto es poco útil ya que si tenemos una ruta con parámetros lo adecuado sería enviar por su parámetro alguna variable que tengamos almacenada o que se genera dinámicamente.
El segundo caso es justamente eso, colocar variables al parámetro que deseamos enviar. Para esto debemos usar :to
y {}
para poder utilizar variables en su interior. Sin embargo, este parámetro debe ser enviado como en el siguiente ejemplo. Donde name
es el nombre de la ruta y params
es un objeto que contiene los parámetros que se van a enviar.
<router-link
:to="{name: 'service', params: {id: codigo}}"
class="btn btn-block bg-warning"
>
Go to {{codigo}}
</router-link>
3. Utilizando el click para ir a una ruta
Para dirigirnos a una ruta especifica no solo tenemos a la etiqueta router-link
también podemos hacerlo desde un botón o cualquier otra etiqueta gracias al evento @click
. Para esto primero debemos crear el método que se ejecutará al hacer click. Dentro de este método utilizaremos this.$router.push()
para dirigirnos hacia alguna ruta.
<script>
export default {
name: 'Service',
methods: {
// 💬 Este esl el método que se ejecutará al click
home(){
// 💬 En este caso nos dirigimos a la ruta raiz
this.$router.push('/')
}
}
};
</script>
Además vue también nos proporciona una forma de ir hacia atrás o hacia adelante en el tiempo de navegación, como los botones de atrás y adelante del navegador. Para esto solo usamos los métodos $router.go(-1)
y $router.go(1)
para ir hacia atrás y hacia adelante respectivamente.
<script>
export default {
name: 'Service',
methods: {
// 💬 Este método nos llevará a la página anterior
back(){
this.$router.go(-1)
},
}
};
</script>
4. Utilizando props para tomar los parámetros
Usar $route.params
dentro de una vista, cada vez que queramos obtener un parámetro de la ruta, limita mucho la capacidad que esta vista del proyecto tiene. Para evitar eso, y tener más control sobre ese parámetro, podemos utilizar un prop
para capturar el parámetro de la ruta. Para esto únicamente tendremos que habilitar los props
desde donde creamos nuestras rutas.
export default new Router({
routes: [
{
path: "/user/:username",
name: "user",
component: User,
props: true,
},
],
});
Y dentro de nuestra vista obtenemos esos parámetros de la siguiente forma.
<template>
<div class="user">
<h1>{{ username }}</h1>
</div>
</template>
<script>
export default {
props: ["username"],
};
</script>
5. Definir una vista para rutas no encontradas
En vuejs también podemos definir un vista a mostrar cada vez que no se encuentra una determinada ruta. Para esto solo debemos definir la siguiente ruta junto con la vista que queremos mostrar en estos casos.
const router = new VueRouter({
mode: "history",
routes: [...{ path: "*", component: NotFoundComponent }],
});
6. Tu turno
Ahora que sabes como funcionan las rutas te animo a crear un proyecto SPA en Vuejs que utilice rutas para navegar entre las vista. Puedes tomar de referencia el siguiente ejemplo que utiliza Bootstrap para un mejor aspecto visual, pero utiliza solo lo que aprendimos aquí.
Cuando quieras puedes ver el código del proyecto terminado. Pero ándale inténtalo tu mismo!!
7. El código
El código del proyecto está en el siguiente repositorio github.com/andygeek/vue-routes-app