Full Miraclelab Slides
Full Miraclelab Slides
MiracleLab
Luciano Diamand
1/697
Javascript
Javascript
Luciano Diamand
2/697
Javascript
Historia
3/697
Historia
4/697
Historia cont.
5/697
Historia cont.
6/697
Historia cont.
7/697
Historia cont.
8/697
Más información
▶ Historia (https://en.wikipedia.org/wiki/JavaScript)
▶ Modo estricto (https://developer.mozilla.org/es/docs/Web/JavaScript/
Reference/Strict_mode)
▶ Transición a modo estricto
(https://developer.mozilla.org/en-US/docs/Web/JavaScript/
Reference/Strict_mode/Transitioning_to_strict_mode)
▶ La guerra de los navegadores
(https://www.emezeta.com/articulos/browser-wars-la-historia-de-
la-guerra-de-navegadores)
▶ Estado de JS 2021 (https://2021.stateofjs.com/)
▶ El estado de Octoverse 2021 (https://octoverse.github.com/)
9/697
Javascript
Caracteristicas
10/697
Caracteristicas
▶ JavaScript es un lenguaje:
▶ Interpretado: Es un lenguaje de programación para el que la mayoría de sus
implementaciones ejecuta las instrucciones directamente, sin una previa compilación
del programa a instrucciones en lenguaje máquina
▶ Hilo único: Los lenguajes de programacion pueden ser de un único hilo o multi hilo.
JavaScript posee un único hilo de ejecución
▶ Tipado dinámico: Un lenguaje de programación tiene un sistema de tipos dinámico
cuando el tipo de dato de una variable puede cambiar en tiempo de ejecución. La
mayoría de los lenguajes de tipado dinámico son lenguajes interpretados
▶ Inferencia de tipos: Al decir a = 5 o a = "Hola mundo", JavaScript es capaz
de inferir el tipo de dato de una variable a partir del valor que se le está asignando
11/697
Introducción cont.
12/697
Más información
13/697
Javascript
Node.js
14/697
Introducción
15/697
Introducción cont.
▶ Cuando Node.js realiza una operación de E/S, como leer de la red, acceder a
una base de datos o al sistema de archivos, en lugar de bloquear el subproceso y
desperdiciar ciclos de CPU en espera, Node.js reanudará las operaciones cuando
regrese la respuesta
▶ Esto permite que Node.js maneje miles de conexiones simultáneas con un solo
servidor sin presentar la carga de administrar la concurrencia de subprocesos, lo
que podría ser una fuente importante de errores
16/697
Npm
17/697
Instalar Node.js
18/697
Instalar Node.js cont.
19/697
Diferencias entre Node.js y el Navegador
20/697
Diferencias entre Node.js y el Navegador cont.
21/697
Diferencias entre Node.js y el Navegador cont.
▶ Dado que JavaScript se mueve tan rápido, pero los navegadores pueden ser un
poco lentos para actualizar, a veces en la web se queda atascado con el uso de
versiones anteriores de JavaScript/ECMAScript
▶ Puede usar Babel para transformar su código para que sea compatible con ES5
antes de enviarlo al navegador, pero en Node.js, no necesitará eso
▶ Otra diferencia es que Node.js es compatible con los sistemas de módulos
CommonJS y ES (desde Node.js v12), mientras que en el navegador comenzamos
a ver que se implementa el estándar de módulos ES.
▶ En la práctica, esto significa que puede usar tanto require() como import en
Node.js, mientras que en el Navegador está limitado a import
▶ Referencia: https://nodejs.dev/learn
22/697
Recorrido por JavaScript
23/697
Hola Mundo
▶ Para probar bloques de código pequeños puede utilzar tanto el entorno interactivo
de nodejs o la consola de Navegador
▶ Para códigos más complejos puede utilzar directamente un editor de texto
▶ Desde allí, puede copiar y pegar en la consola de JavaScript o en una sesión de
Node, o puede guardar su código en un archivo (la extensión de nombre de
archivo tradicional para código JavaScript es .js) y luego ejecutar ese archivo de
código JavaScript con Node:
node snippet.js
▶ Si usa Node de manera no interactiva, no imprimirá automáticamente el valor del
código que ejecute
24/697
Más información
25/697
Javascript
Herramientas de desarrollo
26/697
Configuración mínima
27/697
DevTools
28/697
DevTools cont.
29/697
DevTools cont.
▶ Performance: Permite grabar todos los eventos que ocurren durante el ciclo de
vida de un sitio Web
▶ Memory: Nos permite identificar memory leaks en nuestras aplicaciones. Nos
permite visualizar en tiempo real el consumo de Heap de una página
▶ Application: Aquí podemos consultar todos los recursos del navegador que utiliza
un sitio Web: cookies, IndexedDB, Service Workers, storages, etc.
▶ Security: Sirve para consultar el nivel de seguridad de un sitio web: HTTPS,
certificados, etc.
▶ Lighthouse: Nos permite realizar auditorías sobre un sitio Web: Performance,
SEO, Accesibilidad, PWA y mejores prácticas
30/697
La consola
// Limpia la consola
console.clear();
31/697
La consola cont.
32/697
La consola cont.
33/697
La consola cont.
34/697
La consola cont.
▶ Esto, bien usado, es muy útil cuando queremos monitorear el estado de nuestro
código
// Muestra el mensaje sólo cuando lo forzamos
console.debug('Soy tímido')
35/697
La consola cont.
▶ No hay que olvidar que la consola, además de util, puede ser tan bonita como
queramos
▶ Además, algo que la diferencia de otras funciones de JavaScript, es que admite
”placeholding” de variables de forma nativa
%s Cadena de texto
%d / %i Entero
%f Decimal
%o DOM
%O Objeto JS
%c CSS
const parrafos = document.getElementsByTagName('p');
console.log('DOM: %o', parrafos);
37/697
Javascript
Variables
38/697
Declaracion de variables
39/697
Reglas sintácticas
var variable1;
let variable2;
const variable3 = 2;
40/697
La palabra clave const
▶ Una constante es una variable que no puede ser reemplazada. Una vez declarada,
no es posible cambiar su valor
▶ JavaScript introdujo constantes en ES6
▶ Antes de las constantes, disponiamos solo de variables, las cuales pueden cambiar
su contenido:
var pizza = true;
pizza = false;
console.log(pizza); // false
▶ Si intentamos cambiar el valor de una constante va a generar un error por consola:
41/697
La palabra clave let
42/697
La palabra clave let cont.
43/697
La palabra clave let cont.
▶ Con la palabra clave let, podemos delimitar el alcance de una variable al bloque
de código donde fue declarada
▶ Usando let protejemos el valor de la variable global
var topic = 'JavaScript';
if (topic) {
let topic = 'React';
console.log('block', topic); // block React
}
console.log('global', topic); // global JavaScript
▶ El valor de topic fuera del bloque no se modifica
44/697
Alcance de las variables
45/697
Alcance de las variables cont.
46/697
Javascript
Tipos
47/697
Tipos
48/697
Tipos cont.
// undefined
typeof undefined;
typeof estaVariableQueNoHeInicializadoAun;
// object
typeof null;
typeof { key: 2 };
typeof [15, 4];
typeof new Date();
// boolean
typeof true;
typeof false;
typeof new Boolean(true);
49/697
Tipos cont.
// string
typeof 'hola';
// function
typeof function (){};
// number
typeof 1;
typeof 1.3;
typeof NaN;
typeof Infinity;
// symbol
typeof Symbol();
typeof Symbol('mi simbolo');
50/697
Objetos y arreglos
51/697
Desestructuración de objetos
52/697
Desestructuración de objetos cont.
const regularPerson = {
firstname: 'Bill',
lastname: 'Wilson'
};
53/697
Desestructuración de objetos cont.
▶ En lugar de usar la sintaxis notación punto para acceder a las propiedades de los
objetos, podemos desestructurar los valores que necesitamos de regularPerson:
54/697
Desestructuración de objetos cont.
55/697
Desestructuración de objetos cont.
56/697
Desestructuración arreglos
console.log(firstAnimal); // Horse
▶ También podemos pasar por alto valores innecesarios con la coincidencia de
posiciones usando comas
▶ La coincidencia de posiciones ocurre cuando las comas reemplazan a los elementos
que deben omitirse
▶ Usando el mismo ejemplo anterior, podemos acceder al último valor reemplazando
los dos primeros valores con comas:
const [, , thirdAnimal] = ['Horse', 'Mouse', 'Cat'];
console.log(thirdAnimal); // Cat
57/697
Mejora de objetos literales
58/697
Mejora de objetos literales cont.
59/697
Mejora de objetos literales cont.
60/697
Mejora de objetos literales cont.
// Ahora
const skier = {
name,
sound,
powderYell() {
let yell = this.sound.toUpperCase();
console.log(yell + ' ' + yell + ' ' + yell + '!!!');
},
speed(mph) {
this.speed = mph;
console.log('speed:', mph);
}
};
61/697
El operador de propagación
62/697
El operador de propagación cont.
▶ Usando el arreglo peaks del ejemplo anterior, imaginemos que queremos tomar el
último elemento del arreglo en lugar del primero
▶ Podríamos usar el método Array.reverse para invertir el arreglo en combinación
con la desestructuración de la matriz
const peaks = ['Tallac', 'Ralston', 'Rose'];
const [last] = peaks.reverse();
console.log(last); // Rose
console.log(peaks); // [ 'Rose', 'Ralston', 'Tallac']
▶ La función reverse en realidad ha alterado o mutado el arreglo
63/697
El operador de propagación cont.
console.log(last); // Rose
console.log(peaks); // [ 'Tallac', 'Ralston', 'Rose' ]
▶ Dado que usamos el operador de propagación para copiar el arreglo, el arreglo
peaks queda intacto y se puede usar más adelante en su forma original
64/697
El operador de propagación cont.
65/697
El operador de propagación cont.
▶ También podemos usar la sintaxis de tres puntos para agrupar los argumentos de
una función como un arreglo
▶ Ejemplo: la siguiente función toma una cantidad n de argumentos usando el
operador de propagación, luego usa esos argumentos para imprimir algunos
mensajes de la consola:
function directions(...args) {
let [start, ...remaining] = args;
let [finish, ...stops] = remaining.reverse();
66/697
El operador de propagación cont.
const backpackingMeals = {
...morning,
dinner
};
console.log(backpackingMeals);
// {
// breakfast: 'oatmeal',
// lunch: 'peanut butter and jelly',
// dinner: 'mac and cheese'
// }
67/697
Javascript
Control de flujo
68/697
Control de flujo
69/697
Estructuras condicionales
70/697
Sentencia if
71/697
Sentencia if cont.
72/697
Sentencia else if
73/697
Sentencia switch
▶ Como vimos, se puede usar el idioma else if para realizar una bifurcación
multidireccional
▶ Esta no es la mejor solución cuando todas las ramas dependen del valor de una
misma expresión
▶ En ese caso, es un desperdicio evaluar repetidamente esa expresión en múltiples
sentencias if
▶ La instrucción switch maneja exactamente esta situación
▶ La palabra clave switch va seguida de una expresión entre paréntesis y un bloque
de código entre llaves
switch (expresion) {
sentencias
}
74/697
Sentencia switch cont.
▶ Varios lugares en el bloque de código están etiquetadas con la palabra clave case
seguida de una expresión y dos puntos
▶ Cuando se ejecuta switch, calcula el valor de expresión y luego busca una
etiqueta case cuya expresión evalúe como el mismo valor (donde la uniformidad
está determinada por el operador ===)
▶ Si encuentra uno, comienza a ejecutar el bloque de código en la declaración
etiquetada case
▶ Si no encuentra un case con un valor coincidente, busca una declaración
etiquetada como default
▶ Si no hay una etiqueta default, la sentencia switch omite el bloque de código
por completo
75/697
Sentencia switch cont.
switch(n) {
case 1:
// Codigo del bloque 1
break;
case 2:
// Codigo del bloque 2
break;
case 3:
// Codigo del bloque 3
break;
default:
// Codigo del bloque 4
break;
}
76/697
Sentencias de repetición
▶ Las sentencias de repetición son aquellas que desvían el flujo de ejecucion sobre sí
mismo para repetir partes de su código
▶ JavaScript tiene cinco sentencias de repeticion:
▶ while
▶ do/while
▶ for
▶ for/of (con su variante for/await)
▶ for/in
77/697
Sentencia while
78/697
Sentencia do/while
▶ El ciclo do/while es como el ciclo while, excepto que la expresión del ciclo se
prueba en la parte inferior del ciclo en lugar de en la parte superior
▶ Esto significa que el cuerpo del bucle siempre se ejecuta al menos una vez
▶ La sintaxis es:
do
sentencia
while (expresion);
▶ El ciclo do/while se usa con menos frecuencia que su primo while
79/697
Sentencia do/while cont.
▶ ¿Cual es la diferencia entre while y do/while?
80/697
Sentencia for
▶ La mayoría de las estructuras de repeticion tienen una variable contador de algún
tipo
▶ Esta variable se inicializa antes de que comience la estructura de repeticion y se
verifica antes de cada iteración del ciclo
▶ Finalmente, la variable de contador se incrementa o se actualiza de alguna manera
al final del cuerpo del ciclo, justo antes de que la variable se vuelva a probar
▶ En este tipo de estructura de repeticion, la inicialización, la verificación y la
actualización son las tres manipulaciones cruciales de una variable de bucle
▶ La declaración for codifica cada una de estas tres manipulaciones como
expresiones y convierte esas expresiones en una parte explícita de la sintaxis del
bucle:
for (inicializacion; prueba; incremento)
sentencia
▶ inicialización, verificación e incremento son tres expresiones (separadas por punto
y coma) que son responsables de inicializar, probar e incrementar la variable de
ciclo respectivamente
81/697
Sentencia for cont.
82/697
Sentencia for cont.
83/697
Sentencia for cont.
84/697
Sentencia for/of
85/697
Sentencia for/of con objetos
86/697
Sentencia for/of con cadenas
▶ Si estámos interesados tanto en las claves como en los valores de las propiedades
de un objeto, podemos usar for/of con Object.entries() y la asignación de
desestructuración:
let pairs = '';
for (let [k, v] of Object.entries(o)) {
pairs += k + v;
}
▶ Object.entries() devuelve un arreglo de arreglos, donde cada arreglo interno
representa un par clave/valor para una propiedad del objeto
▶ Usamos la asignación de desestructuración en este ejemplo de código para
desempaquetar esos arreglos internos en dos variables individuales
87/697
Sentencias for/of con cadenas
88/697
Sentencia for/of con Set y Map
89/697
Sentencia for/of con Set y Map cont.
▶ Los Map son un caso interesante porque el iterador de un objeto Map no itera las
claves del mapa o los valores del mapa, sino los pares clave/valor
▶ Cada vez que se realiza la iteración, el iterador devuelve una matriz cuyo primer
elemento es una clave y cuyo segundo elemento es el valor correspondiente
▶ Dado un Map m, podría iterar y desestructurar su clave/valor pares como este:
90/697
Sentencia for/in
91/697
Sentencia for/in
92/697
Operador ternario
93/697
Javascript
Características adicionales
94/697
Plantillas de cadena
95/697
Variables dentro de cadenas
console.log(greeting);
96/697
Cadenas de múltiples líneas
▶ Las cadenas de múltiples líneas son un recurso valioso cuando necesitamos poner
cadenas dentro de nuestros templates
▶ Ejemplo:
var template = `
<div>
<h1>Hello</h1>
<p>This is a great website</p>
</div>
`
97/697
Javascript
Funciones
98/697
Creando funciones
▶ Cada vez que deseamos realizar algún tipo de tarea repetible con JavaScript,
podemos usar una función
▶ Algunas de las diferentes opciones de sintaxis que se pueden usar para crear una
función son las siguientes:
▶ Declaraciones de funciones
▶ Expresiones de función
▶ Función flecha
99/697
Declaraciones de funciones
function logCompliment() {
console.log("You're doing great!");
}
▶ Una vez definida la función, se invocará o llamará utilizando el nombre que se le
asignó:
logCompliment();
100/697
Expresiones de función
101/697
Declaraciones de funciones frente a expresiones
▶ Algo a tener en cuenta al decidir entre una declaración de función y una expresión
de función es que las declaraciones de función se elevan mientras que las
expresiones de función no
▶ Por lo tanto, puede invocar una función antes de escribir la declaración de la
función
// Invocando la función antes de que sea declarada
hey();
// Declaración de la función
function hey() {
alert("hey!");
}
▶ Esto funciona dado que la función se eleva o sube a la parte superior del alcance
del archivo
102/697
Declaraciones de funciones frente a expresiones cont.
▶ No es posible invocar una función creada por una expresión de función antes de la
expresión
▶ Si probamos el mismo ejercicio con una expresión de función causará un error:
103/697
Pasaje de argumentos
104/697
Retorno de funciones
105/697
Parámetros predeterminados
106/697
Parámetros predeterminados cont.
const defaultPerson = {
name: {
first: "Shane",
last: "McConkey"
},
favActivity: "skiing"
};
107/697
Función flecha
108/697
Función flecha cont.
// Función flecha
const lordify = (firstName, land) => firstName + ' of ' + land;
109/697
Función flecha cont.
if (!land) {
throw new Error("A lord must have a land");
}
110/697
Devolviendo objetos
▶ ¿Qué sucede si queremos devolver un objeto? Consideremos una función llamada
person que construye un objeto basado en parámetros firstName y lastName:
console.log(person("Brad", "Janson"));
▶ Tan pronto como ejecute esto, verá el error:
Uncaught SyntaxError: Unexpected token :
▶ Para solucionar esto, simplemente envuelva el objeto que está devolviendo entre
paréntesis:
const person = (firstName, lastName) => ({
first: firstName,
last: lastName
});
Gestión de la memoria
112/697
Introducción
113/697
Ciclo de vida de la memoria
▶ En JavaScript, cuando creamos variables, funciones o cualquier cosa, el motor JS
asigna memoria para esto y la libera una vez que ya no se necesita
▶ La asignación de memoria es el proceso de reservar espacio en la memoria,
mientras que la liberación de memoria libera espacio dejandola disponible para
otro propósito
▶ Cada vez que asignamos una variable o creamos una función, la memoria utilizada
para ese propósito pasa por las siguientes etapas:
▶ Asignar memoria: JavaScript se encarga de esto por nosotros: asigna la memoria
que necesitaremos para el objeto que creamos
▶ Usar memoria: Usar la memoria es algo que hacemos explícitamente en nuestro
código: leer y escribir en la memoria no es más que leer o escribir desde o hacia una
variable
▶ Liberar memoria: Este paso también es manejado por el motor de JavaScript. Una
vez que se libera la memoria asignada, se puede usar para un nuevo propósito
▶ ”Objetos” en el contexto de la gestión de memoria no solo incluye objetos JS sino
también funciones
114/697
El Heap y el Stack de memoria
115/697
Stack: asignación de memoria estática
▶ Una pila es una estructura de datos que utiliza JavaScript para almacenar datos
estáticos
▶ Los datos estáticos son datos en los que el motor conoce el tamaño
▶ En JavaScript, esto incluye valores primitivos (cadenas, números, booleanos,
undefined y null) y referencias que apuntan a objetos y funciones
116/697
Stack: asignación de memoria estática cont.
▶ Dado que el motor sabe que el tamaño no cambiará, asignará una cantidad fija de
memoria para cada valor
▶ El proceso de asignación de memoria justo antes de la ejecución se conoce como
asignación de memoria estática
▶ Debido a que el motor asigna una cantidad fija de memoria para estos valores,
existe un límite de cuán grandes pueden ser los valores primitivos
▶ Los límites de estos valores y el tamaño del Stack varían según el navegador
117/697
Heap: asignación de memoria dinámica
118/697
Stack vs Heap
▶ Para obtener una descripción general, estas son las características de los dos tipos
de almacenamiento en una aplicación JavaScript:
▶ Pila
▶ Valores primitivos y referencias
▶ El tamaño se conoce en tiempo de compilación
▶ Asigna una cantidad fija de memoria
▶ Heap
▶ Objetos y funciones
▶ El tamaño se conoce en tiempo de ejecución
▶ Sin límite por objeto
119/697
Ejemplos
120/697
Referencias en JavaScript
121/697
Referencias en JavaScript cont.
122/697
Recolección de basura
▶ Una vez que el motor de JavaScript reconoce que una determinada variable o
función ya no es necesaria, libera la memoria que ocupaba
▶ El encargado de realizar esta tarea es el recolector de basura
▶ Existen distintos algoritmos para la recoleccion de basura:
▶ La recolección de basura de conteo de referencias
▶ El algoritmo de marca y barrido
123/697
Javascript
124/697
Introducción
▶ Dependiendo del tipo de dato que pasamos como argumento a una función,
podemos diferenciar dos comportamientos:
▶ Paso por valor: Se crea una copia local de la variable dentro de la función
▶ Paso por referencia: Se maneja directamente la variable, los cambios realizados
dentro de la función le afectarán también fuera
▶ Tradicionalmente:
▶ Los tipos simples se pasan por valor: enteros, flotantes, cadenas, booleanos…
▶ Los tipos compuestos se pasan por referencia: Listas, diccionarios, conjuntos…
125/697
Paso por valor de valores primitivos
126/697
Paso por valor de valores primitivos cont.
let y = 10;
let result = square(y);
console.log(result);
console.log(y);
127/697
Paso por valor de valores primitivos cont.
▶ En primer lugar definimos una función square() que acepta un argumento x
▶ La función asigna el cuadrado de x al argumento x
▶ A continuación, declaramos la variable y e inicializamos su valor en 10
Stack
y = 10
128/697
Paso por valor de valores primitivos cont.
▶ Luego, pasamos la variable y a la función square()
▶ Al pasar la variable y a la función square(), JavaScript copia el valor y a la
variable x
Stack
x = 10
y = 10
129/697
Paso por valor de valores primitivos cont.
▶ Luego de esto, la función square() cambia el valor de la variable x
▶ Sin embargo, el cambio no afecta el valor de la variable y porque x e y son
variables independientes
Stack
x = 100
y = 10
130/697
Paso por valor de valores primitivos cont.
result = 100
y = 10
131/697
Paso por referencia
132/697
Pasaje por referencia cont.
function callByReference(varObj) {
console.log('Inside Call by Reference Method');
varObj.a = 100;
console.log(varObj);
}
let varObj = {
a: 1
};
callByReference(varObj);
133/697
Paso por valor de los valores de referencia
▶ No es tan obvio ver que los valores de referencia en realidad se pasan también por
valor
▶ Por ejemplo:
let person = {
name: 'John',
age: 25,
};
function increaseAge(obj) {
obj.age += 1;
}
increaseAge(person);
console.log(person)
134/697
Paso por valor de los valores de referencia cont.
▶ Primero, definimos la variable person que hace referencia a un objeto con dos
propiedades name y age:
Stack Heap
{ name: "John",...
person
135/697
Paso por valor de los valores de referencia cont.
▶ A continuación, definimos la función increaseAge() que acepta un objeto obj y
aumenta la propiedad age del argumento obj en uno
▶ Luego, pasamos el objeto person a la función increaseAge():
Stack Heap
person
136/697
Paso por valor de los valores de referencia cont.
▶ Internamente, el motor JavaScript crea una referencia obj y hace que esta
variable haga referencia al mismo objeto al que hace referencia la variable person
▶ Después de eso, se incrementa la propiedad de age en uno dentro de la función de
increaseAge() a través de la variable obj
Stack Heap
person
137/697
Paso por valor de los valores de referencia cont.
{ name: "John",...
person
138/697
Paso por valor de los valores de referencia cont.
139/697
Paso por valor de los valores de referencia cont.
▶ Por ejemplo:
let person = {
name: 'John',
age: 25,
};
function increaseAge(obj) {
obj.age += 1;
increaseAge(person);
console.log(person);
140/697
Paso por valor de los valores de referencia cont.
person
141/697
Paso por valor de los valores de referencia cont.
Stack Heap
{ name: "Jane",...
person
142/697
Paso por valor de los valores de referencia cont.
143/697
Javascript
Motor de JavaScript
144/697
Funciones como unidad fundamental
▶ En JavaScript, podemos crear y modificar una función, usarla como argumento,
devolverla desde otra función y asignarla a una variable
▶ Todas estas habilidades nos permiten usar funciones en todas partes y de esa
forma agrupar código lógicamente
145/697
Funciones como unidad fundamental cont.
// Invocamos la función
f1();
▶ De forma predeterminada, cada línea de una función se ejecuta secuencialmente,
una línea a la vez
▶ Lo mismo es aplicable incluso cuando invocamos múltiples funciones en el código,
nuevamente línea por línea
146/697
Pila de ejecución de funciones
147/697
Pila de ejecución de funciones cont.
148/697
Pila de ejecución de funciones cont.
149/697
Pila de ejecución de funciones cont.
150/697
Pila de ejecución de funciones cont.
Ahora veamos un ejemplo más complejo. Aquí hay una función f3() que invoca otra
función f2() que a su vez invoca otra función f1().
function f1() {
// algo de código
}
function f2() {
f1();
}
function f3() {
f2();
}
f3();
151/697
Pila de ejecución de funciones cont.
152/697
Pila de ejecución de funciones cont.
153/697
Cómo funcionan las API y las promesas del navegador
154/697
Cómo funcionan las API y las promesas del navegador cont.
155/697
Cómo manejar las API del navegador o API web
▶ Las API del navegador como setTimeout y los controladores de eventos se basan
en funciones callback
▶ Una función callback se ejecuta cuando se completa una operación asincrónica
▶ Aquí hay un ejemplo de cómo funciona una función setTimeout:
function printMe() {
console.log('print me');
}
setTimeout(printMe, 2000);
▶ La función setTimeout ejecuta la función después de que haya transcurrido una
cierta cantidad de tiempo
▶ En el código anterior, el texto print me se muestra por consola después de un
retraso de 2 segundos
156/697
Cómo manejar las API del navegador o API web cont.
Ahora supongamos que tenemos algunas líneas más de código justo después de la
función setTimeout como esta:
function printMe() {
console.log('print me');
}
function test() {
console.log('test');
}
setTimeout(printMe, 2000);
test();
157/697
Cola de tareas
158/697
Cola de tareas cont.
La imagen muestra el Stack de llamadas regular. Hay dos secciones adicionales para
rastrear si una API del navegador (como setTimeout) se activa y pone en cola la
función callback de esa API
159/697
Cola de tareas cont.
160/697
Cola de tareas cont.
Resumiendo:
▶ Cuando se produce una llamada a la API de navegador, las funciones callback se
agregan a la cola
▶ El código continua ejecutandose en la pila
▶ El ciclo de eventos comprueba si hay una función callback en la cola
▶ Si hay alguna función en la cola y el Stack está vacío, movemos la función
callback de la cola al Stack y la ejecutamos
▶ Continúe el ciclo
161/697
Cola de tareas cont.
function f2() {
console.log('f2');
}
function main() {
console.log('main');
setTimeout(f1, 0);
f2();
}
main();
162/697
Cola de tareas cont.
El código ejecuta una función setTimeout con una función callback f1(). A la
función callback le hemos dado un retraso de cero. Esto significa que esperamos que
la función f1() se ejecute inmediatamente. Luego de setTimeout ejecutamos otra
función f2()
¿Cuál será el resultado en este caso?
163/697
Cola de tareas cont.
Ahora, veamos en un flujo paso a paso para el código anterior.
164/697
Cola de tareas cont.
La secuencia de pasos sería la siguiente:
▶ La función main() entra en el Stack de llamada
▶ Tiene una llamada a la consola para imprimir la palabra main, que se ejecuta y
sale del Stack
▶ Se invoca a la API del navegador setTimeout
▶ La función callback se coloca en la cola de callbacks
▶ En el Stack, la ejecución ocurre como de costumbre, por lo que f2() entra en el
Stack. Se ejecuta la llamada a la consola de f2(). Ambos salen del Stack
▶ El main() también sale del Stack
▶ El ciclo de eventos reconoce que en el Stack está vacío y que hay una función
callback en la cola
▶ La callback f1() se mueve al Stack. Comienza su ejecución. Se ejecuta la
llamada por consola y f1() también sale del Stack
▶ En este punto, no hay nada más en el Stack y en la cola para ejecutar
165/697
Gestión de promesas
166/697
Gestión de promesas cont.
167/697
Cola de trabajos
▶ Cada vez que se produce una promesa en el código, la función a ejecutora entra
en la cola de trabajos
▶ El ciclo de eventos examinar ambas colas, pero da prioridad a los elementos de la
cola de trabajos sobre los elementos de la cola de callbacks cuando el Stack está
libre
▶ El elemento de la cola de callbacks se denomina macro-tarea, mientras que el
elemento de la cola de trabajos se denomina micro-tarea
▶ Todo el flujo de trabajo quedaría así:
▶ Para cada ciclo del ciclo de eventos, se completa una tarea fuera de la cola de
callbacks
▶ Una vez que se completa esa tarea, el ciclo de eventos revisa la cola de trabajos.
Completa todas las micro-tareas en la cola de trabajos antes de buscar lo siguiente
▶ Si ambas colas obtuvieron entradas en el mismo momento, la cola de trabajo tiene
preferencia sobre la cola de callbacks
168/697
Cola de trabajos cont.
169/697
Cola de trabajos cont.
Veamos un ejemplo para entender mejor esta secuencia:
function f1() {
console.log('f1');
}
function f2() {
console.log('f2');
}
function main() {
console.log('main');
setTimeout(f1, 0);
f2();
}
main();
170/697
Cola de trabajos cont.
171/697
Cola de trabajos cont.
172/697
Más información
▶ https://nodejs.dev/learn/the-nodejs-event-loop
173/697
Javascript
JavaScript Asincrónico
174/697
Introducción
175/697
Callbacks
▶ En JavaScript, las funciones son objetos, por lo tanto podemos pasar objetos a
funciones como parámetros
▶ También podemos pasar funciones como parámetros a otras funciones y llamarlas
dentro de las funciones
▶ Los callbacks son funciones que se pasan como argumento a otra función
▶ Tomemos un ejemplo de función callback:
function printString() {
console.log("Tom");
setTimeout(function() { console.log("Jacob"); }, 3000);
console.log("Mark")
}
printString();
176/697
Callbacks cont.
177/697
Callbacks cont.
178/697
Callback utilizando función flecha
▶ También puede escribir la misma función callback anterior como una función
flecha:
function printString(){
console.log("Tom");
setTimeout(() => { console.log("Jacob"); }, 3000);
console.log("Mark")
}
printString();
179/697
Callback utilizando función flecha cont.
180/697
Callback utilizando función flecha cont.
▶ Infierno de callbacks:
function pyramidOfDoom() {
setTimeout(() => {
console.log(1)
setTimeout(() => {
console.log(2)
setTimeout(() => {
console.log(3)
}, 500)
}, 2000)
}, 1000)
}
181/697
Promesas
182/697
Promesas cont.
183/697
Estados de las promesas
184/697
Creando una promesa
185/697
Creando una promesa cont.
186/697
Usando la promesa
▶ Para usar la Promesa que creamos anteriormente, usamos el método then() para
resolverla y el método catch() para rechazarla
myFirstPromise.then((successMsg) => {
console.log(successMsg);
})
.catch((errorMsg) => {
console.log(errorMsg);
});
▶ O definiendo la promesa dentro de una función:
const demoPromise = function() {
myFirstPromise
.then((successMsg) => {
console.log("Success:" + successMsg);
})
.catch((errorMsg) => {
console.log("Error:" + errorMsg);
});
}
187/697
Usando la promesa cont.
188/697
¿Qué es el encadenamiento?
resolve(message);
});
}
189/697
¿Qué es el encadenamiento? cont.
myFirstPromise
.then(helloPromise)
.then((successMsg) => {
console.log("Success:" + successMsg);
})
.catch((errorMsg) => {
console.log("Error:" + errorMsg);
})
}
demoPromise();
▶ Dado que nuestra condición es verdadera, la salida a nuestra consola es:
Success: Hi, How are you!
▶ Una vez que la helloPromise se encadena con .then, el subsiguiente .then
utilizara los datos del anterior
190/697
Async/Await
191/697
Async/Await cont.
▶ Puede ver que usamos la palabra clave async para la función contenedora
printMyAsync
▶ Esto le permite a JavaScript saber que estamos usando la sintaxis async/await,
y es necesario si desea usar Await
▶ Esto significa que no puede usar Await a nivel global
▶ Siempre necesita una función contenedora, o podemos decir que await solo se usa
con una función asíncrona
▶ La palabra clave await se usa en una función async para garantizar que todas las
promesas retornadas en la función asíncrona estén sincronizadas
▶ Await elimina el uso de callbacks en .then() y .catch()
▶ Al usar async y await, async se antepone al devolver una promesa, await se
antepone al llamar a una promesa
▶ try y catch también se utilizan para obtener el valor de rechazo de una función
asíncrona
192/697
Async/Await cont.
193/697
Laboratorio práctico - JavaScript Labs
194/697
Typescript
Typescript
Luciano Diamand
195/697
Typescript
Introducción
196/697
Introducción
197/697
Características
▶ Anotaciones de Tipos
▶ Clases
▶ Interfaces
▶ Decoradores
▶ Constructores
▶ Modificadores de acceso
▶ Importación y exportación de módulos
▶ Enums
▶ Tuplas
▶ Uniones
▶ Generics
198/697
Caracteristicas cont.
199/697
Caracteristicas cont.
200/697
Caracteristicas cont.
201/697
Lenguaje TypeScript
202/697
¿Por qué usamos TypeScript?
console.log(add('2', '3'));
▶ Si invocamos la función con números se realizará la suma de los mismos
▶ Sin embargo, es posible invocar la función pasando números como cadenas o
valores de cualquier tipo, lo que podría resultar en un comportamiento no deseado
203/697
¿Por qué usamos TypeScript? cont.
204/697
Debilidad de JavaScript: tipado débil
▶ Como vimos anteriormente, JavaScript posee un tipado débil
▶ Consideremos otro ejemplo (omitiendo .html ya que solo contiene el formulario):
const button = document.querySelector('button');
const input1 = document.getElementById('num1');
const input2 = document.getElementById('num2');
button.addEventListener('click', function() {
console.log(add(input1.value, input2.value));
})
▶ Al ejecutar este código con los números 10 y 5, esperaríamos obtener un resultado
de 15. En su lugar, vemos 105
205/697
Debilidad de JavaScript: tipado débil cont.
▶ ¿De dónde viene este error?. Llenamos nuestro formulario y en el evento click,
pasamos dos valores y los sumamos
▶ Hay que recordar que el tipo de retorno de nuestro input1.value es siempre
una cadena, que luego se pasa a nuestra función add, y no importa si la entrada
es de tipo number, el valor recuperado siempre es sera cadena
▶ Por lo tanto, dado que ambos valores son cadenas, no se suman, sino que siempre
se concatenan
▶ Este es un problema con JavaScript con el que TypeScript puede ayudarnos
▶ Podríamos agregar una sentencia if y verificar si esos valores son números y luego
devolver la suma o else convertirlos en un número anteponiendo un +:
return +num1 + +num2
▶ La ”solución” anterior funciona, pero requiere que escribiamos código adicional
206/697
Typescript
Instalación
207/697
Instalación
208/697
Proyecto TypeScript
▶ Los archivos TypeScript se pueden compilar con el comando tsc <archivo>.ts
▶ Es tedioso compilar varios archivos .ts en un proyecto grande
▶ Por lo tanto, TypeScript proporciona otra opción para compilar todos o ciertos
archivos .ts del proyecto
▶ Puede proporcionar opciones de compilación que se pueden almacenar en el
archivo tsconfig.json
▶ Para iniciar un nuevo proyecto de TypeScript, ingrese al directorio raíz de su
proyecto y en una ventana de terminal ejecute tsc --init
▶ Este comando generará un archivo de tsconfig.json con un mínimo de
opciones de configuración, similar al siguiente
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"strict": true,
"esModuleInteop": true,
"forceConsistentCasingInFileNames": true
}
}
209/697
Archivo tsconfig.json
210/697
Pruebas con TypeScript
▶ Para poder probar de forma simple programas en TypeScript podemos utilizar una
herramienta llamada TSUN (TypeScript Upgraded Node)
▶ La instalamos de la siguiente manera: sudo npm install -g tsun
▶ Ahora podemos ejecutarlo con: tsun
▶ Tambien hay otras opciones como ser ts-node: npm install -g ts-node
▶ O de forma on-line http://typescriptlang.org
211/697
Typescript
Usando TypeScript
212/697
Usando TypeScript
213/697
Usando TypeScript cont.
214/697
Usando TypeScript cont.
▶ Hay un par de cosas a considerar. Si bien TypeScript nos obliga a verificar dos
veces el código, debemos decirle que nuestro código es correcto una vez que
hayamos terminado de verificarlo. En aras de la exhaustividad del ejemplo
anterior, proporcionaremos un montón de comentarios:
/**
* Dado que estamos tratando con HTML, y ya nos hemos asegurado de
* que nuestros elementos existen, podemos decirle a TS que nuestro
* .value nunca será * null (porque existe) agregando un signo de
* exclamación al final del elemento asignado:
*
* const input1 = document.getElementById("num1")!;
*
* En este ejemplo, tenemos que decirle a TS qué tipo de elemento es,
* por lo que lo convertiremos al tipo HTMLInputElement. Esta es la
* sintaxis de TypeScript y podemos usarla en un archivo .ts.
*/
const button = document.querySelector("button");
const input1 = document.getElementById("num1")! as HTMLInputElement;
const input2 = document.getElementById("num2")! as HTMLInputElement;
215/697
Usando TypeScript cont.
/**
* La ventaja adicional es que podemos definir tipos.
* Al principio, TS nos dirá que no sabe de qué tipo es el argumento (num: any),
* y sería bueno agregarle un tipo para que sepamos con qué estamos tratando.
*
* Mediante el uso de la sintaxis específica, que comprende el compilador de TS,
* podemos definir el tipo de argumentos. Hacemos esto agregando dos puntos después
* de un argumento y especificando un tipo
*/
function add(num1: number, num2: number) {
return num1 + num2;
}
/**
* Nuestro IDE nos advertira por la falta de coincidencia de tipos.
* .value es de tipo cadena y estamos tratando de pasar una cadena a un argumento
* que debería ser de tipo numérico.
*
* Este error también aparecerá cuando intentemos compilar esto.
* TypeScript entiende qué tipo obtenemos de InputElement, por lo que no podemos
* pasar esto a la función add(), porque espera un número, por lo que podemos
* convertirlo rápidamente en un número anteponiendo un signo más.
*/
button.addEventListener("click", function() {
console.log(add(+input1.value, +input2.value));
})
216/697
Usando TypeScript cont.
217/697
Typescript
Tipos
218/697
Tipos
219/697
Definición de variable
▶ En TypeScript podemos utilizar la palabra reservada var para definir una variable
(como lo haciamos con JavaScript)
▶ Pero ahora podemos definirle el tipo:
var fullName: string;
220/697
Funciones
221/697
Funciones
greet('Hello', 'Steve');
greet('Hi');
greet('Hi', 'Bill', 'Gates');
222/697
Parámetros opcionales en funciones
▶ Todos los parámetros opcionales deben seguir a los parámetros requeridos y deben
estar al final
functino greet(greeting: string, name?: string): string {
return greeting + ' ' + name + '!';
}
greet('Hello', 'Steve');
greet('Hi');
greet('Hi', 'Bill', 'Gates');
▶ En el ejemplo anterior, el nombre del segundo parámetro está marcado como
opcional con un signo ?
▶ Por lo tanto, la función greet acepta uno o dos parámetros y devuelve una
cadena de saludo
▶ Si no especificamos el segundo parámetro, su valor será undefined
223/697
Sobrecarga de funciones
▶ Typescript proporciona el concepto de sobrecarga de funciones
▶ Puedemos tener múltiples funciones con el mismo nombre pero diferentes tipos de
parámetros y tipos de retorno
▶ Sin embargo, el número de parámetros debe ser el mismo
function add(a: string, b: string): string;
225/697
Tipo any
▶ Typescript tiene verificación de tipo y verificación en tiempo de compilación
▶ Sin embargo, no siempre tenemos conocimiento previo sobre el tipo de algunas
variables, especialmente cuando hay valores ingresados por el usuario de
bibliotecas de terceros
▶ En tales casos, necesitamos un tipo que pueda tratar con contenido dinámico
▶ any es el tipo por defecto si omitimos el tipo para una variable dada
▶ Una variable de tipo any permite recibir cualquier tipo de valor:
var something: any = 'as string';
something = 1;
something = [ 1, 2, 3 ];
▶ Similar a lenguajes como Java, void se usa donde no hay ningún tipo de datos
▶ Por ejemplo, en tipo de retorno de funciones que no devuelven ningún valor
function sayHi(): void {
console.log('Hi!');
}
227/697
Tipo never
▶ TypeScript introduce un nuevo tipo never, que indica los valores que nunca
ocurrirán
▶ El tipo never se usa cuando se está seguro de que algo nunca va a ocurrir
▶ Por ejemplo, se escribe una función que no volverá a su punto final o que siempre
genera una excepción
function throwError(errorMsg: string): never {
throw new Error(errorMsg);
}
229/697
Tupla cont.
230/697
Enums
231/697
Enums numéricas
▶ Las enumeraciones funcionan nombrando valores numéricos:
enum Role { Employee, Manager, Admin };
var role: Role = Role.Employee;
▶ El valor por defecto de inicio para una enum es 0
▶ Es posible cambiar el valor de la siguiente manera:
enum Role { Employee = 3, Manager, Admin };
var role: Role = Role.Employee;
▶ El valor de los demas elementos se incrementa a partir de ahí
▶ También es posible asignar valores independientes:
enum Role { Employee = 3, Manager = 5, Admin = 7 };
var role: Role = Role.Employee;
▶ Además, podemos buscar el nombre de una enumeración dada por su valor
enum Role { Employee, Manager, Admin };
console.log('Roles:', Role[0], ',', Role[1], 'and', Role[2]);
232/697
Enums numéricas cont.
▶ El valor de un miembro de enumeración puede ser constante o calculado
▶ La siguiente enumeración incluye miembros con valores calculados:
enum PrintMedia {
Newspaper = 1,
Newsletter = getPrintedMediaCode('newsletter'),
Magazine = Newsletter * 3,
Book = 10
}
console.log(PrintMedia.Newspaper);
console.log(PrintMedia['Magazine']);
▶ La diferencia entre enumeraciones numéricas y de cadena es que los valores de
enumeración numéricos se incrementan automáticamente, mientras que los valores
de enumeración de cadena deben inicializarse individualmente
234/697
Enums de cadenas
235/697
Unión
▶ Typescript nos permite usar más de un tipo de datos para una variable o un
parámetro de función
▶ Esto se llama tipo de unión:
let code: (string | number);
code = 123;
code = 'ABC';
code = false;
236/697
Unión cont.
displayType(123);
displayType('ABC');
displayType(true);
237/697
Inferencia de tipos
238/697
Aserción de tipos
Generics
240/697
Usando generics
241/697
Usando generics cont.
242/697
Usando generics cont.
244/697
Variables de tipo multiple
displayType<number>(1, 'Steve');
245/697
Métodos y propiedades de tipo generics
▶ Cuando usamos variables de tipo para crear componentes genéricos, TypeScript
nos obliga a usar solo métodos generales que están disponibles para cada tipo
function displayType<T, U>(id: T, name: U): void {
id.toString();
name.toString();
id.toFixed();
name.toUpperCase();
247/697
Programación Orientada a Objetos
Programación Orientada
a Objetos
Luciano Diamand
248/697
Programación Orientada a Objetos
Introducción
249/697
Conceptos basicos de POO
▶ La programación orientada a objetos (POO) es un paradigma de programación
que se basa en el concepto de clases y objetos
▶ Se utiliza para estructurar un programa de software en piezas fundamentales
llamadas clases, que se utilizan para crear instancias individuales
▶ La programación orientada a objetos es adecuada para programas de gran
tamaño, complejos y que se actualizan o mantienen activamente
▶ Object representa uno de los tipos de datos de JavaScript
▶ Se utiliza para almacenar colecciones con clave/valor o entidades más complejas
▶ Los objetos se pueden crear de dos formas:
▶ Utilizando el constructor Object():
var myObj = new Object();
myObj.key = value;
▶ Utilizando la sintaxis declarativa (literal):
var myObj = {
key: value
// ...
};
250/697
Beneficios de la Programación Orientada a Objetos
251/697
Principios de la Programación Orientada a Objetos
252/697
Clases
253/697
Objetos
254/697
Abstracción
255/697
Encapsulamiento
256/697
Herencia
257/697
Polimorfismo
▶ Se basa en la herencia
▶ En terminos de programación permite que un solo nombre de clase o de método
represente un código diferente seleccionado mediante algún mecanismo
automático
▶ Un nombre puede tomar diferentes formas y puesto que puede representar código
diferente, también puede representar muchos comportamientos distintos
▶ Pensemos en el termino abrir. Podriamos abrir una puerta, una caja, una ventana
o una cuenta en el banco. Se puede aplicar a muchos objetos distintos en la
realidad. Cada objeto lo interpretara a su manera (se abrira de distintas formas)
258/697
Programación Orientada a Objetos
Clases
259/697
POO basado en prototipos
260/697
POO basado en prototipos cont.
261/697
Clases
262/697
Propiedades
263/697
Métodos
greet() {
console.log('Hello', this.firstName);
}
}
264/697
Métodos cont.
// le asignamos un firstName
p.firstName = 'Juan';
265/697
Métodos cont.
266/697
Constructores
267/697
Constructores cont.
268/697
Constructores cont.
greet() {
console.log('Hello', this.firstName);
}
269/697
Constructores cont.
270/697
Programación Orientada a Objetos
Abstracción
271/697
Abstracción
▶ Los objetos solo revelan mecanismos internos que son relevantes para el uso de
otros objetos, ocultando cualquier código de implementación innecesario
▶ Esta funcionalidad es muy poderosa en el desarrollo y TypeScript nos proporciona
varias formas de manipular la visibilidad de los miembros de un objeto de clase
▶ Al ejemplo anterior, hemos agregado el modificador public en todos los atributos
de Person
▶ De forma predeterminada, todos los atributos son siempre public
// Clase Person
class Person {
public name: string = '';
public age: string = '';
public greetings() {
return this.name + ' ' + this.age;
}
}
272/697
Modificadores de acceso
▶ Podemos utilizar los siguientes modificadores de acceso para controlar la
visibilidad de los atributos
▶ public
▶ protected
▶ private
▶ Además, podemos usar readonly, lo que evitará las asignaciones al campo fuera
del constructor
class Person {
public readonly credentials: string = '';
public name: string = '';
public department: string = '';
constructor(value: string) {
this.credentials = value;
}
274/697
Programación Orientada a Objetos
Encapsulamiento
275/697
Encapsulamiento
276/697
Encapsulamineto cont.
▶ Por lo tanto, una buena práctica es definir a los atributos como private y que no
se puedea acceder a ellos desde fuera de la clase
▶ Tenga en cuenta que solo podemos acceder a campos públicos fuera de la
definición de la clase
▶ Si cambiamos el nivel de acceso de los campos de la clase Person a private:
// Creamos el objeto Preson person1
const person1 = new Person('123456');
277/697
Encapsulamineto cont.
▶ En el siguente ejemplo, hemos definido dos clases de objetos y hemos creado una
instancia de cada uno
▶ El principio de encapsulación establece que la nueva instancia de motor1 no
puede acceder a los atributos de person1
▶ Si intentaramos acceder, obtendriamos una advertencia de este tipo
La propiedad 'edad' no existe en el tipo 'Motor'
278/697
Encapsulamiento cont.
// Clase persona
class Person {
name: string = '';
age: number = 0;
}
// Clase motor
class Motor {
make: string = '';
model: string = '';
color: string = '';
}
279/697
Propiedades getters y setters
280/697
Propiedades getters y setters cont.
▶ Las propiedades de acceso están representadas por los métodos getter y setter
▶ En un objeto literal, se denotan por get y set:
let obj = {
get propName() {
// getter, el código ejecutado al obtener obj.propName
},
set propName(value) {
// setter, el código ejecutado al configurar obj.propName = value
}
};
281/697
Propiedades getters y setters cont.
get fullName() {
return `${this.name} ${this.surname}`;
}
};
282/697
Programación Orientada a Objetos
Herencia
283/697
Herencia
284/697
Herencia cont.
▶ Creemos una nueva clase encargada de generar reportes:
class Report {
data: Array<string>;
constructor(data: Array<string>) {
this.data = data;
}
run() {
this.data.forEach((line) => console.log(line));
}
}
▶ Ahora podemos probar la clase Report de la siguiente manera:
var r: Report = new Report([ 'First line', 'Second line' ]);
r.run();
285/697
Herencia cont.
▶ Si queremos aplicar herencia sobre la clase Report hacemos un extends sobre la
misma:
class TabbedReport extends Report {
headers: Array<string>;
run() {
console.log(this.headers);
super.run();
}
}
286/697
Herencia cont.
▶ Ahora podemos probar el nuevo reporte TabbedReport que hereda del anterior:
287/697
Programación Orientada a Objetos
Polimorfismo
288/697
Polimorfismo
▶ Los objetos pueden tomar más de una forma dependiendo del contexto
▶ El programa determinará qué significado o uso es necesario para cada ejecución de
ese objeto, reduciendo la necesidad de duplicar código
▶ El polimorfismo se basa en la sustitución
289/697
Ejemplo
290/697
Polimorfismo cont.
291/697
Estructuras de datos
Estructuras de datos
Luciano Diamand
292/697
Estructuras de datos
Estructuras de datos
293/697
¿Que son las estructuras de datos?
▶ A un alto nivel, son técnicas para almacenar y organizar datos que facilitan su
modificación, navegación y acceso
▶ Determinan cómo se agrupan los datos, las funciones que podemos usar para
acceder a ellos y las relaciones entre los datos
▶ Se utilizan en casi todas las áreas de la informática y la programación
294/697
¿Que son las estructuras de datos? cont.
295/697
¿Que son las estructuras de datos? cont.
296/697
Estructuras de datos
Arreglos
297/697
Arreglos
▶ La más básica de todas las estructuras de datos, es el arreglo que almacena datos
en la memoria para su uso posterior
▶ Cada arreglo tiene un número de celdas accesibles a través de un índice numérico
correspondiente
▶ El orden donde se inserta el elemento se mantiene
▶ Son iterables (for..of)
▶ Son dinamicos
▶ Permite tener elementos duplicados
▶ Borrar o buscar elementos puede llegar a ser costoso en terminos de procesamiento
298/697
Arreglos cont.
▶ Ventajas
▶ Sencillos de crear y utilizar
▶ Bloque de construcción fundamental para estructuras de datos más complejas
▶ Desventajas
▶ Costoso para insertar/eliminar (resecuenciar valores)
▶ Ineficiente para ordenar
▶ Aplicaciones
▶ La mayoria de los algoritmos utilizan arreglos
▶ Las propias estructuras de datos no primitivas
299/697
Estructuras de datos
Set
300/697
Set
301/697
Arreglos vs Set
▶ Arreglos
▶ El orden en el cual se almacenan los elementos es importante
▶ Se necesitan almacenar duplicados
▶ Set
▶ El orden en el cual se almacenan no es importante
▶ No se permiten duplicados
▶ Simplifica la busqueda o el borrado de elementos
302/697
Estructuras de datos
Objects
303/697
Object
304/697
Estructuras de datos
Maps
305/697
Map
306/697
Objetos vs Maps
▶ Objects
▶ Es muy versatil
▶ Se deben utilizar si es necesario agregar funcionalidad adicional
▶ Maps
▶ Se centra en el almacenamiento y acceso a datos
▶ Mejor performance que los Objetos
▶ El tipo Object de JavaScript es un tipo especial de implementación de Map por
dos razones:
▶ Tiene propiedades añadidas por la clase Object. Las llaves que introduzcas pueden
entrar en conflicto y sobrescribir las propiedades por defecto heredadas de la clase
▶ El tamaño del Map no es contabilizado. Es necesario contar manualmente cuántas
propiedades son definidas por el programador en lugar de ser heredadas del prototipo
307/697
Estructuras de datos
WeakSet y WeakMap
308/697
WeakSet y WeakMap
309/697
Estructuras de datos
Lista enlazada
310/697
Lista enlazada
▶ Es una lista de elementos que no utiliza la ubicación física de los datos en la
memoria
▶ En lugar de índices o posiciones, las listas enlazadas utilizan un sistema de
referencia: los elementos se almacenan en nodos que contienen una referencia al
siguiente nodo
▶ Este sistema permite la inserción y extracción eficiente de elementos sin necesidad
de reorganización
311/697
Lista enlazada cont.
▶ Ventajas
▶ Inserción y extracción eficiente de elementos
▶ Menos complejo que reestructurar un arreglo
▶ Desventajas
▶ Utiliza más memoria que los arreglos
▶ Ineficaz para recuperar un elemento específico
▶ Ineficaz para recorrer la lista hacia atrás
▶ Aplicaciones
▶ Conviene utilizarlo cuando se deben agregar o eliminar datos sucesivos desde
ubicaciones aleatorias
312/697
Lista enlazada cont.
313/697
Lista enlazada cont.
314/697
Lista enlazada cont.
// insertar agregará al final de nuestra lista enlazada
insert(data) {
// creamos un objeto nodo utilizando los datos recibidos
let node = new Node(data);
let current;
// si no tenemos un inicio de la lista, creamos uno
if (!this.head) {
this.head = node;
} else {
// si ya existe un inicio de lista, agregamos el nodo a la lista
current = this.head;
// vamos hasta el final de la lista enlazada (el nodo sin valor en next)
while (current.next) {
current = current.next;
}
// establecemos el valor de next para que sea el nodo actual
current.next = node;
}
// incrementamos el tamaño
this.size++;
}
315/697
Lista enlazada cont.
316/697
Lista enlazada cont.
remove(value) {
// comenzamos en el inicio de la lista
let current = this.head;
// mantenemos una referencia al nodo anterior
if (!current) {
return;
}
let previous;
while (current && current.data !== value) {
previous = current;
current = current.next;
}
if (!current) {
return;
}
if (!previous) {
this.head = current.next;
} else {
previous.next = current.next;
}
this.size--;
}
317/697
Lista enlazada cont.
318/697
Estructuras de datos
Árboles
319/697
Definición
▶ Un árbol es una estructura no lineal en la que cada nodo puede apuntar a uno o
varios nodos
320/697
Conceptos
321/697
Posición
322/697
Características
323/697
Características en relación a su tamaño
▶ Orden: es el número potencial de hijos que puede tener cada elemento de árbol.
De este modo, diremos que un árbol en el que cada nodo puede apuntar a otros
dos es de orden dos, si puede apuntar a tres será de orden tres, etc.
▶ Grado: el número de hijos que tiene el elemento con más hijos dentro del árbol.
En el árbol del ejemplo, el grado es tres, ya que tanto ’A’ como ’D’ tienen tres
hijos, y no existen elementos con más de tres hijos.
▶ Nivel: se define para cada elemento del árbol como la distancia a la raíz, medida
en nodos. El nivel de la raíz es cero y el de sus hijos uno. Así sucesivamente. En el
ejemplo, el nodo ’D’ tiene nivel 1, el nodo ’G’ tiene nivel 2, y el nodo ’N’, nivel 3.
▶ Altura: la altura de un árbol se define como el nivel del nodo de mayor nivel.
Como cada nodo de un árbol puede considerarse a su vez como la raíz de un
árbol, también podemos hablar de altura de ramas. El árbol del ejemplo tiene
altura 3, la rama ’B’ tiene altura 2, la rama ’G’ tiene altura 1, la ’H’ cero, etc.
324/697
Árboles ordenados
▶ Un árbol ordenado, es aquel a partir del cual se puede obtener una secuencia
ordenada siguiendo uno de los recorridos posibles del árbol
▶ En estos árboles es importante que la secuencia se mantenga ordenada aunque se
añadan o se eliminen nodos.
▶ Existen varios tipos de árboles ordenados. Dos de ellos son:
▶ árboles binarios de búsqueda (ABB): son árboles de orden 2 que mantienen una
secuencia ordenada si se recorren en orden.
▶ árboles AVL: son árboles binarios de búsqueda equilibrados, es decir, los niveles de
cada rama para cualquier nodo no difieren en más de 1.
325/697
Definición de Recorridos
326/697
Definición de Recorridos cont.
▶ Ejemplo de recorridos:
inorden : 10 , 30 , 50 , 55 , 60 , 80
preorden : 60 , 30 , 10 , 50 , 55 , 80
postorden : 10 , 55 , 50 , 30 , 80 , 60
327/697
Estructuras de datos
Tablas hash
328/697
Tablas hash
▶ Las tablas hash (Map) son una estructura de datos compleja capaz de almacenar
grandes cantidades de información y recuperar elementos específicos de manera
eficiente
▶ Esta estructura de datos se basa en el concepto de pares clave/valor, donde la
”clave” es una cadena buscada y el ”valor” son los datos emparejados con esa
clave
329/697
Tablas hash cont.
330/697
Tablas hash cont.
▶ Ventajas
▶ La clave puede tener cualquier forma, mientras que los índices de la matriz deben ser
números enteros
▶ Función de búsqueda altamente eficiente
▶ Número constante de operaciones para cada búsqueda
▶ Costo constante por operaciones de inserción o eliminación
▶ Desventajas
▶ Colisiones: un error causado cuando dos claves se convierten en el mismo código
hash o dos códigos hash apuntan al mismo valor
▶ Estos errores pueden ser comunes y, a menudo, requieren una revisión de la función
hash
▶ Aplicaciones
▶ Almacenamiento de base de datos
▶ Búsquedas de direcciones por nombre
331/697
Estructuras de datos
332/697
Complejidad del algoritmo
333/697
Notacion Big O
▶ Es una métrica relativa que muestra qué tan rápido crecerá el tiempo de ejecución
del algoritmo o su memoria consumida dependiendo del crecimiento del tamaño
de entrada
▶ Los valores absolutos de tiempo y memoria varían en diferentes hardware, por lo
que debemos usar una métrica relativa
▶ El mismo programa puede ejecutarse en 1 segundo en una computadora y en 10
segundos en otra
▶ Cuando comparamos las complejidades de tiempo de dos algoritmos, se requiere
que se ejecuten en la misma configuración de hardware predefinida, lo que no es
conveniente y, a veces, no es reproducible
▶ La notación Big O define la relación entre tamaño de entrada frente tiempo
dedicado para la complejidad del tiempo y tamaño de entrada frente a la
memoria consumida para la complejidad del espacio
334/697
Notacion Big O cont.
▶ Constante: O(1)
▶ Logarítmico: O(log n)
▶ Lineal: O(n)
▶ Linearítmica: O(n log(n))
▶ Cuadrático: O(n2 )
▶ Exponencial: O(2n )
▶ Factorial: O(n!)
335/697
Notacion Big O cont.
▶ Gráficos de funciones comúnmente utilizados en el análisis de algoritmos
336/697
Notacion Big O cont.
La siguente tabla lista de algunas de las notaciones Big O más comunes y sus
comparaciones de rendimiento con diferentes tamaños de datos de entrada
337/697
Ejemplo de O(1)
338/697
Ejemplo O(n)
▶ Eleva un número a la potencia
/**
* Raise number to the power.
*
* Example:
* number = 3
* power = 2
* output = 3^2 = 9
*
* @param {number} number
* @param {number} power
* @return {number}
*/
function iterativePower(number, power) {
let result = 1;
return result;
}
339/697
Ejemplo recursivo de O(n)
▶ Calcular factoriales
/**
* Calculate factorial.
*
* Example:
* number = 5
* output = 120
*
* @param {number} number
* @return {number}
*/
function factorial(number) {
if (number === 0) {
return 1;
}
return factorial(number - 1) * number;
}
340/697
Ejemplo de O(n²)
341/697
Laboratorio práctico - Estructura de datos Labs
Es momento de practicar con las estructuras de
datos
▶ Ejercicios con estructuras de datos primitivas
arreglos, Set y Map
▶ Implementación de una lista enlazada
▶ Implementación de una lista doblemente
enlazada
▶ Implementación de una Pila
▶ Implementación de una Cola
▶ Implementación de una Cola circular
▶ Implementación de un Árbol binario
▶ Implementación propia de un Map sin utilizar la
clase de ES6
342/697
Algoritmos
Algoritmos
Luciano Diamand
343/697
Algoritmos
Sorting
344/697
Estrategias aplicadas durante el ordenamiento
345/697
Ordenamiento
▶ Algoritmos de ordenamientos:
▶ Bubble Sort
▶ Selection Sort
▶ Insertion Sort
▶ Merge Sort
▶ Quick Sort
346/697
Métodos auxiliares para intercambiar y comparar
function defaultCompare(a, b) {
if (a === b) {
return 0;
}
return a < b ? Compare.LESS_THAN : Compare.BIGGER_THAN;
}
347/697
Bubble Sort
348/697
Bubble Sort cont.
349/697
Bubble Sort cont.
350/697
Insertion sort
▶ Hay una parte del arreglo que está ordenado y otro sin ordenar
▶ Debemos comparar los elementos de la parte no ordenada uno por uno e
insertarlos en la parte ordenada en el orden correcto
▶ Pseudo código en orden ascendente
▶ Comenzamos comparando el segundo elemento del arreglo con el primer elemento,
suponiendo que el primer elemento es la parte ordenadai
▶ Intercambiamos si el segundo elemento es más pequeño que el primero
▶ Iteramos comparando el primer elemento con cada elemento de la parte no ordenada
▶ Si el elemento de la parte no ordenada es más pequeño que el primer elemento lo
intercambiamos
▶ Luego de recorrer todo el arreglo, incrementamos la parte ordenada al siguiente
índice y comparamos recursivamente el valor del último índice de la parte ordenada
con cada valor de la parte no ordenada
▶ Intercambiamos donde el valor de la porción sin clasificar es menor
▶ La porción ordenada crecerá hasta que cubra todo el arreglo dando como resultado
una matriz ordenada
351/697
Insertion Sort cont.
352/697
Insertion Sort cont.
353/697
Selection Sort
354/697
Selection Sort cont.
355/697
Selection Sort cont.
356/697
Merge Sort
357/697
Merge Sort cont.
358/697
Merge Sort cont.
359/697
Quick Sort
360/697
Quick Sort cont.
361/697
Quick Sort cont.
362/697
Quick Sort cont.
363/697
Algoritmos
Algoritmos de búsqueda
364/697
Algoritmos de búsqueda
365/697
Linear Search
366/697
Pseudo código
367/697
Binary Search
368/697
Pseudo código
369/697
Implementacion
370/697
Patrones de diseno
Patrones de diseno
Luciano Diamand
371/697
Patrones de diseno
Patrones diseño
372/697
Patrones diseño
373/697
Patrones de diseno
Singleton
374/697
Singleton
375/697
Singleton cont.
1 class Counter {
2
3 constructor() {
4 this.counter = 0;
5 }
6
7 getInstance() {
8 return this;
9 }
10
11 getCount() {
12 return this.counter;
13 }
14
15 increment() {
16 this.counter++;
17 }
18
19 decrement() {
20 this.counter--;
21 }
22 }
376/697
Singleton cont.
▶ Sin embargo, la clase asi definida no cumple con los criterios para un Singleton
▶ Un Singleton solo debería poder ser instanciado una vez, pero en el ejemplo
anterior podemos crear múltiples instancias de la clase Counter
const counter1 = new Counter();
const counter2 = new Counter();
377/697
Singleton cont.
378/697
Singleton cont.
class Counter {
static instance;
constructor() {
this.counter = 0;
if (Counter.instance) {
throw new Error("You can only create one instance!");
}
Counter.instance = this;
}
getInstance() {
return Counter.instance;
}
getCount() {
return this.counter;
}
increment() {
this.counter++;
}
decrement() {
this.counter--;
}
}
379/697
Pruebas
380/697
Patrones de diseno
Ejemplo en JavaScript
381/697
Ejemplo utilizando objetos
1 l e t count = 0;
2
3 const c o u n t e r = {
4 increment () {
5 r e t u r n c o u n t ++;
6 },
7 decrement () {
8 r e t u r n count −−;
9 }
10 };
11
12 Object . f r e e z e ( counter ) ;
13 ex po rt { c o u n t e r } ;
382/697
Patrones de diseno
Factory
383/697
Factory
384/697
Introducción
console.log(user1);
console.log(user2);
385/697
Factory cont.
386/697
Patrón método de fábrica
387/697
Patrón método de fábrica cont.
class Teacher {
constructor(type, name, instrument, programmingLanguage) {
this.name = name;
if (type === TEACHER_TYPE.CODING) {
this.programmingLanguage = programmingLanguage;
} else if (type === TEACHER_TYPE.MUSIC){
this.instrument = instrument;
}
}
}
388/697
Patrón método de fábrica cont.
class CodingTeacher {
constructor(properties) {
this.name = properties.name;
this.programmingLanguage = properties.programmingLanguage;
}
}
389/697
Patrón método de fábrica cont.
class MusicTeacher {
constructor(properties) {
this.name = properties.name;
this.instrument = properties.instrument;
}
}
class TeacherFactory {
static getTeacher(type, properties) {
if (type === TEACHER_TYPE.CODING) {
return new CodingTeacher(properties);
} else if (type === TEACHER_TYPE.MUSIC) {
return new MusicTeacher(properties);
}
}
}
390/697
Patrón método de fábrica cont.
391/697
Patrones de diseno
Patrón Command
392/697
Patrón Command
393/697
Patron Command cont.
class OrderManager {
constructor() {
this.orders = [];
}
placeOrder(order) {
this.orders.push(order);
return `You have successfully ordered ${order.description} (${order.id})`;
}
trackOrder(order) {
return `Your order ${order.id} will arrive in 20 minutes.`;
}
cancelOrder(order) {
this.orders = this.orders.filter(elem => elem.id !== order.id);
return `You have canceled your order ${order.id}`;
}
}
394/697
Patrón command cont.
manager.placeOrder(order);
manager.trackOrder(order);
manager.cancelOrder(order);
▶ Sin embargo, existen desventajas al invocar los métodos directamente en la
instancia de OrderManager
395/697
Patrón Command cont.
▶ Queremos desacoplar los métodos del objeto OrderManager y crear funciones que
encapsulen la funcionalidad de forma individual (comando)
▶ Vamos a refactorizar la clase OrderManager: en lugar de tener los métodos
placeOrder, cancelOrder y trackOrder, tendrá un único método: ejecutar
▶ Este método ejecutará cualquier comando que se le pase como argumento
396/697
Patrón Command cont.
▶ Cada comando debe tener acceso a las órdenes del OrderManager, que pasaremos
como su primer argumento
class OrderManager {
constructor() {
this.orders = [];
}
execute(command, ...args) {
return command.execute(this.orders, ...args);
}
}
▶ Necesitamos crear tres comandos para el administrador de pedidos:
▶ PlaceOrderCommand
▶ CancelOrderCommand
▶ TrackOrderCommand
397/697
Patrón Command cont.
class Command {
constructor(execute) {
this.execute = execute;
}
}
function PlaceOrderCommand(order) {
return new Command(orders => {
orders.push(order);
return `You have successfully ordered ${order.description} (${order.id})`;
});
}
function CancelOrderCommand(order) {
return new Command(orders => {
orders = orders.filter(elem => elem.id !== order.id);
return `You have canceled your order ${order.id}`;
});
}
function TrackOrderCommand(order) {
return new Command(() => `Your order ${order.id} will arrive in 20 minutes.`);
}
398/697
Patrón Command cont.
manager.execute(new PlaceOrderCommand(order));
manager.execute(new TrackOrderCommand(order));
manager.execute(new CancelOrderCommand(order));
▶ Ventajas
▶ El patrón de comando nos permite desacoplar los métodos del objeto que ejecuta la
operación
▶ Le da más control si se trata de comandos que tienen una vida útil determinada o
comandos que deben ponerse en cola y ejecutarse en momentos específicos
399/697
Patrones de diseno
Strategy
400/697
Strategy
401/697
Usando Strategy
402/697
Diagram
403/697
Ejemplo cont.
class StrategyManager {
constructor() {
this._strategies = [];
}
addStrategy(strategy) {
this._strategies = [...this._strategies, strategy];
}
getStrategy(name) {
return this._strategies.find(strategy => strategy._name === name);
}
}
class Strategy {
constructor(name, handler) {
this._name = name;
this._handler = handler;
}
doAction() {
this._handler;
}
}
404/697
Ejemplo cont.
strategyManager.addStrategy(strategy1);
strategyManager.addStrategy(strategy2);
405/697
Patrones de diseno
Façade
406/697
Façade
▶ El patrón Façade proporciona una interfaz que protege a los clientes de una
funcionalidad compleja en uno o más subsistemas
▶ Es un patrón simple que puede parecer trivial pero es poderoso y extremadamente
útil
▶ A menudo está presente en los sistemas que se construyen en torno a una
arquitectura de múltiples capas
407/697
Usando Façade
▶ La intención de Façade es proporcionar una interfaz de alto nivel que haga que un
subsistema o conjunto de herramientas sea fácil de usar para el cliente
▶ En el servidor, en una aplicación Web multicapa, con frecuencia posee una capa
de presentación que es cliente para una capa de servicio
▶ La comunicación entre estas dos capas se realiza a través de una API bien definida
▶ Esta API, o Façade, oculta las complejidades de los objetos y sus interacciones de
la capa de presentación
▶ Otra área donde se utilizan Façades es en la refactorización
▶ Suponga que tiene un conjunto confuso o desordenado de objetos heredados por
los que el cliente no debería preocuparse
▶ Puedes ocultar este código detrás de una Façade. El Façade expone solo lo
necesario y presenta una interfaz más limpia y fácil de usar
▶ Las Façade se combinan frecuentemente con otros patrones de diseño
408/697
Diagrama
409/697
Ejemplo cont.
let currentAccountNumber = 0;
class AccountManager {
createAccount(type, details) {
const accountNumber = AccountManager.getUniqueAccountNumber();
let account;
if (type === 'current') {
account = new CurrentAccounts();
} else {
account = new SavingsAccounts();
}
return account.addAccount({ accountNumber, details });
}
static getUniqueAccountNumber() {
return ++currentAccountNumber;
}
}
410/697
Ejemplo cont.
class Accounts {
constructor() {
this.accounts = [];
}
addAccount(account) {
this.accounts.push(account);
return this.successMessage(account);
}
getAccount(accountNumber) {
return this.accounts.find(account => account.accountNumber === accountNumber);
}
successMessage(account) {}
}
411/697
Ejemplo cont.
412/697
Ejemplo cont.
413/697
Ejemplo cont.
414/697
Material adicional
▶ https://medium.com/javascript-scene/javascript-factory-functions-
with-es6-4d224591a8b1
415/697
Laboratorio práctico - Patrones de diseno Labs
416/697
Programación funcional
Programación funcional
Luciano Diamand
417/697
Programación funcional
418/697
Funciones de orden superior
▶ Una función de orden superior es una función que opera sobre funciones, tomando
una o más funciones como argumentos y devolviendo una nueva función.
// This higher-order function returns a new function that passes its
// arguments to f and returns the logical negation of f's return value;
function not(f) {
return function(arg) { // Return a new function
let result = f(arg); // that calls f
return !result; // and negates its result.
};
}
419/697
Funciones de orden superior cont.
Para ilustrar la escritura de funciones de orden superior con flechas, veamos un ejemplo
clásico: sumar. En ES5 se vería así:
function add(x){
return function(y){
return y + x;
};
}
420/697
Funciones de orden superior cont.
421/697
Funciones de orden superior cont.
arr.filter(isNumber('3'));
422/697
Programación funcional
Funciones puras
423/697
Definición
▶ Una función pura es una función que siempre devuelve el mismo resultado si se
pasan los mismos argumentos
▶ No depende de ningún cambio de estado o datos durante la ejecución de un
programa
▶ Solo depende de sus argumentos de entrada
▶ Además, una función pura no produce ningún efecto secundario observable, como
solicitudes de red o mutación de datos, etc.
function calculateGST( productPrice ) {
return productPrice * 0.05;
}
424/697
Definición cont.
425/697
Definición cont.
426/697
Programación funcional
Definición
427/697
Nuevas funciones de arreglos
428/697
Find
429/697
Filter
▶ filter: filter es similar a find excepto que devuelve todos los elementos que
coinciden con un criterio de búsqueda
var filterItems = [
{ name: 'jon', age: 20 },
{ name: 'linda', age: 22 },
{ name: 'jon', age: 40 }
];
var results = filterItems.filter(function (item, index) {
return item.name === 'john';
});
console.log(results);
▶ La función filter también puede tomar un segundo parámetro opcional para el
número de índice del elemento del arreglo
▶ Similar a como funciona find en el sentido de que hay una verificación para ver si
se encuentra una determinada coincidencia
▶ Sin embargo, para el filtro, se devuelven todas las coincidencias
430/697
Map
431/697
Reduce
▶ reduce: La función de reducción toma cada elemento del arreglo y, según la lógica
personalizada, crea un único valor final
const allTrucks = [ 2, 5, 7, 10 ];
const initialCapacity = 0;
const allTonnage = allTrucks.reduce((totalCapacity,
currentCapacity) => {
totalCapacity = totalCapacity + currentCapacity;
return totalCapacity;
}, initialCapacity);
console.log(allTonnage);
432/697
Otros ejemplos
console.log(filtered);
console.log(squares);
433/697
Laboratorio práctico - Programacion funcional Labs
434/697
Programación Web: HTML y CSS
Programación Web:
HTML y CSS
Luciano Diamand
435/697
Programación Web: HTML y CSS
436/697
HTML
437/697
El W3C
438/697
¿Qué es HTML?
▶ Lenguaje de marcas
▶ Al ser texto plano es posible utilizar cualquier editor de textos para desarrollar
▶ Ejemplo de un documento HTML:
<!DOCTYPE html>
<html>
<head>
<title>Primer ejemplo en HTML</title>
</head>
<body>
<h1>Mi colección de discos</h1>
<h2>Grupo 1</h2>
<p>Descripción del grupo</p>
<ol>
<li>Disco 1</li>
<li>Disco 2</li>
</ol>
</body>
</html>
439/697
Elementos HTML
▶ Los elementos son los componentes fundamentales del HTML
▶ Cuentan con dos propiedades básicas:
▶ Atributos
▶ Contenido
▶ En general se conforman con una etiqueta de apertura y otra cierre
▶ Los atributos se colocan dentro la etiqueta de apertura, y el contenido se coloca
entre la etiqueta de apertura y la de cierre
440/697
Atributos
▶ Los atributos de un elemento son pares de nombres y valores separados por un ’=’
que se encuentran dentro de la etiqueta de apertura de algún elemento
▶ Los valores deben estar entre comillas
▶ Ejemplos:
<span id="id_de_este_elemento" style="color: red;" title="Curso de HTML">
Curso de HTML
</span>
441/697
Tipos de Elementos
442/697
Elementos HTML
▶ Elementos y propiedades:
▶ Títulos: <h1> </h1>, <h2> </h2>,…, <h6> </h6>
▶ Párrafos: <p> </p>
▶ Listas (ol, ul): <ol> <li> </li> <li> </li> </ol>
▶ Vínculos:
<a href="http://...">Descripción</a>
<a ref="mailto:[email protected]">Jose</a>
▶ Avance de línea: <br />
▶ Imágenes: <img scr="imagen.png" width="130" height="50" />
443/697
Elementos HTML cont
▶ Elementos y propiedades:
▶ Líneas: <hr />
▶ Texto en negritas: <strong> </strong>
▶ Tablas: <table> </table>
▶ Filas de una tabla: <tr> </tr>
▶ Celdas de una tabla: <td> </td>
▶ Encabezado de una tabla: <th> </th>
▶ Marcos (obsoletos): <frameset> </frameset> <frame> </frame>
444/697
Estructura de un documento HTML
▶ <html></html>
▶ Delimita el Documento HTML
▶ Cabecera: <head> </head>
▶ Título de la página: <title> </title>
▶ Meta-tags: <meta http-equiv="Content-language" content="es">
▶ Estilos: <link rel="stylesheet" href="estilo.css" media="screen"
type="text/css">
▶ Cuerpo: <body> </body> aquí se incluyen los contenidos visibles del documento
▶ <body background="imagenes/logo.gif">
▶ <body bgcolor="white">
▶ <body leftmargin="5px" bottommargin="5px">
445/697
Elementos de la cabecera
446/697
Contenedores (Block-Level Elements)
▶ Párrafos
▶ Es el contenedor mas común
▶ Su sintaxis es: <p> </p>
▶ Encabezados
▶ Indican una jerarquía de secciones dentro del documento
▶ Su sintáxis: <h1> </h1>, <h2></h2>, <h3></h3>,…<h6></h6>
▶ Listas
▶ Listas de Definiciones (consiste en pares término - definición)
▶ <dl> </dl> crea la lista
▶ <dt> </dt> crea un nuevo término
▶ <dd> </dd> crea una nueva definición
447/697
Contenedores (Block-Level Elements)
▶ Lista Ordenada
▶ <ol> </ol>: Crea una nueva lista
▶ <li> </li>: Crea un nuevo ítem en la lista
▶ Lista sin ordenada
▶ <ul> </ul>: Crea una nueva lista
▶ <li> </li>: Crea un nuevo ítem en la lista
▶ Capas
▶ Permiten agrupar y diagramar contenidos en los documentos
▶ Su sintaxis es: <div> </div>
448/697
Tablas en HTML
449/697
Tablas en HTML cont.
450/697
Formularios
▶ Un formulario HTML permite que el usuario ingrese datos y que estos sean
enviados al servidor
▶ Normalmente los datos serán almacenados en una base de datos
451/697
Formularios
452/697
Formularios
▶ Propiedades
▶ name: Nombre con que lo referenciamos
▶ action: que quermos hacer con los datos
▶ method: método para mover los datos (get/post)
▶ enctype: Tipo de contenido de los datos
<html>
<head>
<title>Primer ejemplo en HTML</title>
</head>
<body>
<form method="POST" action="mailto:[email protected]" enctype="text/plain">
<input .../>
</form>
</body>
</html>
453/697
Formularios
▶ Elementos de formularios
▶ input
▶ text
▶ password
▶ checkbox
▶ radio
▶ submit
▶ rest
▶ file
▶ hidden
▶ image
▶ button
▶ textarea
▶ select
▶ button
454/697
Formularios
▶ text
<input type="text" value="Valor" size=NN maxlength=NN />
▶ password
<input type="password" value="Valor" size=NN maxlength=NN />
▶ radio
<input type="radio" name="tipoDocumento" value="DNI" checked /> DNI
<input type="radio" name="tipoDocumento" value="LE" /> LE
▶ checkbox
<input type="checkbox" name="airBa" value="SI" checked /> Airbag
<input type="checkbox" name="direccion" value="NO" /> Dirección asistida
▶ hidden
<input type="hidden" name="direccion" value="NO" />
▶ file
<input type="file" name="fileName" />
▶ image
<input type="image" src="submit.png" alt="Enviar" width="94" height="26" />
455/697
Formularios
Lista desplegable
▶ <select>...</select>
<html>
<head>
<title>Taller de programación</title>
</head>
<body>
<form method="POST" action="mailto:[email protected]" enctype="text/plain">
<select name="tipoDocumento">
<option value="DNI" selected>DNI</option>
<option value="LE">Libreta de Enrolamiento</option>
<option value="LC">Libreta Civica</option>
<option value="PASAPORTE">Pasaporte</option>
</select>
</form>
</body>
</html>
456/697
Formularios
Lista enrollable
▶ select incluyendo el atributo ”size”
<html>
<head>
<title>Taller de programación</title>
</head>
<body>
<form method="POST" action="mailto:[email protected]" enctype="text/plain">
<select name="tipoDocumento" size="3">
<option value="DNI" selected>DNI</option>
<option value="LE">Libreta de Enrolamiento</option>
<option value="LC">Libreta Civica</option>
<option value="PASAPORTE">Pasaporte</option>
</select>
</form>
</body>
</html>
457/697
Formularios
Area de Texto
<html>
<head>
<title>Taller de programación</title>
</head>
<body>
<form method="POST" action="mailto:[email protected]" enctype="text/plain">
<textarea name="Comentario" cols="60" rows="5" wrap="soft">
</textarea>
</form>
</body>
</html>
458/697
Formularios cont.
459/697
Programación Web: HTML y CSS
HTML Semantico
460/697
Elementos de estructura
461/697
Ejemplo de estructura antes de HTML 5
462/697
Ejemplo de estructura con HTML 5
463/697
Información adicional
▶ https://htmlcheatsheet.com/
▶ http://html5doctor.com/downloads/h5d-sectioning-flowchart.pdf
464/697
Programación Web: HTML y CSS
465/697
Selectores
▶ Los selectores se utilizan para identificar a que elementos se le aplican las reglas
de CSS
▶ Existen distintos tipos de selectores, los cuales se detallan a continuación
466/697
Selectores
467/697
Selectores
468/697
Selectores
469/697
Selectores
470/697
Selectores
471/697
Selectores
▶ Selector de id: se utiliza al igual que el selector de clase, pero trabaja sobre el
valor del atributo id
▶ Se utiliza el signo cardinal #
▶ Dado que el valor del atributo id debe ser único dentro de un documento, este
selector se aplica al contenido de dicho elemento
472/697
Selectores
473/697
Selectores
474/697
Selectores
475/697
Selectores
476/697
Selectores
477/697
Selectores
▶ Selectores de atributo:
▶ Selector de existencia: p[id]
▶ Selector de igualdad: p[id="summary"]
▶ Selector de espacio: p[class~="XHTML"]
▶ Selector guión: p[language|="en"]
▶ Selector prefijo (CSS3): p[attr^="b"]
▶ Selector substring (CSS3): p[attr*="on"]
▶ Selector sufijo (CSS3): p[attr$="x"]
478/697
Lengths
479/697
Unidades relativas
480/697
Unidades absolutas
481/697
Introducción al modelo de caja
482/697
Document Object Model (DOM)
Document Object
Model (DOM)
Luciano Diamand
483/697
Document Object Model (DOM)
Introducción
484/697
¿Qué es el DOM?
▶ El DOM define una forma estándar para acceder y manipular documentos HTML
▶ El DOM presenta un documento HTML como una estructura de árbol
485/697
¿Qué es el DOM? cont.
486/697
¿Qué es el DOM? cont.
▶ El DOM es:
▶ Un modelo de objetos estándar para HTML
▶ Una interfaz de programación estándar para HTML
▶ Un estándar W3C
▶ El DOM define los objetos y las propiedades de todos los elementos HTML y los
métodos para acceder a ellos
▶ En otras palabras:
▶ El DOM es un estándar sobre cómo obtener, cambiar, agregar o eliminar elementos
HTML
487/697
Ejemplo
<!DOCTYPE html>
<html>
<body>
<script>
function changeImage() {
element = document.getElementById('myimage');
if (element.src.match('bulbOn')) {
element.src = 'pic_bulbon.png';
} else {
element.src = 'pic_bulboff.png';
}
}
</script>
<img id="myimage" onclick="changeImage()"
src="pic_bulboff.png" width="100" height="180" />
<p>Click to turn on/off the light</p>
<body>
</html>
488/697
Nodos DOM
489/697
Árbol de nodos DOM
490/697
Árbol de nodos DOM cont.
▶ Con DOM, se puede acceder a todos los nodos del árbol mediante JavaScript
▶ Todos los elementos HTML (nodos) se pueden modificar y los nodos se pueden
crear o eliminar
491/697
Nodo padres, hijos y hermanos
492/697
Nodo padres, hijos y hermanos cont.
▶ La siguiente imagen ilustra una parte del árbol de nodos y la relación entre los
nodos:
493/697
Nodo padres, hijos y hermanos cont.
494/697
Nodo padres, hijos y hermanos cont.
495/697
Advertencia!
496/697
Métodos DOM
▶ Los métodos son acciones que puede realizar en los nodos (Elementos HTML)
▶ Interfaz de programación
▶ Se puede acceder al DOM con JavaScript (y otros lenguajes de programación)
▶ Todos los elementos HTML se definen como objetos, y la interfaz de programación
son los métodos y las propiedades del objeto
▶ Un método es una acción que puede realizar (como agregar o modificar un elemento)
▶ Una propiedad es un valor que puede obtener o establecer (como el nombre o el
contenido de un nodo)
497/697
Objetos DOM - Métodos y propiedades
498/697
Algunos métodos del objeto DOM
499/697
La propiedad innerHTML
500/697
La propiedad del nodoValue
501/697
Obtener el valor de un elemento
<!DOCTYPE html>
<html>
<body>
<p id="intro">Hello World!</p>
<script>
x = document.getElementById("intro");
document.write(x.firstChild.nodeValue);
</script>
</body>
</html>
502/697
Acceso a elementos HTML (nodos)
503/697
El método getElementsByTagName()
<!DOCTYPE html>
<html>
<body>
<p>Hello World!</p>
<p>The DOM is very useful!</p>
<p>This example demostrates the <b>getElementByTagName</b> method.</p>
<script>
x = document.getElementByTagName("p");
docuemnt.write("Text of first partagraph: " + x[0].innertHTML);
</script>
</body>
</html>
504/697
Modificar elementos HTML
505/697
Cambiar el contenido HTML
<script>
document.getElementById("p1").innerHTML = "New text!";
</script>
506/697
Cambiar el estilo HTML
<script>
document.getElementById("p2").style.color="blue";
</script>
507/697
Creando nuevos elementos HTML
▶ Para agregar un nuevo elemento al DOM, primero debe crear el elemento (nodo)
y luego agregarlo a un elemento existente
<!DOCTYPE html>
<html>
<body>
<div id="div1">
<p id="p1">This is a paragraph.</p>
<p id="p2">This is another paragraph.</p>
</div>
<script>
var para = document.createElement("p");
var node = document.createTextNode("This is new.");
para.appendChild(node);
508/697
Usando events
509/697
Usando eventos cont.
▶ Ejemplo 1:
<input
type="button"
onclick="document.body.style.backgroundColor='lavender';"
value="Change background color"
/>
▶ Ejemplo 2:
<script>
function ChangeBackground() {
document.body.style.backgroundColor="lavender";
}
</script>
<input
type="button"
onclick="ChangeBackground()"
value="Change background color"
/>
510/697
Reacción a eventos (usando JavaScript)
511/697
Los eventos onmouseover y onmouseout
<!DOCTYPE html>
<html>
<body>
<div onmouseover="mOver(this)" onmouseout="mOut(this)"
style="background-color: #D94A38; width: 120px; height: 20px; padding: 40px;">
Mouse Over Me
</div>
<script>
function mOver(obj) {
obj.innerHTML = "Thank You";
}
function mOut(obj) {
obj.innerHTML = "Mouse Over Me";
}
</script>
</body>
</html>
512/697
Los eventos onmousedown, onmouseup y onclikc
<!DOCTYPE html>
<html>
<body>
<div onmousedown="mDown(this)" onmouseup="mUp(this)"
style="background-color: #D94A38; width: 90px; height: 20px; padding: 40px;">
Click Me
</div>
<script>
function mDown(obj) {
obj.style.backgroundColor = "#1EC5E5";
obj.innerHTML = "Release Me";
}
function mUp(obj) {
obj.style.backgroundColor = "#D94A38";
obj.innerHTML = "Thank You";
}
</script>
</body>
</html>
513/697
Accesibilidad
Accesibilidad
Luciano Diamand
514/697
Accesibilidad
Accesibilidad
515/697
¿Qué es la Accesibilidad Web?
516/697
Tecnología de asistencia
517/697
Métodos de acceso alternativos
▶ Teclados alternativos
▶ Ratones de un solo botón
▶ Bolas de seguimiento/Joysticks
▶ Dispositivos para señalar de cabeza
▶ Asistentes para señalar/escribir
▶ Interruptores/Teclados en pantalla
▶ Ventanas táctiles
518/697
Los dispositivos señaladores de baja tecnología pueden incluir
▶ Punteros de cabeza/barbilla
▶ Lápices
▶ Punteros de mano adaptados
▶ Palos de boca
519/697
Web Content Accessibility Guidelines (WCAG) 2.0
▶ (WCAG) 2.0 define cómo hacer que el contenido web sea más accesible para las
personas con discapacidades
▶ La accesibilidad implica una amplia gama de discapacidades, incluidas
discapacidades visuales, auditivas, físicas, del habla, cognitivas, del lenguaje, de
aprendizaje y neurológicas
▶ Aunque estas pautas cubren una amplia gama de temas, no pueden abordar las
necesidades de las personas con todos los tipos, grados y combinaciones de
discapacidad
▶ Estas pautas también hacen que el contenido Web sea más utilizable por personas
mayores con habilidades cambiantes debido al envejecimiento y, a menudo,
mejoran la usabilidad para los usuarios en general
520/697
WCAG 2.0
521/697
Niveles de conformidad
522/697
Niveles de conformidad
523/697
Sección 508
524/697
WCAG 2.0 frente a la Sección 508
▶ Los criterios de éxito de las WCAG 2.0 son más explícitos que los estándares 508
existentes.
▶ WCAG 2.0 está escrito de una manera que es tecnológicamente neutral y, por lo
tanto, es directamente aplicable a una amplia gama de tipos y formatos de
contenido
▶ WCAG 2.0 tiene 38 criterios de éxito de nivel A y AA
▶ De estos, 22 están redactados de manera diferente pero equivalentes en esencia a
los requisitos actuales de 508
▶ La Sección 508 está en proceso de actualización para alinearse con WCAG 2.0
(nivel AA)
525/697
WCAG 2.1
526/697
Espectro de discapacidades
▶ Visual
▶ Auditivo
▶ Físico
▶ Cognitivo
▶ Discurso
527/697
Ejemplos de Buenas Prácticas para Discapacidades Visuales
528/697
Discapacidades auditivas
▶ Problemas de audición
▶ Sordera
529/697
Ejemplos de buenas prácticas para discapacidades auditivas
530/697
Ejemplos de discapacidades físicas
▶ Amputación
▶ Artritis
▶ Fibromialgia
▶ Reumatismo
▶ Distrofia muscular
▶ Lesión por estrés repetitivo
▶ Temblores y espasmos
▶ Cuadriplejia
531/697
Buenas prácticas para discapacidades físicas
532/697
Ejemplos de discapacidades cognitivas
533/697
Buenas prácticas para los trastornos cognitivos
534/697
Comprobación de la accesibilidad
▶ Prueba manual
▶ Comprobación del teclado
▶ Uso con lector de pantalla
▶ Herramientas en línea
▶ WebAIM WAVE https://wave.webaim.org/
535/697
Temas potenciales
▶ Accesibilidad Recursos/Herramientas
▶ Imágenes y texto alternativo y contraste
▶ Accesibilidad de PDF
▶ Lectores de pantalla (de escritorio y móviles)
▶ Accesibilidad del teclado
536/697
Mas información
▶ https://www.w3.org/TR/WCAG/
▶ https://www.section508.gov/
▶ https://www.access-board.gov/ict/wcag2ict.html
▶ https://www.w3.org/TR/WCAG21/
▶ https://www.w3.org/WAI/fundamentals/
▶ https://www.w3.org/WAI/standards-guidelines/wcag/
537/697
Accesibilidad
HTML y ARIA
538/697
¿Qué es ARIA?
▶ Hoy en día, como mejor práctica, los desarrolladores Web utilizan HTML
semántico al construir sitios y páginas Web
▶ El HTML semántico es donde se utilizan los elementos HTML más apropiados y
descriptivos, ayudando a los robots, a los servicios y a aquellos que dependen de
las tecnologías de asistencia (AT) a comprender el significado del contenido
▶ ARIA va un paso más allá, agregando un conjunto de atributos que ayudan a
definir el contenido de una página más allá de lo que el HTML puede hacer por sí
solo
▶ Estos atributos ARIA añaden caracteristicas como navegación accesible, consejos
sobre formularios, mensajes de error y otros útiles potenciadores
539/697
¿Qué son los roles de ARIA?
▶ Siempre que sea posible, se debe utilizar el HTML semántico nativo, pero se
pueden utilizar los roles ARIA para rellenar cualquier hueco
▶ Los roles ARIA son aplicados a elementos HTML usando el atributo role, y
pueden ser usados:
▶ Para describir los elementos más nuevos o conceptuales que podrían no tener un
soporte completo para el navegador o ser entendidos por los lectores de pantalla, por
ejemplo <button role="tab">Tab</button>
▶ Para ”arreglar” (lo mejor posible) el HTML implementado incorrectamente donde no
se ha usado la semántica, por ejemplo <div role="button">Button</div>
540/697
Atributo role
541/697
Atributo role cont.
542/697
¿Qué son los estados y propiedades de ARIA?
▶ Los estados y propiedades de ARIA proporcionan apoyo a los roles de ARIA que
existen en una página
▶ Cuando se combinan con los roles, pueden suministrar tecnologías de asistencia
con información adicional de la interfaz de usuario
▶ Siempre que hay cambios en los estados o propiedades, las tecnologías de
asistencia son notificadas de este cambio para que puedan alertar al usuario de
que se ha producido un cambio
▶ Las propiedades de ARIA se diferencian de los estados en que el valor de una
propiedad (como aria-labelledby) suele ser menos probable que cambie a lo
largo del ciclo de vida de la aplicación, mientras que es probable que un estado
(por ejemplo, aria-checked) cambie con bastante frecuencia debido a la
interacción del usuario
▶ Las propiedades y estados de ARIA pueden clasificarse como:
▶ Atributos del Widget
▶ Atributos de las regiones vivas
▶ Atributos de arrastrar y soltar
▶ Atributos de la relación 543/697
Atributos del Widget
544/697
Atributos del Widget cont.
545/697
Atributos de las regiones vivas
546/697
Atributos de arrastrar y soltar
547/697
Atributos de relación
▶ Estos tipos de atributos ayudan a conectar dos elementos que son difíciles de
identificar de otra manera utilizando la estructura del documento HTML
▶ Un ejemplo de este tipo de atributo es el aria-labelledby por atributo
▶ Este atributo ayuda a conectar un campo de entrada con una etiqueta en un
formulario (pero puede utilizarse para relaciones menos obvias):
<form>
<label for="name" id="nameLabel">Name</label>
<input type="text" aria-labelledby="nameLabel" />
</form>
▶ Otros ejemplos de atributos de relación son aria-colspan, aria-controls,
aria-owns, aria-flowto, etc.
548/697
Informacion adicional
▶ https://www.w3.org/TR/wai-aria/
▶ https://www.digitala11y.com/wai-aria-1-1-cheat-sheet/
▶ https://www.digitala11y.com/accessibility-cheat-sheets/
▶ https://lab.abhinayrathore.com/aria-cheatsheet/
549/697
Sass
Sass
Luciano Diamand
550/697
Sass
Introducción
551/697
¿Que es Sass?
552/697
¿Que es Sass?
▶ De las pruebas que hicimos con CSS, puede que nos hemos dado cuenta de
algunos aspectos:
▶ Existen propiedades a las que asignamos una serie de valores en muchas reglas
distintas. Generalmente, atribuimos los mismos colores, fuentes, etc. a diversos
elementos
▶ Hay casos donde existen muchas reglas asignadas a sucesivos componentes hijos o
descendientes, con selectores repetitivos
▶ Sin tener demasiados estilos, podemos terminar ocupando gran cantidad de lineas
▶ Para mejorar las prestaciones de CSS, surgen los denominados preprocesadores
CSS, entre los que destacan LESS o SASS
553/697
¿Que es Sass?
Existen dos variantes sintacticas de SASS, con archivos .sass y .scss; nosotros nos
quedaremos con la segunda opcion En cualquiera de los casos, aportan las mismas
funcionalidades, pero algunas de las caracteristicas destacables de la variante SCSS son
las siguientes:
▶ Legibilidad (dada su similaridad con CSS)
▶ Suavidad de curva de aprendizaje (anadiendo pequenos detalles a CSS)
▶ Compatibilidad (un archivo CSS es un archivo valido para SCSS)
▶ Variedad de recursos disponibles, y extensibilidad (facil pasar de .scss a .sass)
554/697
¿Que es Sass?
Las principales funcionalidades que nos aporta cualquiera de estas variantes de SASS
son las siguientes:
▶ Variables: asignamos un valor a una variable, que se puede utilizar en muchas
reglas (evita repetir valores)
▶ Anidamiento de reglas, agrupando reglas dentro de otras, segun la estructura
jerarquica dada (evita repetir selectores)
▶ Mixins: funciones con las que generar reglas dependientes de parametros,
facilitando la reutilizacion de reglas
▶ Extensiones: para poder heredar propiedades y extenderlas, reutilizando en este
caso asignaciones de propiedades
▶ Operadores aritmeticos para trabajar con multiplos o divisores de ciertos valores,
entre otros
▶ Comentarios de una linea, formando parte del archivo a preprocesar pero no del
CSS final generado
555/697
¿Que es Sass?
556/697
Sass
Variables
557/697
Variables
body {
color: $primary-color;
background: $secondary-color;
}
558/697
Variables cont.
559/697
Guiones & guiones bajos
body {
color: $primary-color;
background: $secondary-color;
}
560/697
Anidamiento
▶ Las variables también se pueden establecer dentro de un selector
▶ Por ejemplo:
header {
$header-color: orange;
color: $header-color;
}
▶ Sin embargo, tales variables solo están disponibles dentro del nivel de selectores
anidados donde están definidas
▶ Si se definen fuera de los selectores anidados, estáran disponibles en todas partes
▶ Por lo tanto, lo siguiente no funcionará:
header {
$header-color: orange;
color: $header-color;
}
article {
color: $header-color;
}
▶ Si intentamos compilar el código, recibiremos un error similar a esto:
Error: Undefined variable: "$header-color"
561/697
La bandera !global
562/697
Valores de variables
▶ Una variable puede contener cualquier valor CSS que queramos
▶ Podríamos crear una variable para contener familias de fuentes, peso de la fuente,
anchos de borde, imágenes de fondo, etc.
▶ Aquí tenemos un ejemplo de algunas variables más agregadas al archivo Sass
$primary-color: orange;
$secondary-color: gold;
$font-stack: 'Open Sans', Helvetica, Sans-Serif;
$border-thick: 10px;
$border-bright: orange;
$border-style: solid;
$article-width: 60%;
$article-padding: 20px;
$article-margin: auto;
body {
color: $primary-color;
background: $secondary-color;
font-family: $font-stack;
}
article {
border: $border-thick $border-style $border-bright;
width: $article-width;
padding: $article-padding;
margin: $article-margin;
}
563/697
Valores de variables cont.
article {
border: 10px solid orange;
width: 60%;
padding: 20px;
margin: auto;
}
564/697
Valores por defecto
body {
color: $primary-color;
}
▶ En este caso particular, el CSS compilado será el siguiente:
body {
color: orange;
}
565/697
Valores por defecto cont.
body {
color: $primary-color;
}
▶ El CSS compilado se verá así:
body {
color: gold;
}
566/697
Sass
Mixins
567/697
Introducción
▶ En los últimos años, HTML ha dado grandes pasos para volverse más semántico
▶ Las etiquetas refuerzan el significado del contenido en lugar de su diseño
▶ Desafortunadamente, no ocurre lo mismo con CSS
▶ Definir clases como .float-left, .row y .col es mejor que volver a definir las
propiedades flotantes para cada etiqueta HTML
▶ Hay frameworks CSS que intentan abordar el problema (la interfaz de usuario
semántica es un ejemplo popular; lo encontrará en semantic-ui.com)
▶ Sass proporciona otra forma, a través de la directiva @mixin
▶ La sintaxis es la siguiente:
@mixin <name>
{
<contents>
}
568/697
Introducción cont.
▶ Una vez que hayamos creado el mixin, simplemente usamos @include desde
donde queramos incluir las reglas
▶ Sintaxis:
<selector>
{
@include <mixin-name>
[<otras reglas>]
569/697
Introducción cont.
.call-out {
@include float-left;
background-color: gray;
}
▶ El CSS resultante será:
.call-out {
float: left;
background-color: gray;
}
570/697
Introducción cont.
▶ El mixin del ejemplo anterior se define en el mismo archivo donde se usa, pero
puede (y generalmente lo hará) definir mixins en un archivo aparte
▶ Simplemente agregue @import del archivo antes de usar la directiva @include
▶ Un mixin de Sass no se limita a definir reglas de propiedad; también puede incluir
selectores, incluidos los selectores principales
▶ Usando esta técnica podría definir todas las reglas para un enlace similar a un
botón en un solo mixin
571/697
Introducción cont.
@mixin a-button {
a {
background-color: blue;
color: white;
radius: 3px;
margin: 2px;
&:hover {
color: red;
}
&:visited {
color: green;
}
}
}
572/697
Introducción cont.
▶ Use la directiva @include para incluir este mixin en un estilo, como se muestra a
continuación:
@import 'a-button'; // asumiendo que a-button.scss es el nombre del archivo del mixin
.menu-button {
@include a-button;
}
▶ y la salida seria:
.menu-button a {
background-color: blue;
color: white;
radius: 3px;
margin: 2px;
}
.menu-button a:hover {
color: red;
}
.menu-button a:visited {
color: green;
}
573/697
Variables Mixin
▶ Si tiene más de una clase que incluye esta funcionalidad, está claro que el ejemplo
anterior ahorrará mucho tipeo y será más fácil de mantener
▶ Pero, ¿qué sucede si tiene varias clases que tienen la misma funcionalidad básica,
pero necesita pasar diferentes colores? Sass lo hace fácil: simplemente pase los
colores como variables, que se definen como parámetros de función
574/697
Variables Mixin
&:hover {
color: $hover;
}
&:visited {
color: $link;
}
}
}
575/697
Variables Mixin
576/697
Variables Mixin
▶ Ese ejemplo daría como resultado el siguiente CSS:
.menu-button a {
background-color: blue;
color: white;
radius: 3px;
margin: 2px;
}
.menu-button a:hover {
color: red;
}
.menu-button a:visited {
color: green;
}
.text-button a {
background-color: yellow;
color: white;
radius: 3px;
margin: 2px;
}
.text-button a:hover {
color: black;
}
.text-button a:visited { 577/697
Variables Mixin
&:hover {
color: $hover;
}
&:visited {
color: $link;
}
}
}
578/697
Variables Mixin cont.
579/697
Variables Mixin
580/697
Variables Mixin
▶ Al igual que cuando llama a una función de Sass, solo necesita proporcionar el
nombre del parámetro si no está incluyendo los argumentos fuera de orden o
omitiendo algunos
▶ Esto funcionaría bien (aunque el botón resultante sería bastante feo):
.menu-button {
@include a-button(darkmagenta, darkolivegreen, skyblue);
}
581/697
Variables Variables
▶ Algunas propiedades CSS pueden tomar diferentes números de variables
▶ Un ejemplo es la propiedad margin, que puede tomar de 1 a 4 valores
▶ Sass admite esto usando argumentos variables, que se declaran con puntos
suspensivos después de sus nombres:
@mixin margin-mix($margin...) {
margin: $margin;
}
▶ Dada esta definición de mixin, cualquiera de las siguientes directivas @include se
transpilará sin errores:
.narrow-border {
@include margin-mix(1px);
}
.top-bottom-border {
@include margin-mix(3px 2px);
}
.varied-border {
@include margin-mix(1px 3px 6px 10px);
}
582/697
Pasar contenido a mixins
▶ En la mayoría de los casos, usará mixins para fragmentos estándar de estilo que
usará en varios lugares y se expandirá con reglas adicionales cuando las incluya
▶ Podemos crear mixins que funcionen al revés pasando un bloque de reglas al mixin
▶ No necesita una variable para hacer esto; el contenido que pase estará disponible
para el mixin a través de la directiva @content:
@mixin has-content {
html {
@content;
}
}
@include has-content {
#logo {
background-image: url(logo.svg);
}
}
▶ Esto dará como resultado la siguiente salida CSS:
html #logo {
background-image: url(logo.svg);
}
583/697
Pasar contenido a mixins
▶ Observe que la sintaxis aquí usa llaves, no paréntesis, para distinguir el contenido
de cualquier variable que el mixin pueda declarar
▶ Podemos usar ambos;
@mixin test-content($color) {
.test {
color: $color;
@content;
}
}
@include test-content(blue) {
background-color: red;
}
▶ lo que dará como resultado el siguiente CSS:
.test {
color: blue;
background-color: red;
}
584/697
Laboratorio práctico - Sass Labs
585/697
Frameworks de UI
Frameworks de UI
Luciano Diamand
586/697
Frameworks de UI
Frameworks
587/697
Angular
588/697
Ventajas
589/697
Desventajas
590/697
React
591/697
Ventajas
592/697
Desventajas
593/697
Vue
594/697
Ventajas
595/697
Deventajas
596/697
Frameworks de UI
597/697
Architectura
598/697
Architectura cont.
▶ React.js, por otro lado, es una biblioteca que solo ofrece la vista, dejando que el
desarrollador decida cómo construir el modelo y el controlador. Se proporcionan
las siguientes características:
▶ Como complemento de JavaScript, se utiliza el lenguaje JSX, que es similar a XML,
en lugar de plantillas;
▶ Sin introducción de dependencias;
▶ Solicitudes de Ajax;
599/697
Architectura cont.
▶ Vue.js es una biblioteca que le permite crear interfaces web interactivas. Vue.js se
ocupa principalmente de la capa ViewModel de la arquitectura MVVM. Utiliza
enlaces de datos bidireccionales para adjuntar la vista y el modelo. Las directivas
y los filtros abstraen las operaciones DOM reales y el formato de salida.
600/697
Enlace de datos
601/697
Soluciones móviles
▶ Cada uno de los tres marcos de desarrollo web comparados ofrece soluciones
móviles para el desarrollo de aplicaciones.
▶ Cuando se trata de Angular, este es el marco Ionic, que utiliza el contenedor
Cordova de Angular. Usted descarga la aplicación, que es una aplicación web que
se ejecuta dentro de un navegador web.
▶ React.js no tiene un marco similar. React Native es una plataforma para crear
aplicaciones móviles nativas reales.
▶ Vue ha anunciado su apoyo al proyecto Weex de Alibaba Group, que es un marco
de interfaz de usuario multiplataforma. Weex le permite desarrollar componentes
de navegador, así como aplicaciones de iOS y Android utilizando la misma sintaxis
de Vue.
602/697
Facilidad de aprendizaje
▶ Angular está escrito en TypeScript, lo que significa que necesita algo de tiempo
para aprender a trabajar con este marco.
▶ React usa JSX y los desarrolladores nativos de Javascript están familiarizados con
él. El período de entrenamiento es más fácil y no requiere tanta preparación.
▶ Vue.js utiliza una sintaxis de plantilla basada en HTML que le permite vincular el
DOM mostrado a los datos de la instancia del elemento base de forma declarativa.
Todas las plantillas de Vue.js son HTML válido que pueden leer los analizadores
de HTML y los navegadores que siguen el estándar.
604/697
Integración
605/697
Performance
▶ Para capturar todos los cambios en el DOM, Angular.js crea un observador para
cada enlace. Cada vez que se actualiza la vista, los nuevos valores se comparan
con los antiguos. Esto puede terminar en un rendimiento más bajo en aplicaciones
móviles grandes.
▶ Debido a que React usa un DOM virtual, cuando se modifica la vista, el nuevo
DOM lo compara con el DOM virtual y cambia en consecuencia.
▶ Vue.js tiene un mejor rendimiento gracias al DOM virtual, que es útil para
programas complicados. Puede ser tan pequeño como 20 KB mientras mantiene
su velocidad y versatilidad, lo que le permite lograr un rendimiento
considerablemente mejor que los marcos de la competencia.
606/697
Ecosistema
607/697
¿Cuál es mejor?
▶ Angular.js ofrece una estructura muy clara y muchas características. Permite que
los equipos de desarrollo pasen rápidamente a la implementación sin necesidad de
definir estructuras o buscar bibliotecas adicionales. Sin embargo, a menudo está
demasiado sobrecargado para proyectos pequeños y trae un lastre innecesario.
▶ React se recomienda para proyectos con resultados de front-end pesados. Dado
que no existen estructuras claras, la estrecha cooperación entre el equipo de
desarrollo es vital. React tiene un soporte de renderizado del lado del servidor más
sólido, lo que hace que la biblioteca sea más compatible con SEO.
▶ Vue se puede utilizar para una amplia gama de aplicaciones. Puede brindar una
gran solución para prácticamente todos los tipos de proyectos debido a su
interoperabilidad con otros marcos de JavaScript y su capacidad para agregar una
lógica más complicada a los programas actuales.
608/697
¿Como escoger?
▶ Angular es una caja de herramientas completa que le ofrece todo, desde desarrollo
hasta pruebas, mientras crea una aplicación web. React es una biblioteca versátil
que se basa en la ayuda de otras bibliotecas para desarrollarse. Vue.js es un marco
revolucionario para crear interfaces de usuario y aplicaciones de una sola página,
así como una curva de aprendizaje rápida.
609/697
¿Como escoger? cont.
610/697
¿Como escoger? cont.
611/697
¿Como escoger? cont.
612/697
Resumen
▶ No hay documentación definitiva y actualizada para React. Es de código abierto y
aparecen nuevas bibliotecas casi todos los días. Para los desarrolladores
experimentados, esta es una gran ventaja, pero puede resultar confuso para los
principiantes.
▶ Es más fácil encontrar la información que necesita usando Angular. El producto
viene con documentación detallada y pautas adicionales. Siempre puede consultar
con los miembros de la comunidad en cualquier plataforma popular si todavía
tiene alguna pregunta.
▶ Vue.js ofrece una de las mejores documentaciones. Su arquitectura basada en
componentes fue influenciada en gran medida por ReactJS. Dado que Vue es un
marco modernizado, ofrece soluciones adoptadas para el desarrollo, pero su
novedad se refleja en la falta de comunidad y otros límites.
▶ Al elegir Vue vs React vs Angular, concéntrese en el tipo de proyecto. Todos los
enfoques tienen sus pros y sus contras, ambos evolucionan y mejoran
continuamente.
613/697
Informacion adicional
▶ https://incora.software/insights/why-to-choose-angular-for-your-
development/16
▶ https://incora.software/insights/why-should-you-use-react/15
614/697
React
React
Luciano Diamand
615/697
React
Introducción
616/697
Introducción
▶ React es una biblioteca pequeña que no viene por defecto con todo lo que
podríamos necesitar para construir una aplicación
▶ En React, escribimos código simialr a HTML directamente en el código JavaScript
▶ Un efecto secundario de trabajar con React es que promueve el uso de patrones
que son legibles, reutilizables y comprobables
617/697
Introducción cont.
▶ En enero de 2015, Netflix anunció que estaban usando React para impulsar el
desarrollo de su interfaz de usuario
▶ Más tarde ese mes, se lanzó React Native, una biblioteca para crear aplicaciones
móviles usando React
▶ Facebook también lanzó ReactVR, otra herramienta que llevó a React a una gama
más amplia de objetivos de representación
▶ En 2015 y 2016, apareció una gran cantidad de herramientas populares como
React Router y Redux para manejar tareas como el enrutamiento y la
administración de estado
▶ Después de todo, React fue catalogado como una biblioteca: preocupada por
implementar un conjunto específico de funciones, no por proporcionar una
herramienta para cada caso de uso
618/697
Introducción cont.
▶ React Fiber en 2017. Fiber fue una reescritura del algoritmo de renderizado de
React. Se reescribieron todas de las partes internas de React sin modificar la API
pública
▶ Más recientemente, en 2019, vimos el lanzamiento de Hooks, una nueva forma de
agregar y compartir lógica con estado entre componentes
▶ Blog oficial de React (https://facebook.github.io/react/blog)
619/697
React
620/697
Hola Mundo
621/697
Hola Mundo cont.
▶ El ejemplo de Hello world con React utilizando CDN es tan simple como:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Hello world</title>
<!-- Script tags including React -->
<script crossorigin src="https://unpkg.com/react@18/umd/react.production.min.js">
</script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js">
</script>
<script src="https://npmcdn.com/[email protected]/browser.min.js">
</script>
</head>
<body>
<div id="app"></div>
<script type="text/babel">
ReactDOM.render(<h1>Hello world</h1>, document.querySelector('#app'));
</script>
</body>
</html>
622/697
Hola Mundo cont.
ReactDOM.render(viewTree, where);
623/697
Hola Mundo cont.
624/697
Hola Mundo cont.
render() {
let label = React.createElement('label', null,'Name: ');
let input = React.createElement('input', {
type: 'text', value: this.state.yourName,
onChange: (event) => this.handleChange(event) });
let h1 = React.createElement('h1', null, 'Hello ',
this.state.yourName, '!');
return React.createElement('div', null, label, input, h1);
}
625/697
Hola Mundo cont.
render() {
return React.createElement('div', null,
React.createElement('label', null,'Name: '),
React.createElement('input',
{ type: 'text', value: this.state.yourName,
onChange: (event) => this.handleChange(event) }),
React.createElement('h1', null,
'Hello ', this.state.yourName, '!')
);
}
626/697
Virtual DOM
627/697
React
628/697
Plugins del navegador
629/697
Plugins del navegador cont.
▶ Una vez instalado, podrá ver qué sitios están usando React
▶ Cada vez que el icono de React se ilumine en la barra de herramientas del
navegador, sabrá que el sitio tiene React en la página
▶ Luego, cuando abra las herramientas para desarrolladores, habrá una nueva
pestaña visible llamada React
▶ Al hacer clic en dicha opción, se mostrarán todos los componentes que componen
la página que está viendo actualmente
630/697
React
Introducción a JSX
631/697
JSX
632/697
Diferencias en cuanto al HTML clásico
633/697
Renderizando variables en JSX
634/697
Renderizando variables en JSX cont.
635/697
Ataques de inyección
636/697
Material adicional
637/697
React
Renderizando elementos
638/697
Renderizando elementos
▶ Ahora que hemos visto como funciona JSX es hora de mancharnos las manos y
renderizar nuestros propios componentes
▶ Para ello nos vamos a ayudar con bibiloteca create-react-app que deberíamos
tener instalada
▶ create-react-app nos ayuda a iniciar un proyecto en React dándonos un
pequeño boilerplate y configurandonos nuestro proyecto para que, en principio, no
tengamos que preocuparnos de configuraciones
▶ Para iniciar un proyecto con create-react-app es tan fácil como seguir los
siguientes pasos:
create-react-app render-components
cd render-components
npm start
639/697
Renderizando elementos cont.
640/697
Renderizando elementos cont.
641/697
React
Componentes y propiedades
642/697
Componentes y Propiedades
643/697
Componente funcionales
644/697
Componentes de clase
645/697
Restricciones
646/697
React
Estado
647/697
Estado
return (
<>
<div>{count}</div>
<button onClick={increment}>Increment</button>
</>
);
};
▶ Para actualizar la interfaz la única manera que hay es a través del state
▶ Para poder utilizar el estado de un componente tenemos dos opciones
dependiendo de si hablamos de componentes funcionales o componentes de clase
648/697
Componentes funcionales
▶ Importamos useState un hook que viene de React (esto lo veremos más adelante)
▶ useState devuelve un arreglo donde el primer elemento es el valor mutable
▶ El segundo elemento del arreglo es el método que actualiza el primero
▶ Así quedaría el componente anterior actualizado:
import React, { useState } from "react";
return (
<>
<div>{count}</div>
<button onClick={increment}>Increment</button>
</>
);
};
649/697
Componentes de clase
▶ Para pasar cualquier componente funcional a uno de clase solo hay que seguir los
siguientes pasos:
1. Crear una clase ES6 con el mismo nombre que herede de React.Component
2. Agregar un único método vacío llamado render()
3. Mover el cuerpo de la función al método render()
4. Reemplazar props con this.props en el cuerpo de render()
5. Borrar el resto de la declaración de la función ya vacía
▶ Quedaría de la siguiente manera:
class Counter extends React.Component {
render() {
return (
<>
<div>{count}</div>
<button onClick={increment}>Increment</button>
</>
);
}
}
650/697
Componentes de clase cont.
651/697
Componentes de clase cont.
render() {
return (
<>
<div>{this.state.count}</div>
</>
);
}
}
652/697
Componentes de clase cont.
▶ El estado NUNCA se debe modificar usando this.state.count = 2
▶ Existe una función llamada this.setState que podemos pasarle un objeto que
utilizará para modificar el estado
▶ Quedaría algo asi:
class Counter extends React.Component {
cousntructor(props) {
this.state = {
count: 0
};
}
increment() {
this.setState({ count: this.state.count + 1 });
}
render() {
return (
<>
<div>{this.state.count}</div>
<button onClick={() => this.increment()}>Increment</button>
</>
653/697
Las actualizaciones del estado pueden ser asíncronas
654/697
Las actualizaciones de estado se fusionan
▶ Cuando invocamos a setState(), React combina el objeto que proporcionaste
con el estado actual
▶ Por ejemplo, tu estado puede contener varias variables independientes:
state = {
posts: [],
comments: []
};
▶ Luego puedemos actualizarlas independientemente con invocaciones separadas de
setState():
fetchPosts().then(response => {
this.setState({
posts: response.posts
});
});
fetchComments().then(response => {
this.setState({
comments: response.comments
});
});
655/697
React
Renderizado condicional
656/697
Renderizado condicional
657/697
Renderizado condicional
function GuestGreeting(props) {
return <h1>Please sign up.</h1>;
}
▶ Vamos a crear un componente Greeting que muestra cualquiera de estos
componentes dependiendo de si el usuario ha iniciado sesión:
function Greeting(props) {
const isLoggedIn = props.isLoggedIn;
if (isLoggedIn) {
return <UserGreeting />;
}
return <GuestGreeting />;
}
<Greeting isLoggedIn={false} />,
658/697
If en una línea con operador lógico &&
659/697
If-Else en una línea con operador condicional
660/697
Evitar que el componente se renderice
661/697
React
Hooks
662/697
Introducción
663/697
useState()
render() {
return (
<div>
<p>You clicked {this.state.count} times</p>
<button onClick={() => this.setState({ count: this.state.count + 1 })}>
Click me
</button>
</div>
);
}
}
664/697
useState() cont.
function Example() {
// Declaración de una variable de estado que llamaremos "count"
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
665/697
Declarando múltiples variables de estado
666/697
useEffect()
▶ El Hook useEffect, agrega la capacidad de realizar efectos secundarios desde un
componente funcional
▶ Tiene el mismo propósito que componentDidMount, componentDidUpdate y
componentWillUnmount en componentes de clases de React, pero unificadas en
una sola API
▶ Con clases:
class Example extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
componentDidMount() {
console.log(`You clicked ${this.state.count} times`);
}
componentDidUpdate() {
console.log(`You clicked ${this.state.count} times`);
} 667/697
Declarando múltiples variables de estado cont.
▶ Con hooks:
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
useEffect(() => {
console.log(`You clicked ${count} times`);
});
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
668/697
¿Qué hace useEffect?
▶ Al usar este Hook, le estamos indicando a React que el componente tiene que
hacer algo después de renderizarse
▶ React recordará la función que le pasamos (nos referiremos a ella como el
”efecto”), y se invocará más tarde después de actualizar el DOM
▶ En este efecto, actualizamos mostramos por consola una leyenda, pero también
podríamos hacer peticiones de datos o invocar alguna API externa
669/697
¿Por qué se llama a useEffect dentro del componente?
670/697
¿Se ejecuta useEffect después de cada renderizado?
▶ ¡Sí! Por defecto se ejecuta después del primer renderizado y después de cada
actualización
▶ En vez de pensar en términos de ”montar” y ”actualizar”, puede resultar más fácil
pensar en los efectos que ocurren ”después del renderizado”
▶ React se asegura de que el DOM se ha actualizado antes de llevar a cabo el efecto
671/697
Como conseguir el mismo funcionamiento que los ciclos de vida
▶ componentDidMount()
class Example extends React.Component {
componentDidMount() {
console.log('I am mounted!');
}
render() {
return null;
}
}
function Example() {
useEffect(() => console.log('mounted'), []);
return null;
}
672/697
Como conseguir el mismo funcionamiento que los ciclos de vida
▶ componentDidUpdate()
componentDidUpdate() {
console.log('mounted or updated');
}
useEffect(() => console.log('mounted or updated'));
673/697
Como conseguir el mismo funcionamiento que los ciclos de vida
▶ componentWillUnmount()
componentWillUnmount() {
console.log('will unmount');
}
useEffect(() => {
return () => {
console.log('will unmount');
}
}, []);
674/697
Construyendo Hooks personalizados
useEffect(() => {
getData(url);
}, []);
return data;
}
675/697
Construyendo Hooks personalizados
return (
<>
<RedditPosts data={data} />
</>
);
}
676/697
React
Context
677/697
Introduccion
▶ Context provee una forma de pasar datos a través del árbol de componentes sin
tener que pasar props manualmente en cada nivel
▶ En una aplicación típica de React, los datos se pasan de arriba hacia abajo (de
padre a hijo) a través de props, pero esto puede ser complicado para ciertos tipos
de props (por ejemplo, localización del tema de la interfaz gráfica) que son
necesarios para muchos componentes dentro de una aplicación
▶ Context proporciona una forma de compartir valores entre componentes sin tener
que pasar explícitamente un prop a través de cada nivel del árbol
678/697
Cuándo usar Context
▶ Context está diseñado para compartir datos que pueden considerarse globales
para un árbol de componentes en React, como el usuario autenticado
actualmente, el tema o el idioma preferido
▶ Por ejemplo, en el código a continuación, pasamos manualmente un prop de
tema para darle estilo al componente Button:
679/697
Cuándo usar Context cont.
function Toolbar(props) {
// El componente Toolbar debe tener un prop adicional "theme"
// y pasarlo a ThemedButton. Esto puede llegar a ser trabajoso
// si cada botón en la aplicación necesita saber el tema,
// porque tendría que pasar a través de todos los componentes
return (
<div>
<ThemedButton theme={props.theme} />
</div>
);
}
680/697
Cuándo usar Context cont.
681/697
Cuándo usar Context cont.
682/697
API
▶ React.createContext
const MyContext = React.createContext(defaultValue);
▶ Crea un objeto Context
▶ Cuando React renderiza un componente que se suscribe a este objeto Context,
este leerá el valor de contexto actual del Provider más cercano en el árbol
▶ El argumento defaultValue es usado únicamente cuando un componente no
tiene un Provider superior a él en el árbol
▶ Esto puede ser útil para probar componentes de forma aislada sin contenerlos
▶ Nota: pasar undefined como valor al Provider no hace que los componentes
que lo consumen utilicen defaultValue
683/697
API cont.
▶ Context.Provider
<MyContext.Provider value={/* algún valor */}>
▶ Cada objeto Context viene con un componente Providers de React que permite
que los componentes que lo consumen se suscriban a los cambios del contexto
▶ Acepta un valor que se pasará a los componentes consumidores que son
descendientes de este Provider
▶ Un Provider puede estar conectado a muchos consumidores
▶ Los Providers pueden estar anidados para sobreescribir los valores más
profundos dentro del árbol
▶ Todos los consumidores que son descendientes de un Provider se vuelven a
renderizar cada vez que cambia el valor del Provider
▶ La propagación del Provider a sus consumidores descendientes no está sujeta al
método shouldComponentUpdate, por lo que el consumidor se actualiza incluso
cuando un componente padre evita la actualización
684/697
Actualizando Context desde un componente anidado
685/697
Actualizando Context desde un componente anidado cont.
▶ theme-toggler-button.js
import {ThemeContext} from './theme-context';
function ThemeTogglerButton() {
// El botón toggleTheme no solo recibe el tema, sino
// también una función de alternancia de tema del contexto
return (
<ThemeContext.Consumer>
{({theme, toggleTheme}) => (
<button
onClick={toggleTheme}
style={{backgroundColor: theme.background}}>
Toggle Theme
</button>
)}
</ThemeContext.Consumer>
);
}
686/697
Actualizando Context desde un componente anidado cont.
this.toggleTheme = () => {
this.setState(state => ({
theme:
state.theme === themes.dark
? themes.light
: themes.dark,
}));
};
687/697
Actualizando Context desde un componente anidado cont.
render() {
// Todo el estado se pasa al proveedor
return (
<ThemeContext.Provider value={this.state}>
<Content />
</ThemeContext.Provider>
);
}
}
function Content() {
return (
<div>
<ThemeTogglerButton />
</div>
);
}
688/697
Accediento con Hooks
689/697
React
Styled-components
690/697
Instalación
691/697
Ejemplos básicos
692/697
Adaptando el estilo según las props
font-size: 1em;
margin: 1em;
padding: 0.25em 1em;
border: 2px solid red;
border-radius: 3px;
`;
693/697
Extendiendo estilos
694/697
Animaciones
695/697
Últimas diapositivas
Últimas diapositivas
Luciano Diamand
696/697
Última diapositiva
Gracias!
Y que el Código Fuente te acompañe
697/697