| Tabla de contenidos |
|---|
...
Importación
Para la navegación en Vue utilizamos el paquete vue-router. Podemos ver la documentación oficial con todos los detalles aquí.
...
| Bloque de código | ||
|---|---|---|
| ||
new Vue({
router,
render: h => h(App),
}).$mount('#app') |
Definir rutas
Para definir las rutas, tendremos un directorio router/ dentro de src/, que contendrá index.js. En él podemos definir una lista con un objeto por cada ruta, de la siguiente forma:
...
Si nos fijamos, podemos poner en cada ruta un campo props a true. Con esto, cuando naveguemos a esa ruta, los parámetros que se le pasen cuyo nombre coincida con un prop definido en el componente se asignará a este directamente. Es importante tener en cuenta que para hacer esto, tendremos que hacer la navegación utilizando el name, y no el path, pues si no no funciona.
Vista del router
El router habrá que incluirlo como un componente más. Así, podemos definir la parte de la pantalla que cambiará cuando se cambie de ruta, pudiendo dejar fijo, por ejemplo, un menú lateral, y que sólo se tenga que cargar el contenido de la página.
...
Así, esta parte de la página se sustituirá por el componente correspondiente, cambiando sólo la parte necesaria de la página sin tener que volver a cargarlo todo.
Navegar
Para relizar la navegación, podríamos hacerlo conhref, pero es mejor utilizar router-link:
...
| Bloque de código | ||
|---|---|---|
| ||
// path
this.$router.push('home')
// path
this.$router.push({ path: 'home' })
// nombre + parámetros
this.$router.push({ name: 'user', params: { userId: '123' } }) |
Interceptores de navegación
Vue router ofrece la posibilidad de añadir código para ejecutarlo cuando se produzca la navegación, con los navigation guards. Son una serie de métodos que podemos definir. El proceso de navegación, y el momento en el que se ejecuta cada método es el siguiente:
...
Estos métodos pueden ser globales o locales a cada ruta.
Interceptores globales
beforeEach
Podemos registrar interceptores de manera global para definir un comportamiento que se ejecute justo antes de producirse la navegación a cualquier ruta. Esto lo hacemos conrouter.beforeEach, de esta manera:
...
Los interceptores nos pueden venir bien para comprobar algún estado global de la aplicación, como la autorización del usuario.
beforeResolve
Se pueden registrar estos interceptores con router.beforeResolve, de la misma forma que los beforeEach. La diferencia es que estos se ejecutan justo antes de que se confirme la navegación, después de haber ejecutado los interceptores de ruta y de componentes, y que los componentes de ruta asíncronos se resuelvan.
afterEach
También se pueden registrar globalmente interceptoresafterEachque se ejecutarán después de confirmar la navegación. Se definen como losbeforeEach, pero sin un parámetronext, pues ya se ha confirmado la navegación:
| Bloque de código | ||
|---|---|---|
| ||
router.afterEach((to, from) => {
// ...
}) |
Interceptores por ruta
Se pueden definir interceptoresbeforeEnterdirectamente en el objeto que define las rutas, con la misma notación que los interceptores globales before:
| Bloque de código | ||
|---|---|---|
| ||
{
path: '/foo',
component: Foo,
beforeEnter: (to, from, next) => {
// ...
} |
Interceptores por componente
Se pueden definir interceptores de navegación dentro de los componentes que se pasan a las rutas, con las siguientes opciones:
...
| Bloque de código | ||
|---|---|---|
| ||
beforeRouteEnter (to, from, next) {
// called before the route that renders this component is confirmed.
// does NOT have access to `this` component instance,
// because it has not been created yet when this guard is called!
},
beforeRouteUpdate (to, from, next) {
// called when the route that renders this component has changed.
// This component being reused (by using an explicit `key`) in the new route or not doesn't change anything.
// For example, for a route with dynamic params `/foo/:id`, when we
// navigate between `/foo/1` and `/foo/2`, the same `Foo` component instance
// will be reused (unless you provided a `key` to `<router-view>`), and this hook will be called when that happens.
// has access to `this` component instance.
},
beforeRouteLeave (to, from, next) {
// called when the route that renders this component is about to
// be navigated away from.
// has access to `this` component instance.
} |
Volver arriba tras navegar
Por defecto, al navegar a otra ruta, se mantiene el scroll que teníamos en la ruta anterior. Si queremos que al hacerlo la página se ponga de nuevo al inicio, arriba del todo, tenemos que definir así el scrollBehavior al crear la instancia del router:
...