Los mismos creadores de Vue.js han creado un plugin para Vue.js que nos permite añadir rutas a nuestra aplicación. En esta entrada añadiremos esta librería llamada vue-router y crearemos un ejemplo sencillo dándole estilo con la librería llamada Vuetify, que nos permite añadir estilos Material Design. También le añadiremos una transición fade cuando se cambie de ruta, es decir, el contenido de la ruta se mostrará gradualmente según el tiempo que pongamos.
Empezamos añadiendo las librerías JS necesarias:
1 2 3 |
https://unpkg.com/vue https://unpkg.com/vue-router/dist/vue-router.js https://unpkg.com/vuetify/dist/vuetify.min.js |
Y también añadimos las librerías CSS:
1 |
https://unpkg.com/vuetify/dist/vuetify.min.css |
Una vez ya tenemos las librerías necesarias incrustadas, vamos a crear el JS con la instancia de Vue.js y vamos a indicarle a Vue que vamos a utilizar los plugins vue-router y Vuetify ( Vue.use() ):
1 2 3 4 5 6 |
Vue.use(Vuetify); Vue.use(VueRouter); new Vue({ el: '#app' }); |
Como ya le hemos indicado a Vue.js que vamos a utilizar las librerías vue-router y Vuetify, creamos el HTML, ya que vamos a utilizar cosas de estas librerías:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<div id="app"> <v-toolbar> <v-toolbar-title>Groloop</v-toolbar-title> <v-spacer></v-spacer> <v-toolbar-items> <v-btn flat href="#/">Home</v-btn> <v-btn flat href='#/about-us'>About us</v-btn> <v-btn flat href='#/contact'>Contact</v-btn> <v-btn flat href='#/test'>Test</v-btn> </v-toolbar-items> </v-toolbar> <router-view></router-view> </div> |
Si te fijas estamos utilizando los componentes que nos provee la librería Vuetify, puedes ver su documentación aquí e investigar sobre todos los componentes que posee. Nosotros utilizaremos simplemente un toolbar, que viene a ser un menú de navegación arriba del todo de la página con unos links que apuntan a unas rutas que crearemos ahora con vue-router.
Vale, ya tenemos la base creada con un diseño mínimo, ahora vamos a crear las rutas:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
... // componentes var Home = { template: '<h2>Home</h2>' } var AboutUs = { template: '<h2>About Us</h2>' } var Contact = { template: '<h2>Contact</h2>' } var NotFound = { template: '<h2>Not Found</h2>' } // indicamos las rutas con el componente correspondiente var router = new VueRouter({ history: false, routes: [ { path: '/', name: 'home', component: Home }, { path: '/about-us', name: 'about-us', component: AboutUs }, { path: '/contact', name: 'contact', component: Contact }, { path: '*', name: 'not-found', component: NotFound } ], }); // añadimos router a la instancia de Vue new Vue({ el: '#app', router: router }); |
Primero creamos unos componentes mínimos con un mensaje para que se muestre en la ruta, después creamos una instancia de vue-router con las rutas y añadimos la variable router a la instancia de Vue.
Yo he creado 4 rutas (la última de ellas para el error 404), pero se pueden crear las que quieras. Si te fijas en el HTML hay un enlace a una ruta llamada test, como puedes ver, esta ruta no existe, por tanto, se mostrará un error 404 (la ruta *). Para crear una ruta, en el array routes creamos un objeto indicando la ruta (path), el nombre de la ruta (name) que nos permitirá acceder a la ruta más fácilmente más tarde e indicamos el componente (component) correspondiente a la ruta.
Vue-router es una librería muy completa con muchas opciones que puedes investigar en su documentación, en otra entrada ya trataremos más en profundidad esta librería.
Ahora lo que se ve sería ésto (aún no hemos aplicado la transición al cambiar de ruta):
Ahora vamos a añadir la transición al cambiar de ruta, simplemente tenemos que añadir estas dos líneas en el HTML:
1 2 3 4 5 |
... <transition name="fade"> <router-view></router-view> </transition> ... |
Y ahora tenemos que añadir el CSS que será el que hará la transición, la animación en sí, ya que el tag <transition> añade unas clases CSS según el name que pongamos (aquí puedes encontrar más información):
1 2 3 4 5 6 7 8 9 10 11 12 |
.fade-enter-active, .fade-leave-active { transition-property: opacity; transition-duration: .25s; } .fade-enter-active { transition-delay: .25s; } .fade-enter, .fade-leave-active { opacity: 0 } |
Este código CSS lo he sacado de un buen post de StackOverflow.
See the Pen Vue.js 2 #8 vue-router and Vuetify.js by vreaxe (@vreaxe) on CodePen.
-
– https://vuetifyjs.com/vuetify/quick-start
– https://router.vuejs.org/en/