Curso Fullstack Python: Codo A Codo 4.0
Curso Fullstack Python: Codo A Codo 4.0
Python
Codo a Codo 4.0
VUE
VUE.js
VUE.js
Con JavaScript nos encontramos que para hacer varias cosas necesitamos de mucho tiempo,
esfuerzo y muchas líneas de código. Así como Bootstrap era un framework que me permitía
resolver muy fácilmente cuestiones de estilos y estructuras, Vue me va a permitir resolver
varias cuestiones del comportamiento porque es un framework exclusivo de JS.
Nos permitirá conectarnos con mi documento HTML en forma sencilla y podremos realizar
cosas que desde JS puro y HTML implicarían un mayor esfuerzo.
Resulta un primer paso para otros frameworks de desarrollo de JS como pueden ser Angular
y React, que requieren un paso más.
VUE está enfocado para armar aplicaciones de Single Page (esas que permiten navegar todo
en una sola página). La idea de VUE es, por ejemplo, que no se tenga que cargar toda la
información de una, que no se carguen todos los comentarios en un posteo, sino lo más
relevante y a medida que vaya bajando se vayan cargando. Podemos actualizar partes del
documento, y no toda la página que ahorra tiempo y recursos.
No nos sirve de nada ver un Framework si no tenemos las bases de JS, porque necesitamos los
conocimientos previos.
VUE.js
Es un framework de JavaScript. La primera versión se lanzó en febrero de 2014.
Vue (pronunciado /vjuː/, como view) es un framework progresivo de código abierto que se
utiliza para desarrollar interfaces Web interactivas. A diferencia de otros frameworks, Vue
está diseñado desde cero para ser utilizado incrementalmente y simplificar el desarrollo.
La librería central está enfocada solo en la capa de visualización, y es fácil de utilizar e
integrar con otras librerías o proyectos existentes en desarrollos front-end.
Por otro lado, Vue también es perfectamente capaz de impulsar sofisticadas Single-Page
Applications (SPA) cuando se utiliza en combinación con herramientas modernas y librerías
de apoyo.
Las SPA son como una “sábana” donde a medida que vamos scrolleando nos movemos a
distintas secciones de la misma página. El contenido no se va a cargar en forma completa, ya
que es poco eficiente, repercute en la experiencia de usuario que va a esperar que se cargue
todo el contenido cuando en realidad quiere ver lo que ya cargó.
Ejemplo: si un influencer tiene 10000 comentarios en cada posteo no los vamos a cargar todos juntos,
sino que vamos a dividir por partes el documento HTML de forma tal que la información relevante se
la cargue rápido al usuario.
DOM Virtual
Vue.js utiliza DOM virtual, que también es utilizado por otros frameworks como React,
Ember, etc.
Los cambios no se realizan en el DOM, sino que se crea una réplica del DOM que está
presente en forma de estructuras de datos JavaScript. Siempre que se deben realizar
cambios, se realizan en las estructuras de datos de JavaScript y esta última se compara con
la estructura de datos original.
Luego, los cambios finales se actualizan al DOM real, que el usuario verá cambiar. Esto es
bueno en términos de optimización, es menos costoso y los cambios se pueden realizar a un
ritmo más rápido.
Desde JS haremos cambios en las estructuras de datos propias de JS, esa copia la va a
comparar con el DOM y sólo va actualizar los cambios. Aquí radica la gran ventaja de
trabajar con VUE, porque si tuviese que actualizar todo repercutiría en la performance.
Modelo de enlazado de datos
Es la forma a través de la cual JavaScript se conecta (enlaza, comunica) con Vue.js., permitiendo
comunicar el documento HTML con JS.
Data binding: A través de la función de data binding podremos manipular o asignar valores a
atributos HTML, cambiar el estilo, asignar clases con la ayuda de la directiva de enlace v-bind.
0. Body
0
1. Header
2. Main 3. Aside
2.1. Article 1 2 3
3.1. Public1
3.2. Public2
2.2. Article 3.3. Public3
IMPORTANTE: Debemos colocar la referencia al CDN al final del <body> y antes de la referencia
a nuestro archivo .js
const app= new Vue({ JS Esta constante me conecta VUE con mi HTML y tiene
un objeto de tipo VUE. Dentro de las llaves voy a
}) tener propiedades y valores.
Los datos y el DOM ahora están vinculados, y ahora todo es reactivo (sólo se modifica ante los cambios).
Si cambio el valor de app.message a un valor diferente, debería ver que el ejemplo se ha renderizado con
el nuevo valor que acaba de ingresar.
Directivas
Vue utiliza directivas para aplicar un comportamiento especial al DOM. Las directivas nos permiten
enlazar VUE con nuestro HTML pero con los atributos de las etiquetas, no solo con el contenido.
Las directivas tienen el prefijo v- para indicar que son atributos especiales proporcionados por Vue.
• v-text: https://es.vuejs.org/v2/api/#v-text
• v-bind: https://es.vuejs.org/v2/api/#v-bind
• v-if, v-else, v-elseif: https://es.vuejs.org/v2/api/#v-if
• v-for: https://es.vuejs.org/v2/api/#v-for
• v-show: https://es.vuejs.org/v2/api/#v-show
• v-model: https://es.vuejs.org/v2/api/#v-model
HTML
<li v-for="fruta in frutas">
{{ fruta.nombre }} - {{ fruta.cantidad }} <span v-if="fruta.cantidad===0"> - S
in Stock</span>
</li>
Cuando dentro del array la propiedad cantidad del elemento fruta sea igual a
0 se mostraré el texto “Sin Stock”
El v-for iterará sobre cada elemento y determinará con los condicionales cuál es la situación de cada
elemento (sin Stock Stock Bajo o Stock Alto)
Así como tenemos datos / información asociada a mi instancia también podemos tener métodos o
funciones:
methods: { JS
agregarFruta(){
this.frutas.push({ nombre: this.nuevaFruta, cantidad: 0 })
}
}
Crearemos un método que utilizará el método push para agregar un nuevo elemento al array de
objetos (frutas) de la misma manera que fueron agregadas antes, con los pares clave: valor
(respetando la estructura). El nombre de la fruta es el de nuevaFruta (propiedad de la instancia de
VUE) y utilizamos el this para hacer referencia, justamente, a esa instancia. Además sumamos que la
nuevaFruta inicie con cantidad 0.
Agregando elementos a la instancia VUE
En el documento HTML agregaremos un input y un botón para agregar la fruta que deseamos al
array de objetos:
HTML
<input type="text" v-model="nuevaFruta">
<button v-on:click=agregarFruta()>Clic para agregar fruta</button>
2. En JS el método agregarFruta() utilizaba un push para agregar esa nueva fruta al array de objetos.
3. Además, a través de la directiva v-model se conectan el input con la propiedad de la instancia de VUE. Lo
que suceda en el input se va a ver reflejado en la propiedad y viceversa (comunicación bidireccional).
Agregando elementos a la instancia VUE
Una mejora que se puede hacer es que se limpie la caja de texto cuando agregamos un elemento.
Esto se logra agregando en el método agregarFruta() esta instrucción:
this.nuevaFruta= ''; JS
Podemos hacer una mejora para que no nos permita agregar una fruta hasta que no se haya
completado la caja de texto:
agregarFrutaConIF(){ JS
if (this.nuevaFruta != "") {
this.frutas.push({ nombre: this.nuevaFruta, cantidad: 0 });
this.nuevaFruta= '';
}
Fuente: https://vuejs.org/v2/guide/events.html#Key-Modifiers
computed: { JS
sumarFrutas() {//Muestra sumatoria total de cantidades de frutas.
this.total = 0;
for (fruta of this.frutas) {
this.total += fruta.cantidad; //acumulador
}
El for recorrerá las cantidades del array frutas. Se
return this.total; utiliza fruta.cantidad y se va agregando a total con
} this.total +=fruta.cantidad;. Además hay un return que
} devuelve el total.
<ul> JS
<li v-for="fruta in frutas">
{{ fruta.nombre }} - <input type="number" v-model.number="fruta.cantidad">
</li>
</ul>
<h4>Total: {{sumarFrutas}}</h4>
JS HTML
Vue.component('saludo', { JS
template: "<h1>Hola (estático desde template)</h1>"
})
Como primer parámetro le paso el nombre del componente y como segundo parámetro el objeto.
Template es una de las propiedades más importantes de los componentes.
Sin embargo, esta referencia es estática. Cuando trabajamos con componentes al data, que se
agregaba como propiedad en la instancia de VUE, lo vamos a incluir en el propio componente (antes
data era una propiedad de la instancia de VUE, pero a la vez era un objeto con propiedades).
Creación de componentes
Entonces data ahora será un método que retorna un valor, por ejemplo otro saludo:
<div id="app">
<saludo></saludo>
<saludodos></saludodos>
</div>
Utilizar el template de esta forma nos limita a una única línea. Si queremos poner más de una línea
en HTML utilizaremos los backticks (comillas invertidas).
Creación de componentes
Con las comillas invertidas podremos escribir más de una línea. Es importante también saber que
los templates deben ir dentro de un contenedor (en este caso un div):
Vue.component('saludotres', { JS
template: `
<div>
<h1>{{msj}}</h1>
<h2>{{titulo}}</h2>
</div>
`,
data(){
return {
msj: 'Hola (dinámica y como componente)',
titulo: "Título dinámico"
}
}
})
Creamos un componente llamado contador que lo vinculamos con la etiqueta homónima. Este componente
tiene tres líneas: un h3 que contiene un texto fijo y un elemento variable que se incrementa de acuerdo a la
instrucción que tiene cada botón para incrementar o decrementar de a 1.
JSON: JavaScript Object Notation
JSON es una sintaxis propia de objetos tipo JavaScript utilizada para almacenar e intercambiar
datos. Es texto, escrito con notación de objetos JavaScript, con un formato determinado.
Intercambio de datos
Al intercambiar datos entre un navegador y un servidor, los datos solo pueden ser texto.
Dado que JSON trabaja como texto podemos convertir cualquier objeto JavaScript en JSON y
enviar JSON al servidor. También podemos convertir cualquier JSON recibido del servidor en
objetos JavaScript. De esta forma podemos trabajar con los datos como objetos JavaScript, sin
complicados análisis ni traducciones.
Si tiene datos almacenados en un objeto JavaScript, puede convertir el objeto en JSON con
JSON.stringify( ):
Si tiene datos almacenados en un JSON, puede convertir el objeto en JavaSCript con JSON.parse(
):
var myObj1=JSON.parse(myJSON)); JS
//myObj1= { name: "John", age: 31, city: "New York" }
JSON: JavaScript Object Notation
Reglas de sintaxis JSON:
En JSON , los valores deben ser uno de los siguientes tipos de datos:
• string
• number
• object (JSON object)
• array
• boolean
• null
El tipo de archivo de los archivos JSON es ".json"
JSON: JavaScript Object Notation
// Ejemplo de JSON JSON
{
"employees": [
{ "firstName": "John", "lastName": "Doe" },
{ "firstName": "Anna", "lastName": "Smith" },
{ "firstName": "Peter", "lastName": "Jones" }
]
} 1er ejemplo: En la propiedad “empleados”
// Otro ejemplo: hay un array de 3 elementos y dentro de
{ cada uno tengo objetos separados por
"firstName": "John", comas. Cada objeto tiene un primer
"lastName": "Doe", nombre y un apellido.
"middlename": null, 2do ejemplo: Vemos que el objeto JSON
tiene un primer nombre asociado, junto con
"edad": 30, otras propiedades. Además hay una
"Hijos": ["John", "Anna", "Peter"] propiedad Hijos que a su vez tiene un array.
}
Muestra datos de usuarios aleatorios, se utiliza para hacer pruebas. Es un string de JSON con un
formato particular. Devuelve un usuario aleatorio, un array con un solo elemento.
Conviene leerlo desde Firefox Developer Edition, ya que la visualización es más simple.
Nosotros podremos consumir la API, esto quiere decir leerla y traerla a nuestra aplicación.
Fetch
La API Fetch proporciona una interfaz JavaScript para acceder y manipular partes del canal HTTP, tales
como peticiones y respuestas.
También provee un método global fetch() que proporciona una forma fácil y lógica de obtener recursos de
forma asíncrona por la red.
fetch('https://api.coindesk.com/v1/bpi/currentprice.json') JS
.then(response => response.json())
.then(data => console.log(data));
Aquí estamos recuperando un archivo JSON a través de red y mostrando en la consola. El uso de fetch()
más simple toma un argumento (la ruta del recurso que quieres buscas) y devuelve un objeto Promise
conteniendo la respuesta, un objeto Response.
Esto es, por supuesto, una respuesta HTTP no el archivo JSON. Para extraer el contenido en el cuerpo del
JSON desde la respuesta, usamos el método json()
Fetch
Con Fetch, así como podemos leer información que proviene de una API externa vamos a poder
leer un archivo de texto y mostrarlo por consola.
En el siguiente ejemplo utilizamos clases de Bootstrap y dentro del body incorporaremos dos
etiquetas divs: la primera para el título y el botón que me permitirá traer el contenido y la segunda
para el contenido en cuestión:
<div class="container my-5 text-center"> HTML
<h1>Ejemplo Fetch</h1>
<button class="btn-danger w-100" onclick="traer()">Obtener</button>
</div>
<div class="mt-5" id="contenido">
<!-- Insertaremos contenido del archivo de texto para utilizar Fetch -->
</div>
Archivo de texto
Ejemplo final
4 ID del user
Desde la APP (1) hacemos una solicitud, vamos a traer información de la API externa. Esa API me
devuelve información (2). Luego, en función de la respuesta que nos dio la API vamos a hacer otra
solicitud (3) y esperar la respuesta (4). Lo que está en rojo dependerá de que ocurra lo que está en
azul. La segunda respuesta depende de la primera.
Por ejemplo: podríamos pedir información de un posteo de Twitter, que lo devuelva pero luego
pedir información del usuario que hizo ese posteo, para lo cual pido el ID de referencia del usuario
donde podré ver sus datos.
Ver ejemplo fetch-then (.html y .js)
Otro ejemplo de uso de Fetch con API externa
Para este ejemplo aprovecharemos la estructura de tipo JSON que nos ofrece
https://jsonplaceholder.typicode.com/posts
try {
//Instrucciones que pueden dar error
} catch (error) {
//Acciones en caso de error
}
Estructura básica de try…catch
Más información:
https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Statements/async_function
https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Statements/try...catch
Fetch Async Await y manejo de errores
Indicamos que la función
// Asincrónico será asincrónica JS
const getNombre = async (idPost) => {
try {
const resPost = await fetch(`https://jsonplaceholder.typicode.com/posts/${idPost}`)
const post = await resPost.json() Pedimos que espere la
estructura
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.21.1/axios.min
.js"></script>
<script src="async-await-axios.js"></script>
Para trabajar con Axios aprovecharemos el ejemplo anterior, donde vamos a tener una
función asincrónica, vamos a seguir manejando errores pero a diferencia de la anterior vamos
a recibir la respuesta pero no se la vamos a pedir a Fetch, sino que se la vamos a pedir a Axios.
Librería Axios
// Asincrónico con Axios JS
const getNombre = async (idPost) => {
try {
const resPost = await axios(`https://jsonplaceholder.typicode.com/posts/${idPost}`)
console.log(resPost); //traemos el objeto completo
console.log(resPost.data.userId); //traemos solo el userID, guardado dentro de data
¿Qué cambia con respecto al ejemplo anterior? En primer lugar utilizamos la librería Axios en
vez de Fetch y ya no necesitamos convertir a JSON, sino que directamente vamos a poder
acceder al dato a través de la respuesta. Haremos referencia al objeto data para obtener el
userID. Haremos lo mismo para pedir los datos del usuario.
Ver ejemplo async-await-axios (.html y .js)
SPA: Single Page Application
SPA es un tipo de aplicación web donde todas las pantallas las muestra en la misma página, sin
recargar el navegador.
Técnicamente, una SPA es un sitio donde existe un único punto de entrada, generalmente el
archivo index.html. En la aplicación no hay ningún otro archivo HTML al que se pueda acceder de
manera separada y que nos muestre un contenido o parte de la aplicación, toda la acción se
produce dentro del mismo index.html.
Para ampliar:
¿Qué es una web SPA? - Single Page Application:
https://www.youtube.com/watch?v=Fr5QGdJZBVo
Ejemplos, cursos y guías de VUE.js. APIS
• Guía de VUE,js: https://es.vuejs.org/v2/guide/index.html#
• Ejemplos VUE: https://vuejsexamples.com/
• Escuela VUE: https://escuelavue.es/series/
• ¿Qué son las APIs y para qué sirven?: https://youtu.be/u2Ms34GE14U
• Curso de Vue JS - Tutorial en Español [Desde Cero]:
https://www.youtube.com/playlist?list=PLPl81lqbj-4J-gfAERGDCdOQtVgRhSvIT
• VUE Mastery (curso): https://www.vuemastery.com/courses/intro-to-vue-js/vue-instance/
• It-brain – Tutorial de VUE.js: https://es.it-brain.online/tutorial/vuejs/vuejs_overview/
• Lenguaje JS - ¿Qué es VUE?: https://lenguajejs.com/vuejs/introduccion/que-es-vue/