Vue JS es un framework que se destaca por su simplicidad y facilidad de aprendizaje. Sin embargo, también es un framework muy poderoso y robusto. Y cuando hablamos de aplicaciones Web, una tendencia que crece cada vez más es la conexión de nuestros frameworks con una API. Quizás ya te has preguntado: “¿Cómo realizar esta conexión con Vue JS?” ¡Es sobre eso de lo que hablaremos en este artículo!
Nos basaremos en el proyecto que desarrollamos en el artículo Vue JS - Introducción y creación del primer proyecto
Además, utilizaremos la API que desarrollamos en el artículo Creando API PHP con Laravel y PostgreSQL.
Esto será interesante porque veremos en la práctica cómo ocurre la conexión de dos sistemas diferentes, con dos lenguajes diferentes, a través de la API.
Para comenzar, vamos a iniciar el servidor de nuestra API en Laravel usando el comando php artisan serve. Este comando nos devolverá la siguiente respuesta:
Ahora vamos a acceder a nuestro archivo HTML que está usando Vue y realizar las adaptaciones necesarias.
Listando usuarios
La primera adaptación que necesitamos realizar es en el diseño. Nuestra API tiene el campo de email en su estructura, pero nuestro HTML no. Vamos a agregar una etiqueta más para mostrar también el email de cada usuario registrado:
<input type="text" v-bind:value="user.email" v-on:change="setUser($event.target.value, user.id)">
¡Excelente! Ahora podemos comenzar la implementación de las llamadas a la API en nuestro código. Para ello, utilizaremos una biblioteca de JavaScript llamada Axios. Esta biblioteca es cada vez más conocida, debido a la facilidad de su configuración e implementación. Además, realiza las solicitudes basándose en promesas, lo que nos ayuda a tener un código realmente asíncrono.
La implementación de axios en nuestro proyecto es bastante simple, igual a la implementación de Vue. Solo tienes que añadir una etiqueta con un CDN para tu archivo JS:
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
Nuestro objetivo es listar los usuarios registrados en nuestra página tan pronto como se cargue. Así que necesitamos hacer la solicitud a nuestra API antes de la renderización de nuestro proyecto. Para ello, vamos a poner en práctica un concepto muy interesante de Vue llamado “Lifecycle Hooks”, también conocido como “Gatillos del Ciclo de Vida de la Instancia Vue”.
Involucra una serie de métodos que pueden ser ejecutados a lo largo del proceso de montaje de la instancia Vue, antes y después de su renderización. Enseñamos cada uno de los lifecycle hooks en nuestro Curso Completo de Vue JS.
En este proyecto utilizaremos el método created().
Vamos a agregar el siguiente código a la instancia Vue:
async created() {
let results = await axios.get('http://localhost:8000/api/users');
this.users = results.data;
}
Explicando: realizamos la solicitud de la URL de nuestra API a través de axios. Luego seleccionamos los datos devueltos por ella (todos los usuarios) y los definimos como los valores de la propiedad users de la instancia Vue.
Como utilizamos await para esperar el retorno de la promesa de axios, fue necesario crear el método created() como async. Esto se repetirá en todos los métodos que llamen a alguna ruta de la API. Hablamos más sobre el concepto de async/await en el artículo JavaScript Asíncrono: La Guía Completa - Parte 5 - Entendiendo Async/Await.
Al actualizar la página, vemos el siguiente resultado:
¡Excelente, el usuario registrado en nuestra Base de Datos fue renderizado correctamente, a través de nuestra API!
Creando un nuevo usuario
El siguiente procedimiento es la creación de un usuario. Nuestro formulario de registro tiene solo un campo, que es para el nombre del usuario. Necesitamos realizar un pequeño cambio, agregando también el campo para su email:
<div class="field">
<label for="email-input">Email</label>
<input type="email" name="email" id="email-input" placeholder="Digite el email del usuario" v-model="newUser">
</div>
Además, en la instancia Vue creamos una propiedad que almacena el nombre del nuevo usuario. Sin embargo, ahora estamos registrando su nombre y email. Podríamos crear una nueva propiedad llamada “newEmail” para almacenar esta información. Sin embargo, eso con el tiempo podría volverse insostenible.
Para resolver esta cuestión, vamos a reemplazar la propiedad newUser por una llamada formData, que tendrá un objeto vacío al principio:
formData: {}
Ahora, las directivas v-model en nuestros campos de formulario contendrán los valores de las propiedades “name” y “email” del objeto formData:
<input type="text" name="username" id="username-input" placeholder="Digite el nombre del usuario" v-model="formData.name">
<input type="email" name="email" id="email-input" placeholder="Digite el email del usuario" v-model="formData.email">
Ahora podemos tener tantos campos como deseemos ?.
Además, vamos a definir que el objeto formData se enviará para Vue cuando ocurra el envío del formulario:
<form v-on:submit.prevent="addUser(formData)">
Vamos a realizar ahora la llamada a nuestra API. En este momento podemos encontrarnos con otra refactorización en el proyecto. La URL “http://localhost:8000/api” se repetirá en todas las solicitudes, ya que es la base de nuestra API. Por lo tanto, no tiene sentido repetir este fragmento en todos nuestros métodos. Podemos almacenar esta información en una constante para que el código sea un poco más limpio:
const server = "http://localhost:8000/api";
Así, la solicitud GET que ya creamos quedará de la siguiente forma:
let results = await axios.get(`${server}/users`);
El método al que vamos a adaptar para la API es el método addUser(). Quedará de la siguiente manera:
async addUser(data) {
if (!data.name) {
alert('Informe el nombre');
} else if (!data.email) {
alert('Informe el email');
} else {
let results = await axios.post(`${server}/users`, data);
this.users.push({
id: results.data.id,
name: results.data.name,
email: results.data.email
});
}
}
Explicando: realizamos algunas verificaciones en nuestro código para asegurarnos de que el usuario no envió ninguna información inválida a la API. Luego definimos la solicitud a la API, ahora usando el método POST e informando los valores enviados por el formulario. Por último, añadimos los valores devueltos por la API a nuestra instancia Vue, con el objetivo de actualizar los datos en el diseño en ese momento.
Ahora, cuando probamos el envío de un nuevo usuario, vemos lo siguiente en la lista de usuarios:
Ahora nuestro usuario fue creado a través de la API y ya se añadió a la página. Lo mejor es que si actualizamos la página, veremos que el usuario sigue ahí!
Editando un usuario
Para editar un usuario, estamos usando el método setUser(). Anteriormente informábamos solo el valor de un nuevo nombre. Sin embargo, ahora necesitamos informar más que solo un dato. Vamos a adaptar el HTML para que informemos el objeto user entero al método:
<input type="text" v-model="user.name" v-on:change="setUser(user)">
<input type="text" v-model="user.email" v-on:change="setUser(user)">
Nota también que cambiamos la directiva v-bind por v-model, para que podamos cambiar el valor de la propiedad user al escribir el nuevo valor.
Ahora vamos a adaptar el método setUser() para que realice la llamada a la API en Laravel, informando el método PATCH a ella. Nuestro método quedará de la siguiente manera:
async setUser(data) {
if (!data.name) {
alert('Informe el nombre');
} else if (!data.email) {
alert('Informe el email');
} else {
await axios.patch(`${server}/users/${data.id}`, data);
}
}
Ten en cuenta que añadimos algunas verificaciones para asegurarnos de que el nombre y el email fueron informados al método y hicimos la llamada a la API, similar al método addUser(). Eso ya es suficiente. Al cambiar el valor de cualquier campo, también se guardará a través de la API.
Eliminando un usuario
Por último, llegamos al método de eliminación. El evento de clic en el botón de eliminar seguirá siendo el mismo, solo cambiará el método removeUser(). Quedará de la siguiente forma:
async removeUser(id) {
await axios.delete(`${server}/users/${id}`);
this.users = this.users.filter(user => {
return (user.id != id);
})
}
Explicando: añadimos la llamada a nuestra API utilizando el método DELETE. Además, mantuvimos el método filter() en la propiedad users, para que el usuario eliminado se elimine de nuestra página. Ahora, si hacemos clic en el botón “Eliminar” en cualquier fila, el usuario será eliminado, no solo de la página, sino también de la Base de Datos!
Puedes encontrar los códigos desarrollados en este artículo en nuestro GitHub.
En este artículo aprendimos a conectar una aplicación en Vue JS a una API y manipular la llamada a sus rutas. Este conocimiento puede ser un diferencial cuando trabajamos con el desarrollo de aplicaciones Web.
Si lo deseas, puedes enviar sugerencias de temas haciendo clic aquí. ¡Hasta el próximo artículo :)