Nuevos frameworks y bibliotecas de JavaScript se lanzan todos los meses. Sin embargo, cuando miramos el Desarrollo Web, nos damos cuenta de que tres de ellos se destacan: Vue, Angular y React. Es muy probable que ya hayas oído hablar de alguno de ellos.
En este artículo, hablaremos específicamente sobre Vue JS, comentando cuál es su objetivo y también crearemos un primer ejemplo con esta tecnología. Lanzado en 2013 por Evan You, hoy es uno de los proyectos de código abierto más conocidos en el mundo del Desarrollo.
Objetivo y ventajas de Vue JS
Vue JS tiene el objetivo de ayudarnos a crear páginas Web, aumentando mucho nuestra productividad y permitiendo que realicemos tareas repetitivas en menos tiempo y con menos líneas de código.
Además, Vue JS es muy útil para ayudarnos a manipular la información de nuestra página. Dado que es un framework reactivo, Vue nos ofrece el recurso de crear atributos en su instancia y manipularlos en cualquier lugar de nuestra página HTML.
Siendo muy simple, Vue JS es considerado por muchos desarrolladores como el framework más fácil de aprender entre los tres principales que comentamos al inicio del artículo.
Incluso iniciar un proyecto Vue es muy simple, dado que se puede agregar a nuestro código HTML a través de una CDN. Muy práctico, ¿no crees?
¿Qué te parece si creamos un ejemplo usando Vue JS y así analizamos algunos de sus conceptos? ¡Entonces, vamos allá!
Primer proyecto con Vue JS
En este artículo crearemos un Sistema de Gestión de Usuarios usando Vue JS. Este proyecto contendrá un formulario de registro y una lista de usuarios. Su diseño inicial es el siguiente:
Al registrar un nuevo usuario, este deberá ser agregado a la lista de usuarios y tener la opción de poder ser excluido o modificado, de esta forma:
Imagina tener que hacer esto con Vanilla JS (JavaScript puro). Podría ser un gran trabajo, ¿no es así? Vamos a añadir Vue JS a esta aplicación y entender cómo puede ayudarnos.
Implementando Vue JS al proyecto
Un concepto inicial muy importante es el siguiente: para añadir Vue JS a nuestra aplicación, necesitamos crear una etiqueta principal, que será donde Vue podrá ejecutar sus funciones. Podemos decir que este elemento HTML será como los “límites de actuación” de Vue en nuestra página.
Así, vamos a añadir un El siguiente paso es añadir Vue a nuestro código. Lo haremos a través de una CDN, usando la etiqueta : Con esta simple línea de código logramos implementar el script de Vue a nuestro proyecto y ya podemos acceder a sus recursos. Para iniciar Vue, necesitamos crear otra etiqueta , que estará debajo de esta primera, y creará una nueva instancia del objeto Vue, de esta manera: Esto nos lleva a un próximo concepto importante: Vue trabaja a través de un objeto que informaremos para su instancia. Este objeto contendrá todas las opciones necesarias para un buen funcionamiento de este framework. Un primer parámetro importante es el elemento HTML que será afectado por las funcionalidades de Vue. En este momento informaremos el id de la etiqueta que creamos anteriormente para un parámetro llamado “el”. El código quedará así: Nota que informamos el id usando el # (hashtag), a través de los selectores de CSS3. Como ya comentamos, Vue nos ayuda a definir y manipular los datos de nuestra página. Para ello, usa otro atributo de su instancia. Hablamos del parámetro “data”, que almacenará nuestros datos. Como estamos trabajando con un Sistema de Gestión de Usuarios, vamos a crear un atributo llamado “users”, que tendrá su valor inicial como un array vacío, de esta forma: Con base en este atributo podremos crear todas las funcionalidades de nuestra página. Recuerda también que Vue es un framework reactivo. De esta forma, si cambiamos el valor de este atributo, ese cambio se reflejara en todos los lugares donde esté definido en nuestra página. Ahora vamos a configurar la creación de un nuevo usuario a través del formulario de registro. Para ello, aprenderemos dos conceptos fundamentales más de Vue. Las directivas son un recurso de Vue que nos permite cambiar el comportamiento predeterminado de un elemento HTML. Podemos decir que a través de ellas es posible añadir las funcionalidades de Vue en etiquetas específicas de nuestro documento HTML. Todas las directivas tienen el prefijo “v-”, dejando claro que son recursos específicos de Vue. Con las directivas podemos definir eventos, bucles de repetición o incluso el tan conocido two-way data binding en los elementos. Vamos a usarlas para definir el evento de “submit” en nuestro formulario. Para eso, usaremos la directiva v-on, usada específicamente para eventos. Además, usaremos el modificador .prevent, que ejecutará el método preventDefault(), deshabilitando el comportamiento predeterminado del navegador en el evento de “submit”, que sería actualizar la página. Nuestro código quedará así: Observa que las directivas son muy similares a los atributos de HTML, informados en la etiqueta de apertura de los elementos. También necesitamos almacenar el valor del nombre del usuario que será creado a través de nuestro formulario. Para ello, crearemos otro atributo en nuestra instancia Vue. Podemos llamarlo “newUser” y definir que al inicio tendrá una cadena vacía como valor, de esta forma: Ahora necesitamos resolver una pequeña cuestión: es necesario que el nombre del usuario definido en la etiqueta sea atribuido a este nuevo atributo, para que podamos recuperar esta información al guardar los datos. ¿Cómo podemos hacer esto? Necesitaremos un código muy complejo para ello. La buena noticia es que Vue ya nos ofrece esta funcionalidad, a través de una directiva, llamada v-model. Es la encargada de definir el two-way data binding en los elementos HTML. Se usa principalmente en los elementos de formulario. Vamos a definirla en nuestra etiqueta , informando el atributo “newUser” como su valor: El siguiente paso es configurar de hecho la función que será ejecutada al enviar el formulario. Eso nos lleva al próximo concepto de Vue. Las funciones que creamos dentro de la instancia Vue se llaman métodos. Son responsables de ejecutar cualquier tipo de acción dentro de nuestra aplicación, como enviar un formulario, que es el caso de nuestro proyecto actual. Para crear un método, necesitamos informarlo dentro del parámetro methods en la instancia Vue. Vamos a crear un método llamado addUser(), que será el que ejecutaremos al enviar el formulario: Nota que el parámetro methods queda en el mismo nivel que el parámetro data. Nunca debemos informar uno dentro del otro, ya que nuestro código no funcionará en este caso. Ahora que hemos creado el método, necesitamos llamarlo en nuestra etiqueta de formulario, junto con la directiva v-on. Esta parte de nuestro código quedará así: Excelente. Sin embargo, necesitamos definir lo que nuestro método realmente ejecutará, ya que hasta el momento está vacío. Como estamos trabajando con un array de usuarios, vamos a ejecutar el método push() en nuestro atributo users, informando los nuevos datos del usuario. Para llamar a un atributo dentro de la instancia Vue, podemos usar el this. Así, nuestro método quedará así: Explicando: informamos a nuestro array de usuarios un nuevo objeto, que contendrá el id y el nombre del usuario. Para el nombre, llamamos al atributo “newUser”, que tendrá su valor definido por la etiqueta . Y definimos el valor del id del usuario como la cantidad de usuarios más uno. De esta forma, el id será numérico y se incrementará automáticamente, a medida que creemos nuevos usuarios. Para probar si nuestro código está funcionando hasta aquí, vamos a añadir un console.log() en ese método: Vamos a probar el registro de nuestro primer usuario: Al hacer clic en el botón “Registrar”, vemos el siguiente resultado en la consola: Notamos que la información del usuario se ha añadido correctamente a nuestra instancia Vue, ¡lo cual es excelente! Sin embargo, la información de este nuevo usuario aún no se está listando en la página. Vamos a implementar esta funcionalidad ahora. Para listar los usuarios, necesitaremos realizar un bucle de repetición en el array de nuestra instancia Vue. También tenemos una directiva que nos ayuda a hacer esto: la directiva v-for. Esta espera como valor la variable donde irá a ejecutar el for y también el nombre que esta variable usará en cada repetición. Vamos a añadir esta directiva en la etiqueta . Nuestro código HTML quedará así: Observa que informamos la variable “users”, en plural, que es el atributo que creamos en nuestra instancia Vue, y definimos que en cada repetición usaremos la variable “user”, en singular. Dentro de esta etiqueta definiremos un nuevo elemento , que contendrá el valor del nombre de cada usuario. Esta información está contenida en la variable user.name y la definiremos en el atributo value de la etiqueta de formulario. Sin embargo, un atributo HTML por defecto no puede interpretar el valor de una variable, sino solo cadenas. Para resolver esta cuestión, usaremos la directiva v-bind. Su objetivo es definir el valor de variables a los atributos HTML. Nuestra etiqueta quedará así: Aprovechando que estamos hablando de la directiva v-bind, la usaremos también en la etiqueta . Haremos esto porque es una buena práctica definir el atributo key en las etiquetas donde realicemos bucles de repetición. La documentación de Vue siempre sugiere hacerlo. En este caso, definiremos como key de cada etiqueta de lista el valor de la variable user.id: Si lo deseas, puedes usar la forma abreviada de la directiva v-bind, que consiste en informar solo los dos puntos, es decir, :key. Ahora, si ejecutamos una prueba más en nuestro proyecto, veremos el siguiente resultado: Ahora, nuestro usuario registrado ha sido correctamente añadido a nuestra etiqueta de lista. Solo un detalle importante: todo esto se hizo sin necesidad de recargar la página, ni hacer una petición externa. Vue JS hizo esto por nosotros de forma automática, a través de su reactividad. La próxima función que implementaremos es la de editar un usuario. Para realizar la edición de los datos de un usuario, ejecutaremos un nuevo método, llamado setUser(), en el momento en que cambiemos el valor de la etiqueta . Es decir, no será necesario ni siquiera hacer clic en algún botón, sino solo cambiar el valor de esta información y hacer clic fuera del elemento. Increíble, ¿no es así? Para esto, necesitaremos manipular el evento “change” de la etiqueta . Vamos a hacer uso nuevamente de la directiva v-on, de esta forma: Nota que informamos dos parámetros al método setUser(). 1) Informamos una variable llamada $event.target.value. Esta variable contiene el valor del propio elemento de formulario, es decir, el nuevo valor definido en el momento de la alteración. 2) Informamos la variable user.id, que nos ayudará a encontrar el usuario correcto para realizar la modificación. Ahora necesitamos de hecho crear el método setUser() en la instancia Vue. Este método contendrá la siguiente estructura: Explicando: este método ejecutará el método map() en nuestro array de usuarios, aplicando una función a todos los elementos de él. Hacemos una verificación dentro de esta función, preguntando a través de un if() si el usuario del array tiene el mismo id que informamos al método setUser(). Si se cumple esa condición, modificamos la información del nombre de ese usuario por el nuevo nombre informado al método. Nota que este método fue creado puramente en JavaScript, usando otro método de arrays. Además, observa que, como este método es una función, creamos su nombre y ya informamos los paréntesis de la función, sin necesidad de informar la palabra reservada function. En este momento, si cambiamos el nombre del usuario en el elemento HTML, este valor será alterado no solo en nuestra página, sino también en el atributo de la instancia Vue. Esto nos ayudará mucho cuando conectemos esta aplicación con una API, por ejemplo. Por último, necesitamos crear el método que realizará la eliminación de un usuario. El método de eliminación de un usuario se llamará removeUser(). Este esperará como parámetro el id del usuario a ser eliminado. Vamos a realizar la llamada de este método en la etiqueta del botón de eliminar. Este será ejecutado al hacer clic en el botón. El código quedará así: Una vez más hemos utilizado la directiva v-on. Si lo prefieres, puedes usar la forma abreviada de esta directiva, que está representada por @, es decir, @click. Ya nos estamos volviendo expertos en usar directivas ?. Ahora vamos a crear el método en nuestra instancia Vue. Quedará así: Explicando: hemos utilizado otro método para arrays. Usamos el método filter(), que devuelve todos los elementos del array que satisfacen una condición específica. Hemos definido que solo serán devueltos los elementos que tengan el id diferente del informado por el método, lo que efectivamente eliminará al usuario que tenga el id pasado como parámetro. Los métodos de arrays son realmente muy interesantes y pueden ayudarnos en algunas otras situaciones específicas, pero podemos hablar más sobre eso en otro artículo, dedicado solo a ellos. En este momento, si creamos más de un usuario en nuestra página, serán listados correctamente: Sin embargo, si hacemos clic en el botón de eliminar, el usuario será retirado automáticamente de la página: Con esto llegamos al final de nuestro primer CRUD usando Vue. Si lo deseas, podrás consultar el código completo de este proyecto en nuestro GitHub. Vue JS es de hecho un framework muy simple de aprender, pero no deja de ser muy poderoso al mismo tiempo. Además, siempre está recibiendo actualizaciones y mejoras. Por ejemplo, hablamos hace poco sobre las novedades de la recién lanzada versión 3 de Vue. Puedes consultar este artículo haciendo clic aquí. Asimismo, si deseas conocer todos los recursos de Vue, podrás acceder a nuestro Curso Completo de Vue JS, donde abordamos todos los conceptos de este framework en más de 135 clases y con un material de apoyo para cada concepto. Nos vemos en el próximo artículo, hasta entonces :)<div id="root">
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.min.js"></script>
<script>
new Vue()
</script>
new Vue({
el: '#root'
})
Añadiendo datos a la página
new Vue({
el: '#root',
data: {
users: []
}
})
Directivas
<form v-on:submit.prevent>
data: {
users: [],
newUser: ''
}
<input type="text" v-model="newUser">
Métodos
new Vue({
el: '#root',
data: {
users: [],
newUser: ''
},
methods: {
addUser: function() {
}
}
})
<form v-on:submit.prevent="addUser">
methods: {
addUser: function() {
this.users.push({
id: (this.users.length + 1),
name: this.newUser
})
}
}
console.log(this.users);
Listando los usuarios registrados
<li v-for="user in users">
</li>
<input type="text" v-bind:value="user.name">
<li v-for="user in users" v-bind:key="user.id">
Editando un usuario
<input type="text" v-bind:value="user.name" v-on:change="setUser($event.target.value, user.id)">
setUser(newName, id) {
this.users.map(user => {
if (user.id == id) {
user[name] = newName;
}
});
}
Excluyendo un usuario
<button class="user-delete" v-on:click="removeUser(user.id)">Eliminar</button>
removeUser(id) {
this.users = this.users.filter(user => {
return (user.id != id);
})
}