Hasta ahora, hemos discutido c贸mo construir p谩ginas web simples utilizando HTML y CSS, y c贸mo utilizar Git y GitHub para realizar un seguimiento de los cambios en nuestro c贸digo y colaborar con otros. Tambi茅n nos hemos familiarizado con el lenguaje de programaci贸n Python, hemos comenzado a utilizar Django para crear aplicaciones web y hemos aprendido a utilizar los modelos de Django para almacenar informaci贸n en nuestros sitios.
Hoy, introduciremos un nuevo lenguaje de programaci贸n:
Javascript
Comencemos por volver a examinar un diagrama:
Recuerda que en la mayor铆a de las interacciones en l铆nea, tenemos un cliente/usuario que env铆a una solicitud HTTP a un servidor, que devuelve una respuesta HTTP. Todo el c贸digo Python que hemos escrito hasta ahora utilizando Django se ha ejecutado en un servidor. JavaScript nos permitir谩 ejecutar c贸digo en el lado del cliente, lo que significa que no es necesario interactuar con el servidor mientras se est谩 ejecutando, lo que permite que nuestros sitios web sean mucho m谩s interactivos.
Para agregar algo de JavaScript a nuestra p谩gina, podemos agregar un par de etiquetas<script>en alg煤n lugar de nuestra p谩gina HTML. Usamos las etiquetas<script>para indicar al navegador que cualquier cosa que escribamos entre las dos etiquetas es c贸digo JavaScript que deseamos ejecutar cuando un usuario visita nuestro sitio. Nuestro primer programa podr铆a verse algo as铆:
javascript
1alert('Hola, terr铆colas!');
La funci贸n alert en JavaScript muestra un mensaje al usuario que luego pueden cerrar. Para mostrar d贸nde encajar铆a esto en un documento HTML real, aqu铆 tienes un ejemplo de una p谩gina sencilla con algo de JavaScript:
javascript
1<!DOCTYPE html>
2<html>
3<head>
4<title>MiP谩gina con JavaScript</title>
5</head>
6<body>
7<h1>Bienvenido a mi p谩gina</h1>
8<p>Haz clic en el bot贸n para ver un mensaje de alerta.</p>
La Programaci贸n Orientada a Eventos es un paradigma de programaci贸n que se centra en la detecci贸n de eventos y las acciones que deben realizarse cuando se detecta un evento.
Un evento puede ser casi cualquier cosa, como hacer clic en un bot贸n, mover el cursor, escribir una respuesta o cargar una p谩gina. Casi todo lo que un usuario hace para interactuar con una p谩gina web se puede considerar como un evento. En JavaScript, utilizamosEscuchadores de Eventosque esperan a que ocurran ciertos eventos y luego ejecutan alg煤n c贸digo.
Comencemos por convertir nuestro JavaScript anterior en unafunci贸nllamadahola:
javascript
1functionhola(){
2alert("Hola mundanos!")
3}
Ahora, trabajemos en ejecutar esta funci贸n cada vez que se haga clic en un bot贸n. Para hacerlo, crearemos un bot贸n HTML en nuestra p谩gina con un atributo onclick, que proporciona al navegador instrucciones sobre lo que debe suceder cuando se hace clic en el bot贸n:
JavaScript es un lenguaje de programaci贸n, al igual que Python, C o cualquier otro lenguaje con el que hayas trabajado antes, lo que significa que tiene muchas de las mismas caracter铆sticas que otros lenguajes, incluyendo variables. Hay tres palabras clave que podemos usar para asignar valores en JavaScript:
var: se utiliza para definir una variable globalmente.
javascript
1var age =20;
const: se utiliza para definir un valor que no cambiar谩.
javascript
1constPI=3.14;
let: se utiliza para definir una variable que est谩 limitada en alcance al bloque actual, como una funci贸n o un bucle.
javascript
1let counter =1;
Para un ejemplo de c贸mo podemos usar una variable, echemos un vistazo a una p谩gina que lleva un contador:
Adem谩s de permitirnos mostrar mensajes a trav茅s de alertas, JavaScript tambi茅n nos permite cambiar elementos en la p谩gina. Para hacer esto, primero debemos introducir una funci贸n llamada document.querySelector. Esta funci贸n busca y devuelve elementos del DOM. Por ejemplo, la utilizar铆amos de la siguiente manera:
javascript
1const element =document.querySelector(selector);
2
3let heading =document.querySelector('h1');
para extraer un encabezado. Luego, para manipular el elemento que hemos encontrado recientemente, podemos cambiar su propiedad innerHTML:
4headingElement.innerHTML='Nuevo texto para el encabezado';
Al igual que en Python, tambi茅n podemos aprovechar lascondicionesen JavaScript. Por ejemplo, supongamos que en lugar de cambiar siempre nuestro encabezado a "Goodbye!", queremos alternar entre"Hola!"y"Adios!". Nuestra p谩gina podr铆a verse algo as铆. Ten en cuenta que en JavaScript utilizamos===como una comparaci贸n m谩s estricta entre dos elementos que tambi茅n verifica que los objetos sean del mismo tipo. Por lo general, es recomendable usar===siempre que sea posible.
Utilicemos esta idea de manipulaci贸n del DOM para mejorar nuestra p谩gina de contador:
javascript
1<!DOCTYPE html>
2<html lang="en">
3<head>
4<title>Count</title>
5<script>
6let counter =0;
7functioncount(){
8 counter++;
9document.querySelector('h1').innerHTML= counter;
10}
11</script>
12</head>
13<body>
14<h1>0</h1>
15<button onclick="count()">Count</button>
16</body>
17</html>
Podemos hacer que esta p谩gina sea a煤n m谩s interesante mostrando una alerta cada vez que el contador llegue a un m煤ltiplo de diez. En esta alerta, queremos formatear una cadena para personalizar el mensaje, lo cual en JavaScript podemos hacer utilizando plantillas literales (template literals). Las plantillas literales requieren que haya comillas invertidas(backticks, `` ) en windows: alt + 96; alrededor de toda la expresi贸n y un signo peso($)y llaves{...}alrededor de cualquier sustituci贸n. Por ejemplo, cambiemos nuestra funci贸n de conteo de la siguiente manera:
javascript
1functioncount(){
2 counter++;
3document.querySelector('h1').innerHTML= counter;
4
5if(counter %10===0){
6alert('Count is now ${counter}')
7}
8}
Ahora, veamos algunas formas en las que podemos mejorar el dise帽o de esta p谩gina. En primer lugar, al igual que tratamos de evitar el estilo en l铆nea con CSS, queremos evitar el uso de JavaScript en l铆nea tanto como sea posible. Podemos hacerlo en nuestro ejemplo de contador agregando una l铆nea de script que cambia el atributoonclickde un bot贸n en la p谩gina y eliminando el atributoonclickdel interior de la etiqueta delbot贸n.
javascript
1<!DOCTYPE html>
2<html>
3<head>
4<title>Contador en JavaScript</title>
5<script>
6// Variable para almacenar el contador
7let counterValue =0;
8
9// Funci贸n para incrementar el contador y mostrar una alerta si es m煤ltiplo de 10
32// Llamamos a la funci贸n para configurar el bot贸n una vez que se haya cargado el DOM
33window.onload= setupCounterButton;
34</script>
35</body>
36</html>
Una cosa importante a tener en cuenta acerca de lo que acabamos de hacer es que no estamos llamando a la funci贸n "count" a帽adiendo par茅ntesis despu茅s, sino que simplemente estamos nombrando la funci贸n. Esto especifica que solo deseamos llamar a esta funci贸n cuando se haga clic en el bot贸n. Esto funciona porque, al igual que en Python, JavaScript admite la programaci贸n funcional, por lo que las funciones pueden tratarse como valores por s铆 mismas.
Sin embargo, el cambio anterior por s铆 solo no es suficiente, como podemos ver al inspeccionar la p谩gina y observar la consola de nuestro navegador.
javascript
1document.querySelector('button').onclick= count;
Este error surgi贸 porque cuando JavaScript busc贸 un elemento utilizando document.querySelector('button'), no encontr贸 nada. Esto se debe a que toma un peque帽o tiempo para que la p谩gina se cargue y nuestro c贸digo JavaScript se ejecut贸 antes de que el bot贸n se renderizara. Para tener en cuenta esto, podemos especificar que el c贸digo se ejecutar谩 solo despu茅s de que la p谩gina se haya cargado utilizando la funci贸n addEventListener. Esta funci贸n toma dos argumentos:
El evento al que escuchar (por ejemplo,"click").
Una funci贸n que se ejecutar谩 cuando se detecte el evento (por ejemplo, la funci贸n"hello" de arriba).
Podemos utilizar esta funci贸n para ejecutar el c贸digo solo una vez que todo el contenido se haya cargado:
javascript
1// Esperar a que la p谩gina se cargue por completo antes de ejecutar el c贸digo
8// El c贸digo que deseamos ejecutar despu茅s de que la p谩gina se ha cargado
9// Puede incluir configuraciones, interacciones con elementos, etc.
10});
En el ejemplo anterior, hemos utilizado una funci贸nan贸nima, que es una funci贸n a la que nunca se le da un nombre. Reuniendo todo esto, nuestro c贸digo JavaScript ahora se ve de la siguiente manera:
Otra forma en la que podemos mejorar nuestro dise帽o es moviendo nuestro JavaScript a un archivo separado. La manera de hacerlo es muy similar a c贸mo colocamos nuestro CSS en un archivo separado para dar estilo:
Escribe todo tu c贸digo JavaScript en un archivo separado que termine en.js, quiz谩sindex.js.
A帽ade un atributo src a la etiqueta<script>que apunte a este nuevo archivo.
Para nuestra p谩gina de contador, podr铆amos tener un archivo llamado counter.html que se ve as铆:
html
1<!DOCTYPEhtml>
2<htmllang="en">
3<head>
4<title>Count</title>
5<scriptsrc="counter.js"></script>
6</head>
7<body>
8<h1>0</h1>
9<button>Count</button>
10</body>
11</html>
Y un archivo llamadocounter.jsque se ver铆a de la siguiente manera:
Tener JavaScript en un archivo separado es 煤til por varias razones:
Atractivo visual: Nuestros archivos HTML y JavaScript individuales se vuelven m谩s legibles. Acceso entre archivos HTML: Ahora podemos tener varios archivos HTML que comparten el mismo JavaScript
Colaboraci贸n: Ahora es f谩cil que una persona trabaje en el JavaScript mientras otra trabaja en el HTML.
Importaci贸n: Tenemos la capacidad de importar bibliotecas de JavaScript que otras personas ya han escrito. Por ejemplo,Bootstraptiene su propia biblioteca de JavaScript que puedes incluir para hacer tu sitio m谩s interactivo.
Comencemos con otro ejemplo de una p谩gina que puede ser un poco m谩s interactiva. A continuaci贸n, crearemos una p谩gina en la que un usuario pueda escribir su nombre para obtener un saludo personalizado.
Si ustedes lo prueban pueden ver que el nombre que pongas lo va a mostrar en el alert:
Otro nombre:
Algunas notas sobre la p谩gina anterior:
Usamos el campo de enfoque autom谩tico (autofocus) en la entrada de nombre para indicar que el cursor debe situarse dentro de ese campo tan pronto como se carga la p谩gina.
Utilizamos #name dentro de document.querySelector para encontrar un elemento con un identificador(id)de"name". Podemos utilizar los mismos selectores en esta funci贸n que podr铆amos usar en CSS.
Utilizamos el atributo value de un campo de entrada para obtener lo que se ha escrito en 茅l.
隆Podemos hacer m谩s que simplemente a帽adir HTML a nuestra p谩gina utilizando JavaScript! Tambi茅n podemos cambiar el estilo de una p谩gina. En la p谩gina a continuaci贸n, utilizamos botones para cambiar el color de nuestro encabezado.
Cambiamos el estilo de un elemento utilizando el atributostyle.ALGO.
Utilizamos el atributodata-ALGOpara asignar datos a un elemento HTML. Posteriormente, podemos acceder a esos datos en JavaScript utilizando la propiedad dataset del elemento.
Usamos la funci贸nquerySelectorAllpara obtener una lista de nodos (similar a una lista en Python o a un arreglo en JavaScript) con todos los elementos que coinciden con la consulta.
La funci贸nforEachen JavaScript toma como argumento otra funci贸n y aplica esa funci贸n a cada elemento en una lista o arreglo.
La consola es una herramienta 煤til para probar peque帽os fragmentos de c贸digo y depurar. Puedes escribir y ejecutar c贸digo JavaScript en la consola, la cual se encuentra al inspeccionar un elemento en tu navegador web y luego haciendo clic en "consola" (el proceso exacto puede variar seg煤n el navegador). Una herramienta 煤til para la depuraci贸n es imprimir en la consola, lo cual puedes hacer utilizando la funci贸nconsole.log. Por ejemplo, en la p谩gina"colors.html"mencionada arriba, puedo agregar la siguiente l铆nea:
Funciones de Flecha Adem谩s de la notaci贸n tradicional de funciones que hemos visto anteriormente, JavaScript ahora nos proporciona la capacidad de utilizar Funciones de Flecha, donde tenemos una entrada (o par茅ntesis cuando no hay entrada) seguida de=>y luego alg煤n c贸digo que se ejecutar谩. Por ejemplo, podemos modificar nuestro script anterior para utilizar una funci贸n de flecha an贸nima:
Tambi茅n podemos tener funciones con nombres que utilizan flechas, como en esta reescritura de la funci贸ncount:
javascript
1count=()=>{
2 counter++;
3document.querySelector('h1').innerHTML= counter;
4
5if(counter %10===0){
6alert(`Count is now ${counter}`)
7}
8}
Para obtener una idea sobre algunos otros eventos que podemos utilizar, veamos c贸mo podemos implementar nuestro cambiador de colores utilizando un men煤 desplegable en lugar de tres botones separados. Podemos detectar cambios en un elemento select utilizando el atributoonchange. En JavaScript, esto es una palabra clave que cambia seg煤n el contexto en el que se utiliza. En el caso de un manejador de eventos,thisse refiere al objeto que desencaden贸 el evento.
Hay muchos otros eventos que podemos detectar en Javascript incluyendo los m谩s comunes, a continuaci贸n:
onclick
onmouseover
onkeydown
onkeyup
onload
onblur
...
TODO List
Para aplicar algunas de las cosas que hemos aprendido en esta conferencia, trabajemos en la creaci贸n de una lista de tareas(TODO List) completamente en JavaScript. Comenzaremos escribiendo la estructura HTML de la p谩gina. Observa a continuaci贸n c贸mo dejamos espacio para una lista no ordenada, pero a煤n no agregamos elementos a ella. Tambi茅n observa que agregamos un enlace atasks.js, donde escribiremos nuestro JavaScript.
Ahora, aqu铆 est谩 nuestro c贸digo que podemos mantener entasks.js. Algunas notas sobre lo que ver谩s a continuaci贸n:
Este c贸digo es ligeramente diferente al c贸digo de la conferencia. Aqu铆, solo consultamos nuestro bot贸n de env铆o y el campo de entrada de tareas una vez al principio y almacenamos esos dos valores en las variables submit y newTask.
Podemos habilitar/deshabilitar un bot贸n estableciendo su atributo disabled en false/true.
En JavaScript, usamos.lengthpara encontrar la longitud de objetos como cadenas y arreglos.
Al final del script, agregamos la l铆nea return false. Esto evita la presentaci贸n predeterminada del formulario, que implica recargar la p谩gina actual o redirigir a una nueva.
En JavaScript, podemos crear elementos HTML utilizando la funci贸ncreateElement. Luego, podemos agregar esos elementos al DOM utilizando la funci贸nappend.
javascript
1// Espera a que el DOM est茅 completamente cargado antes de ejecutar el c贸digo
Adem谩s de especificar que las funciones se ejecutan cuando se desencadena un evento, tambi茅n podemos programar funciones para que se ejecuten despu茅s de un per铆odo de tiempo determinado. Por ejemplo, volvamos al script de nuestra p谩gina de contador y agreguemos un intervalo para que, incluso si el usuario no hace clic en nada, el contador se incremente cada segundo. Para hacer esto, utilizamos la funci贸nsetIntervals, que toma como argumento una funci贸n que se ejecutar谩 y un intervalo de tiempo (en milisegundos) entre las ejecuciones de la funci贸n.
Una cosa a notar sobre todos nuestros sitios hasta ahora es que cada vez que recargamos la p谩gina, toda nuestra informaci贸n se pierde. El color del encabezado vuelve a ser negro, el contador vuelve a 0 y todas las tareas se borran. A veces esto es lo que pretendemos, pero otras veces querremos poder almacenar informaci贸n que podamos utilizar cuando un usuario regrese al sitio.
Una forma de hacerlo es utilizando el Almacenamiento Local (Local Storage), es decir, almacenar informaci贸n en el navegador web del usuario que podamos acceder m谩s tarde. Esta informaci贸n se almacena como un conjunto de pares clave-valor, casi como un diccionario en Python. Para utilizar el almacenamiento local, utilizaremos dos funciones clave:
localStorage.getItem(key): Esta funci贸n busca una entrada en el almacenamiento local con una clave dada y devuelve el valor asociado con esa clave.
localStorage.setItem(key, value): Esta funci贸n establece una entrada en el almacenamiento local, asociando la clave con un nuevo valor.
Veamos c贸mo podemos usar estas nuevas funciones para actualizar nuestro contador. En el c贸digo a continuaci贸n,
javascript
1// Verificar si ya existe un valor en el almacenamiento local
2if(!localStorage.getItem('counter')){
3
4// Si no existe, establecer el contador en 0 en el almacenamiento local
5localStorage.setItem('counter',0);
6}
7
8functioncount(){
9// Recuperar el valor del contador desde el almacenamiento local
las APIs (Interfaz de Programaci贸n de Aplicaciones) pueden referirse a diversas interfaces que permiten a los desarrolladores interactuar con funciones espec铆ficas de plataformas, navegadores web u otros servicios. A continuaci贸n, se mencionan algunos tipos comunes de APIs en el contexto de JavaScript:
APIs del Navegador (Web APIs):Los navegadores web proporcionan una serie de APIs que permiten a los desarrolladores interactuar con funciones espec铆ficas del navegador. Algunas de las APIs del navegador m谩s comunes incluyen:
DOM API: Para manipular la estructura del documento HTML y XML.
XMLHttpRequest / Fetch API: Para realizar solicitudes HTTP desde el navegador.
Geolocation API: Para acceder a la ubicaci贸n del usuario.
Canvas API: Para dibujar gr谩ficos en el navegador.
Web Storage API: Para almacenar datos localmente en el navegador.
APIs de terceros:Muchos servicios externos ofrecen APIs que permiten a los desarrolladores interactuar con sus plataformas y acceder a sus datos. Ejemplos incluyen:
API de Twitter: Para acceder a datos de Twitter.
API de Google Maps: Para integrar mapas en una aplicaci贸n.
API de OpenWeatherMap: Para obtener datos meteorol贸gicos.
Node.js APIs:En el entorno del servidor con Node.js, existen APIs incorporadas para realizar operaciones de entrada/salida, manejar eventos y m谩s.
File System API: Para interactuar con el sistema de archivos.
HTTP / HTTPS API: Para crear servidores y realizar solicitudes HTTP.
EventEmitter API: Para trabajar con eventos.
APIs de Base de DatosAl trabajar con bases de datos, se utilizan APIs espec铆ficas para interactuar con la base de datos. Por ejemplo:
MongoDB tiene su propia API para interactuar con bases de datos NoSQL.
MySQL proporciona una API para trabajar con bases de datos relacionales.
APIs de Servicios en la NubeMuchos servicios en la nube ofrecen APIs para interactuar con sus servicios. Ejemplos incluyen:
AWS SDK: Para interactuar con los servicios de Amazon Web Services.
Google Cloud Client Libraries: Para acceder a servicios en la nube de Google.
RESTful APIs y GraphQL:Muchas aplicaciones web modernas utilizan APIs RESTful o GraphQL para la comunicaci贸n entre el cliente y el servidor.
Estas son solo algunas categor铆as de APIs en el contexto de JavaScript. La elecci贸n de una API espec铆fica depender谩 del tipo de desarrollo que est茅s realizando y de los servicios con los que necesitas interactuar.
Unobjeto de JavaScriptes muy similar a un diccionario en Python, ya que nos permite almacenar pares clave-valor. Por ejemplo, podr铆a crear un objeto de JavaScript que represente a Harry Potter:
javascript
1const harryPotter ={
2name:"Harry Potter",
3age:17,
4house:"Gryffindor",
5wand:"Holly and phoenix feather, 11 inches",
6friends:["Hermione Granger","Ron Weasley"],
7isWizard:true
8};
Puedo acceder o cambiar partes de este objeto utilizando tanto la notaci贸n de corchetes como la notaci贸n de punto:
javascript
1console.log(harryPotter.name);// Muestra "Harry Potter"
2console.log(harryPotter.age);// Muestra 17
Acceder a los valores utilizando la notaci贸n de corchetes:
javascript
1console.log(harryPotter['name']);// Muestra "Harry Potter"
2console.log(harryPotter['age']);// Muestra 17
Otro ejemplo:
javascript
1let person ={
2first:'Harry',
3last:'Potter'
4};
Una forma en la que los objetos de JavaScript son realmente 煤tiles es en la transferencia de datos de un sitio a otro, especialmente al usarAPIs.
Una API, o Interfaz de Programaci贸n de Aplicaciones, es una forma estructurada de comunicaci贸n entre dos aplicaciones diferentes.
Por ejemplo, es posible que deseemos que nuestra aplicaci贸n obtenga informaci贸n de Google Maps, Amazon o alg煤n servicio meteorol贸gico. Podemos hacer esto realizando llamadas a la API de un servicio, la cual nos devolver谩 datos estructurados, a menudo en formato JSON(Notaci贸n de Objetos JavaScript). Por ejemplo, un vuelo en formatoJSONpodr铆a verse as铆:
javascript
1{
2"origin":"New York",
3"destination":"London",
4"duration":415
5}
Los valores dentro de un JSON no tienen por qu茅 ser solo cadenas y n煤meros, como en el ejemplo anterior. Tambi茅n podemos almacenar listas o incluso otros objetos de JavaScript:
javascript
1{
2"flightNumber":"A123",
3"departureCity":"New York",
4"arrivalCity":"Los Angeles",
5"passengers":["Alice","Bob","Charlie"],
6"aircraft":{
7"model":"Boeing 747",
8"seats":400
9}
10}
Cambio de moneda
Para mostrar c贸mo podemos usar API en nuestras aplicaciones, trabajemos en la construcci贸n de una aplicaci贸n donde podemos encontrar tasas de cambio entre dos monedas. A lo largo del ejercicio, utilizaremos la API de tipos de cambio delBanco Central Europeo. Si visitas su sitio web, ver谩s la documentaci贸n de la API, que generalmente es un buen lugar para comenzar cuando deseas utilizar una API. Podemos probar esta API visitando la URL:https://api.exchangeratesapi.io/latest?base=USD. Cuando visites esta p谩gina, ver谩s la tasa de cambio entre el d贸lar estadounidense y muchas otras monedas, escrita en formato JSON. Tambi茅n puedes cambiar el par谩metro GET en la URL de USD a cualquier otro c贸digo de moneda para cambiar las tasas que obtienes.
Echemos un vistazo a c贸mo implementar esta API en una aplicaci贸n creando un nuevo archivo HTML llamado "currency.html" y vincul谩ndolo a un archivo JavaScript, pero dejemos el cuerpo del archivo HTML vac铆o:
html
1<!DOCTYPEhtml>
2<htmllang="en">
3<head>
4<title>Currency Exchange</title>
5<scriptsrc="currency.js"></script>
6</head>
7<body></body>
8</html>
Ahora, utilizaremos algo llamado AJAX, o Asynchronous JavaScript And XML (JavaScript y XML asincr贸nicos), que nos permite acceder a informaci贸n de p谩ginas externas incluso despu茅s de que nuestra p谩gina se haya cargado. Para hacerlo, utilizaremos la funci贸n fetch, que nos permitir谩 enviar una solicitudHTTP. La funci贸n fetch devuelve una promesa. No entraremos en detalles sobre qu茅 es una promesa aqu铆, pero podemos pensar en ella como un valor que llegar谩 en alg煤n momento, pero no necesariamente de inmediato. Tratamos con promesas proporcion谩ndoles un atributo.thenque describe qu茅 hacer cuando obtenemos una respuesta. El fragmento de c贸digo a continuaci贸n registrar谩 nuestra respuesta en la consola.
Un punto importante sobre el c贸digo anterior es que el argumento de .then siempre es una funci贸n. Aunque parece que estamos creando las variables response y data, en realidad son los par谩metros de dos funciones an贸nimas.
En lugar de simplemente registrar estos datos, podemos usar JavaScript para mostrar un mensaje en la pantalla, como se muestra en el siguiente c贸digo:
11document.querySelector('body').innerHTML=`1 USD es igual a ${tasaDeCambio.toFixed(3)} EUR.`;
12});
13});
Ahora, vamos a hacer que el sitio sea un poco m谩s interactivo al permitir que el usuario elija la moneda que le gustar铆a ver. Comenzaremos modificando nuestro HTML para permitir al usuario ingresar una moneda:
Ahora, haremos algunos cambios en nuestro JavaScript para que solo se actualice cuando se env铆e el formulario y para que tenga en cuenta la entrada del usuario. Tambi茅n agregaremos algunas verificaciones de errores aqu铆:
M谩s adelante vamos a ver como uso este ejemplo de API routes de Next.js donde actualizo los datos desde Google Sheets (Como base de datos din谩mica), haciendo un fetch del link del archivo.csvel cual podemos actualizar los valores de las divisas.
En esta secci贸n, nos centraremos en la creaci贸n de un endpoint API con la capacidad 煤nica de actualizarse din谩micamente desde Google Sheets. Esto significa que los cambios realizados en la hoja de c谩lculo se reflejar谩n autom谩ticamente en la API. Al finalizar, tendremos una API robusta y flexible que se mantiene actualizada mediante Google Sheets, mejorando la usabilidad y proporcionando informaci贸n precisa de las tasas de cambio. La conexi贸n din谩mica asegura la actualizaci贸n en tiempo real, mejorando la confiabilidad de los datos y brindando a los usuarios una experiencia m谩s actualizada. La gesti贸n eficiente de las variaciones monetarias en Google Sheets simplifica la tarea de mantener la informaci贸n actualizada sin necesidad de conocimientos t茅cnicos especializados.
Empezamos
Si estamos en un proyecto con librer铆as como React y usando de frame Nextjs, dentro de la carpetasrcvamos a crear una carpeta llamadaapiy luego dentro de ella un archivocurrency.jsque lo vamos a programar despu茅s, primero vamos nuestra hoja de c谩lculos deGoogle Sheets
En esta hoja de c谩lculos, vamos hacer un ejemplo r谩pido. Ustedes lo pueden completar con m谩s datos si quieren y necesitan.
Seleccionamos hoja de c谩lculo en blanco, y podemos visualizar de la siuiente manera el documento:
En la primera fila de nuestra hoja de c谩lculo en Google Sheets, asignaremos nombres espec铆ficos a cada columna, los cuales actuar谩n como nombres que ser谩n referenciados desde nuestro c贸digo en JavaScript. Estos nombres proporcionar谩n una manera organizada y significativa de identificar y acceder a los datos correspondientes en la hoja de c谩lculo.
En este caso he usadocurrency, rates y updatelos cuales en currency o divisa en espa帽ol, ir铆an los nombres en may煤sculas de las divisas abreviadas. En el ejemplo tenemos:ARS - BRL - EUR - GBP - BTC - COP - JPY - CHP - UYP - BBP - PGP
Evidentemente esto se podr铆a llenar con todas las divisas que faltan, pero se lo dejo a criterio de cada uno. Para buscar los precios actualizados ya sabemos d贸nde ir a buscar:
En la columnaupdatepodemos poner la fecha de nuestra 煤ltima actualizaci贸n.
Para exportar el documento en formato.csvseguimos estos pasos:
Una vez creada nuestra tabla, podemos acceder a ella mediante la opci贸n de Google para compartir y publicar en la web. Vamos a la opci贸n deArchivo=>Compartir=>Publicar en la Web.
A continuaci贸n nos aparecer谩 una ventana como 茅sta:
Seleccionamos valores separados por comas que es un archivo.csvy le damos enPublicar.
Esto nos generar谩 un link con nuestro archivo de google sheets en formato.csvpara poder requerirlo en nestra aplicaci贸n web. A continuaci贸n veremos lo siguiente:
Una vez tenemos nuestro link, lo podemos pegar en unaconstcomo lo tengo en mi caso:
La funci贸ndataFetches una funci贸n as铆ncrona que espera una respuesta.
La constanteresponsesiempre que sea as铆ncrona, espera una respuesta como promesa, por lo que debe incluir unawait.
La constantecsvDatatambien debe incluir unawaity la respuesta la convertimos en texto con la funci贸ntext().
Manejamos la respuesta de los datos, si la respuesta no es correctaif (!response.ok)arrojamos un errorthrow new Error()
La constanteparsedDatale asigna el valor de csvData, que se supone que es una cadena que contiene datos en formato CSV. Para poder manipularlo de la siguiente manera:
.split('\n'): Utiliza el m茅todo split para dividir la cadena en un array de strings, utilizando el salto de l铆nea ('\n') como separador. Esto crea un array donde cada elemento es una l铆nea del CSV.
.slice(1): Utiliza el m茅todo slice para eliminar la primera l铆nea del array (铆ndice 0), que generalmente es la cabecera del CSV.
.map((row) => {...}): Utiliza el m茅todo map para iterar sobre cada l铆nea del CSV y realizar operaciones en cada una.
La constanteitems = [currency, rates, update] = row.split(','): Divide cada l铆nea en elementos utilizando la coma como separador y asigna cada elemento a las variables currency, rates, y update. La notaci贸n[currency, rates, update]crea un array y asigna cada elemento a las variables correspondientes.
.map((item) => item.trim()): Para cada elemento en el array creado en el paso anterior, utiliza map nuevamente para eliminar los espacios en blanco al principio y al final de cada elemento mediante el m茅todotrim().
return { currency, rates: parsedFloat(), update }: Retorna un objeto con las propiedades currency, rates, y update, utilizando los valores de las variables currency, rates, y update que se asignaron anteriormente, y al valor rates se convierte de un valor decimal a un valor flotante con la funci贸nparsedFloat().
Por 煤ltimo devolvemos los datos analizados con unreturn parsedData
Bien hasta aqu铆 tenemos la funci贸n para traer la informaci贸n de nestra tabla de datos en Google Sheets. Normalmente un archivo para crear un endpoint API empieza de la siguiente manera:
javascript
1exportdefaultasyncfunctionapiExample(req, res){
2try{
3 res.status(200).json({
4succes:true,
5timestamp:newDate().toLocaleDateString('es-Es',{
6year:'numeric',
7month:'long',
8day:'2-digit',
9hour:'2-digit',
10minute:'2-digit',
11}),
12base:'USD',
13rates:{
14ARS:'857.39',
15EUR:'0.93',
16GBP:'0.79',
17BRL:'4.95',
18COP:'3939',
19JPY:'149',
20BTC:'0.000002',
21CHP:'970',
22UYP:'39.06',
23BBP:'6.9',
24PGP:'7280',
25AUD:'1.29',
26CAD:'1.25',
27INR:'74.93',
28MXN:'20.27',
29NZD:'1.37',
30SGD:'1.34',
31ZAR:'15.46',
32CNY:'6.43',
33HKD:'7.78',
34KRW:'1177.50',
35TRY:'9.35',
36IDR:'14220',
37RUB:'75.85',
38SEK:'8.60',
39CHF:'0.91',
40NOK:'9.15',
41},
42});
43}catch(error){
44console.error('Error en el fetching y procesamientos de los datos:', error);
45 res.status(500).json({success:false,error:'Error interno del Servidor'});
46}
47}
Esto nos permite crear un API endpoint con el siguienteJSON, pueden chequear la APIaqu铆, veremos el siguiente resultado:
Listo esta es la forma m谩s r谩pida de crear una API, podr铆amos hacer unfetchde estos datos en cualquier componente que creemos para la obtenci贸n de estos datos, pero dijimos que 铆bamos hacerla un poco m谩s compleja para que sea m谩s eficiente la forma de actualizar los datos sin estar sentados detr谩s de nuestro editor de c贸digo favorito!
Bien, vamos a hacer nuestro archivocurrency.js m谩s completo, manejando los arrays de manera eficiente. 驴C贸mo lo hacemos? Para ello, utilizaremos nuestro acumulador que es la funci贸n.reduce, que nos permite acumular los elementos de un array y convertirlo en un objeto:
La constantecurrencyData:Aqu铆 se utiliza la palabra clave await para esperar a que la funci贸n fetchData() se resuelva antes de continuar con la ejecuci贸n del c贸digo.
La constantelastUpdate: Se verifica si currencyData tiene elementos. Si es as铆, se asigna el valor de la propiedad update del primer elemento de currencyData a la variable lastUpdate. Si no hay elementos, se asigna una cadena vac铆a a lastUpdate.
En la constanteratesObject: Se utiliza el m茅todoreducepara convertir el arraycurrencyDataen un objeto llamadoratesObject. La funci贸n.reducetoma una funci贸n de retorno de llamada y un valor inicial, en este caso, un objeto vac铆o{}y realiza una operaci贸n acumulativa sobre cada elemento del array. La funci贸n de retorno de llamada recibe dos par谩metros:acc(el acumulador) y un elemento desestructurado{(currency, rates)}del array. En cada iteraci贸n, se agrega una nueva propiedad al objetoacc, donde la clave escurrencyy el valor esrates. Al final, reduce devuelve el objeto acc, que ahora contiene todas las tasas de cambio organizadas por su moneda.
Luego nos queda crear elJSONcon los datos obtenidos de Google Sheets.
javascript
1res.status(200).json({
2success:true,
3timestamp:newDate().toLocaleDateString('es-Es,{
4year:"numeric",
5month:"2 digits",
6day:"2 digits",
7})
8 base 'USD',
9update: lastUpdate,
10rates: ratesObjetc // Nuestro objeto de arrays
11})
Bien con esto ya seremos capaces de tener nuestra API que se podr谩 actualizar desde una hoja de c谩lculos en Google Sheets, no olviden de hacer untryy un catchpara manejar errores en bloques de c贸digo. Nos quedar铆a de la siguiente forma:
49console.error('Error fetching and processing currency data:', error);
50 res.status(500).json({success:false,error:'Internal Server Error'});
51}
52}
Por 煤ltimo nos queda poder recibir estos datos en nuestro componente, creamos en nuestra carpeta馃搧componentsun archivo llamado por ejemploCurrencyComponent.js
javascript
1//CurrencyComponent.js
2
3import{ useState, useEffect }from'react';
4
5constDataCurrency=()=>{
6const[currency, setCurrency]=useState('');
7
8useEffect(()=>{
9constdataFetch=async()=>{
10const response =awaitfetch('/api/currency');
11const data =await response.json();
12setCurrency(data);
13};
14
15dataFetch();
16},[]);
17
18return(
19<>
20{/* HTML... */}
21</>
22)
23};
Con esta informaci贸n ya podremos recibir nuestroJSONpero tendremos que devolver en unHTMLlo siguiente:
Este ejemplo muestra c贸mo recibir y procesar datos en un componente React utilizando la informaci贸n obtenida de una API. Dependiendo de nuestras necesidades espec铆ficas, podemos adaptar la visualizaci贸n de estos datos. En este caso, los datos provienen de la API/api/currencyy lo veremos as铆:
Divisas hoy
Tipo de Cambio
Actualizaci贸n:
隆Eso es todo para este curso deJs! La pr贸xima vez, trabajar茅 para crear interfaces de usuario a煤n m谩s atractivas.