Escolar Documentos
Profissional Documentos
Cultura Documentos
DIRECCIÓN DE POSGRADO
Cochabamba – Bolivia
2019
Agradecimientos
¡Muchas gracias!
2
Tabla de Contenido
Introducción ............................................................................................................. 8
1 Generalidades ................................................................................................ 10
2 Metodología .................................................................................................... 12
3.3 Stores...................................................................................................... 16
4.1.1 Componentes................................................................................... 19
3
5.4.1 Acciones .......................................................................................... 27
5.4.3 Reducers.......................................................................................... 29
8 Conclusiones .................................................................................................. 40
4
Tabla de Figuras
5
Resumen
Hoy en día es habitual encontrar proyectos desarrollados del lado del usuario final
resaltando la importancia de mejorar el estilo, la animación y la facilidad con la que
una persona puede entender y manejar un sistema o aplicación web a medida que
se manejan, se persisten y transforman los datos con los cuales el usuario maneja
el sistema es importante definir la forma más limpia y rápida posible en que el
sistema puede manejarlos.
Con tal propósito definido, la tecnología actual brinda a los desarrolladores más
opciones a la hora de desarrollar aplicaciones más amigables manejables y rápidas,
además de tener la capacidad de manejar un gran volumen de datos de forma
coherente y fluida, este es el mundo del desarrollo frontend y trabaja con tecnologías
tales como Ember.js, angular.js, angular.ts, react y muchos otros más.
6
Flux es una arquitectura creada por Facebook, implementado para la manipulación
unidireccional de los datos, de esta forma se manejan los datos de una forma más
limpia, fácil y ordenada.
(Boduch, 2016)
7
Introducción
En la tecnología actual frameworks de trabajo con .js hay muchos, cada uno se
enfoca en hacer las cosas mejor y más fáciles que el anterior, algunos se encargan
de reparar fallos de otros, otros se centran en mejorar su núcleo o su concepto
general de desarrollo, un ejemplo de estos frameworks muy usados son ember y
angular, en sus dos versiones javascript y typescript, pero en este punto se creó un
nuevo framework React, con esta nueva herramienta han decidió romper con
algunas de las buenas practicas que se habían considerado en los últimos años en
el lado de ejecución del cliente, junto a la idea y características de la programación
funcional se formó un nuevo framework especial, que está influenciando a muchos
otros nuevos que están por venir.
React se encarga del trabajo solo en la vista de nuestra app, una vez que React
hace su trabajo para manejar, renderizar y mostrar vistas es que iniciamos con la
ayuda de una herramienta más, o de un conjunto de patrones, el patrón FLUX, como
ya se mencionó FLUX es una arquitectura o conjunto de patrones y no es un
framework, es así que dependiendo de la herramienta que se use algunos
frameworks implementan FLUX de distintas maneras. Flux se compone de tres
grandes partes, Dispatchers, Stores y Views.
8
Redux, el complemento de React para manejar Flux, es un contenedor de estados,
por estados nos referiremos a los datos que se están manipulando en el momento
en la vista y la lógica con React, esta herramienta hace más fácil manejar los
estados cambiarlos y mutarlos. (Abramov, 2015)
9
1 Generalidades
Tecnologías frontend son todas aquellas tecnologías que corren del lado del usuario
final, o sea en su navegador web, son un conjunto en su mayoría de tres lenguajes
de programación, javascript, Html y css, un desarrollador frontend en su trabajo se
dedica principalmente al uso de estas tecnologías, también debe conocer un poco
del manejo de tecnologías backend para poder consumir y entender el uso de
servicios remotos con los cuales interactuara para la manipulación de datos.
10
información como XML y JSON, y Ajax para hacer solicitudes sin necesidad de
refrescar la página, en pocas palabras, el FrontEnd, es el que se encargará de dejar
bonita la página, en ver que los datos se muestren de manera cómoda para el
usuario, de que la interacción que realice sea llamativa y en la estética del sitio.
Redux fue creada por Dan Abramov en 2015. A medida que la tecnología avanza
las aplicaciones tienen más capacidades y podemos implementar más y mejores
funcionalidades. Pero esto provoca que la complejidad de nuestros proyectos se
dispare. Una de las razones por las que aumenta la dificultad del mantenimiento es
el manejo del estado, tanto del modelo (información de terceros, datos creados
localmente, etc.) como de la interfaz (paginación, listas, elementos seleccionados,
etc.
Redux, se basa fuertemente en otros principios que comparten los lenguajes del
paradigma funcional. En concreto:
11
crecido tanto que era imposible seguir manteniéndolas con el patrón Modelo Vista
Controlador incluso con frameworks para facilitarlo. La comunicación bidireccional
de la arquitectura dificultaba la depuración y rastreo de errores.
2 Metodología
12
3 Entendiendo la Arquitectura Flux y su estructura
Flux es un conjunto de patrones que juntos definen una arquitectura que nos ayuda
en el manejo de lo que se conoce como estado o state de los datos en la vista,
también está compuesto por 3 grandes partes Dispatchers, Stores y Actions.
13
Figura 3 Actions en el work flow de componentes Flux
3.1 Actions
Flux define su flujo de trabajo en tres principios que se orientara a las capas que
trabajaran con su respectiva funcionalidad desde la capa que interactúa con el
usuario final hasta la capa que maneja los datos, la primera capa que definiremos
será la capa de Acciones o Actions.
Las acciones son los verbos del sistema, es por eso que el nombre de las acciones
generalmente derivan de la funcionalidad que queremos que haga, por ejemplo:
• Recuperar sesión
Esta capa de la arquitectura Flux, las acciones son el punto de inicio, entonces más
propiamente dicho los Actions son nombres de funcionalidades que queremos que
manejen los payloads u objetos de datos en el frontend, como punto de entrada de
nuestra arquitectura los Actions no deben procesar directamente los payloads sino
que solamente son la puerta de entrada de estos a la funcionalidad que queremos
que las maneje. (Boduch, 2016)
14
Figura 4 Representación de Acciones como puertas de entrada
3.2 Dispatcher
15
Fuente: Libro Arquitectura Flux (Boduch, 2016)
3.3 Stores
Los store son lo más parecido al modelo de la aplicación, guarda los datos/estados
de la app y, en Flux puede existir desde un solo Store hasta varios, básicamente los
datos que envían los servicios a la aplicación son almacenados en estos Stores,
entonces completando el ciclo de o flujo de Flux los Actions son el mecanismo de
envío de los datos, estos datos implican que se el Distpacher lo enviara a su Store
correspondiente, sin que esto signifique cambiar el store sino actualizar a un nuevo
estado.
Entonces no existe una forma lógica de cambiar los estados, sino que el que decide
si se cambia a un nuevo estado es el store, esto también implica que si necesitamos
ver o consultar alguna información con su estado actual debemos preguntar a los
Store. (Boduch, 2016)
Es la última capa, técnicamente no es parte Flux, pero la capa de vista es una parte
importante en la aplicación, básicamente la capa de vista es la responsable
de interactuar, mostrar y recibir datos con los usuarios, por ejemplo,
comparando la estructura de capas de Flux con el patrón MVC básicamente
las vistas se encarga de mostrar los modelos.
16
Figura 7 Comparación de vistas entre el patrón Flux y MVC
React js junto con Redux son librerías que facilitan el manejo de las vistas que
permiten manejar eventos, estilos crear interfaces de usuarios agradables para el
usuario, además de facilitar para el desarrollador el escribir código e implementar
funcionalidad, se maneja de forma similar a cualquier proyecto o framework
estructurado bajo el principio de javascript, en cualquier versión ES5 o ES6, este
framework ayudara a crear la UI y la implementación de Flux. (Porcello, 2017)
17
Figura 8 Logo React
18
Flux es una declaración de intenciones (Actions), en cambio Redux es una
implementación del patrón Flux, encapsulado en una librería para poder entenderlo
y usarlo, además de poder ser importado en cualquier tipo de ambiente de desarrollo
o framework, el flujo de Redux evoluciona solo un poco más pero mantiene la
esencia de Flux, o sea el flujo unidireccional de datos y propagar los cambios por
medio de acciones.
4.1.1 Componentes
4.1.2 El DOM
DOM o Document Object Model es una estructura (en la memoria) que define todas
las etiquetas de una página HTML para posteriormente ser renderizado en el
navegador. (Caules, 2019)
19
Figura 11Arbol de elementos Html
Al trabajar con componentes se ven que cada uno de ellos está compuesto por un
conjunto de etiquetas html o nodos DOM que se relacionan formando la página
HTML. (Caules, 2019)
Los componentes que manejan los datos del estado solo leen los datos, no los
manipulan. En el caso que ocurra una manipulación permanece sólo en ese
componente y no se transfiere al resto de la aplicación. (Abramov, 2015)
20
Para poder alterar el estado de la aplicación se usarán acciones. Las acciones
(actions) representan la única vía de producirse una modificación en el estado global
de la aplicación.
El estado en cada componente solo deber ser de lectura y si tiene algún cambio
solo se reflejara en el actual componente, pero es obvio pensar que la app
necesitara cambiar e interactuar con este cambio de estado en cada componente,
entonces para poder reflejar estos cambios de estados para los distintos
componentes se deben usar los Actions que se encargan de reflejar los cambios de
estado. (Abramov, 2015)
Para que una función se considere pura debe cumplir ciertas condiciones. (Fogus,
2013)
En Redux las funciones puras se conocerán como “Reducers”, los reducers siempre
reciben 2 parámetros una acción y un estado anterior, contendrá la lógica para
procesar las acciones y las consecuencias de estas, una vez ejecutada la lógica el
reducer retorna el nuevo estado.
21
cambian las UI, no hacen llamadas Ajax o a servicios, no llaman a otras funciones
para realizar su trabajo.
22
Figura 13 Inicialización de componentes
23
5.1 Instalación como app react
Node js es una herramienta muy sencilla de usar siendo un instalador pug and play,
en su versión Windows solo necesitamos descargar e instalar.
Una vez instalado node js solo necesitamos ejecutar los comandos necesarios en
nuestra consola de sistema, en el caso de Windows cmd.
cd my-app-name
npm start
24
Los comandos listados arriba se encargan de crear la app react accede al nuevo
proyecto creado e inicializar el servidor local node js que compilara los archivos de
React para crear los modulos necesarios.
25
5.2 Estructura básica del proyecto
Analizando además los archivos del proyecto básico encontramos que react
relaciona una vista html, index.html con un controlador del componente App.js, y los
maneja mediante su relacionador index.js, además de manejar un archivo .css en
donde se manejan los estilos que ayudan a la página a lucir mejor.
26
npm install redux
5.4.1 Acciones
Las acciones son objetos planos de JavaScript. Una acción debe tener una
propiedad “type” que indica el tipo de acción a realizar. Los tipos normalmente son
definidos como strings constantes. (Abramov, 2015)
27
5.4.2 Creadores de Acciones
Los creadores de acciones son funciones que crean acciones. Es fácil combinar los
términos "acción" con "creador de acción. En implementaciones de Flux tradicional,
los creadores de acciones ejecutan el dispatch cuando son invocadas.
28
Esto hace más portables y fáciles de probar. Para efectivamente iniciar un
despacho, pasa el resultado a la función dispatch(),La función dispatch() puede ser
accedida directamente desde el store como store.dispatch. (Abramov, 2015)
5.4.3 Reducers
Las acciones describen que algo pasó, pero no especifican cómo cambió el estado
de la aplicación en respuesta. Esto es trabajo de los reducers.
Para el manejo de las acciones iniciamos por escribir nuestro reducer. El reducer es
una función pura que toma el estado anterior una acción y retorna el nuevo estado.
29
Figura 19 Declaración de acciones en el reducer
30
Dados los mismos argumentos, se debe calcular y devolver el siguiente estado. Sin
sorpresas. Sin efectos secundarios. Sin llamadas a APIs. Sin mutaciones. Solo
cálculos.
5.4.4 Store
Las acciones que representan los hechos sobre "lo que pasó" y los reductores son
los que actualizan el estado de acuerdo a esas acciones.
El Store es el objeto que los reúne. El store tiene las siguientes responsabilidades:
31
Sólo se tiene un store en una aplicación Redux. Cuando desees dividir la lógica para
el manejo de datos, usarás composición de reductores en lugar de muchos stores.
Es fácil crear una store si tienes un reductor.
Hablando del flujo de los datos la arquitectura Redux gira en torno a un flujo de
datos estrictamente unidireccional.
Esto significa que todos los datos de una aplicación siguen el mismo patrón de ciclo
de duración, haciendo que la lógica de la aplicación sea más predecible y más fácil
de entender. También fomenta la normalización de los datos, de modo que no
termines con múltiples copias independientes de la misma data sin que se entere
una de la otra.
32
Fuente: Documentación Redux por (Abramov, 2015)
El reductor es una función pura. Sólo evalúa el siguiente estado. Debe ser
completamente predecible: invocarla con las mismas entradas muchas veces debe
producir las mismas salidas. No debe realizar ningún efecto alterno como las
llamadas al API o las transiciones del router. Esto debe suceder antes de que se
envíe la acción.
Redux provee una función combineReducers() que ayuda, a "dividir" el reductor raíz
en funciones separadas donde cada una maneja una porción del árbol de estado.
5.4.4.4 El store en Redux guarda por completo el árbol de estado devuelto por
el reductor raíz.
Este árbol registra cada listener usando store.subscribe(listener) y puede ahora ser
invocado, los listeners se pueden invocar con store.getState() para obtener el
estado actual.
33
Una vez recuperado el nuevo estado la UI se puede actualizar para reflejar este
nuevo estado, en Redux para cambiar ese estado se usa.
Redux al ser una librería que refleja el uso de FLUX en cualquier aplicación no
depende de React, se pueden escribir aplicaciones con React, Angular, Ember,
jquery o vanilla JS, Redux a pesar de ser versátil funciona especialmente bien con
React. En React hay componentes contenedores y de presentacion. Normalmente
se usan los componentes contenedores de React para conectarlos al store que es
manejado por Redux, donde el componente intermedio Provider hace visible al store
para el componente contenedor sin pasar el store explícitamente.
34
presentación, y los componentes contenedores, también se puede incluir una capa
extra de otros componentes.
Cada componente describe una apariencia, pero no conoce de donde vienen los
datos, o como cambiarlos directamente. Estos componentes solo muestran o
recogen lo que se les da. (Abramov, 2015)
• Componente de “listaDeModelos”
• Componente de filtrado de modelos
Todos los componentes necesitan acceder al sotre de Redux y para este propósito
ellos pueden subscribirse a este, una opción es pasar el store como una propiedad
a cada componente contenedor, este suele ser el método más largo. (Abramov,
2015)
7 Acciones Asíncronas
Una llamada asíncrona es una llamada hacia una función o método que ejecuta en
un hilo su funcionalidad, generalmente se usan las funciones asíncronas en
llamadas a funciones en el lado del backend, es decir para la conexión a un end-
point. Como react solo maneja flujos síncronos se utilizan Middlewares asíncronos
como redux-thunk o redux-promise que envuelven el método dispatch() y permiten
despachar otras cosas además de acciones, por ejemplo funciones o promesas. El
middleware Thunk es un orquestador de acciones en Redux.
• Una acción que informa a los reductores que la solicitud comenzó, los
reductores pueden manejar esta acción alternando un indicador
36
“isFetching” por ejemplo, de esta manera la interfaz sabrá cuando es el
momento de iniciar un indicador, un spinner por ejemplo.
• Una acción que informa a los reductores que la solicitud finalizo
correctamente, los reductores pueden responder a esta acción
fusionando los nuevos datos y reestableciendo la variable “isFetching”, de
esta manera la UI sabrá qué acciones tomar.
• Una acción que informe a los reductores que la llamada fallo, de manera
similar a la anterior los reductores usaran esta acción para actualizar el
“isFetching” pero sin modificar el data de la app. (Abramov, 2015)
Como vemos en el ejemplo “figura 23” podemos notar además el uso de otras
variables que ayudan en la ejecución, isFetching, didInvaldiate, lastUpdated, los
ítems como tal, además podemos pensar en el uso de otras variables por ejemplo,
fetchedPageCount y nextPageUrl, estos para manejar el estado actual de la página
en ejecución.
La sintaxis de propiedad conmutada, en ES6 para poder actualizar el state, que luce
de la siguiente forma.
[action.modelo]:posts(state[action,modelo])
})
Ese código gestiona el estado de una lista de modelos, a partir de acá se elige como
dividir el reductor para delegar elementos de actualización dentro de un objeto
Redux.
38
debemos entender que un creador de acciones puede devolver una función en lugar
de un objeto para que de esta manera el creador de acciones se convierte en un
thunk.
Cuando el creador de acciones retorne una función, esta función será ejecutada por
Redux-Thunk, esta función no es necesariamente una función pura, entonces
posiblemente tendremos efectos secundarios y de cambio, además de llamadas
asíncronas al API. En resumen, Thunk middleware es un orquestador de acciones
en Redux. (Abramov, 2015)
Sin middlewares, Redux sólo soporta flujos de datos síncronos. Es lo que obtienes
por defecto con createStore().
39
Cuando el último middleware de la cadena despache una acción, tiene que ser un
objeto plano. Acá es cómo el flujo de datos síncrono de Redux toma lugar.
(Abramov, 2015)
7.5 Middleware
8 Conclusiones
• Flux es un conjunto de patrones que juntos definen una arquitectura que nos
ayuda en el manejo de lo que se conoce como estado o state de los datos en
la vista, también está compuesto por 3 grandes partes Dispatchers, Stores y
Actions. Flux es una arquitectura unidireccional de flujo de dato, por este
motivo al comportarse de forma unidireccional en el manejo de componentes
hace casi imposible el generar un bug en el manejo de los datos, Flux controla
que la dirección de los componentes no pueda causar un problema al
momento del manejo de los datos
40
• React js junto con Redux son librerías que facilitan el manejo de las vistas
que permiten manejar eventos, estilos crear interfaces de usuarios
agradables para el usuario, además de facilitar para el desarrollador el
escribir código e implementar funcionalidad, se maneja de forma similar a
cualquier proyecto o framework estructurado bajo el principio de javascript,
en cualquier versión ES5 o ES6.
• Para implementar aplicaciones con React y Redux es necesario tener un
ambiente con Node.js, luego instalar react y react cli para poder crear
proyectos preconfigurados y funcionales mediante linea de comandos, que
tienen una estructura estandar de proyectos Node. Luego se debe instalar
redux mediante npm. Para usar redux se deben crear las acciones, creadores
de acciones, reductores, el store o almacen y los despachadores.
• Redux al ser una librería que refleja el uso de FLUX en cualquier aplicación
no depende de React, se pueden escribir aplicaciones con React, Angular,
Ember, jquery o vanilla JS, Redux a pesar de ser versátil funciona
especialmente bien con React. En React hay componentes contenedores y
de presentacion. Normalmente se usan los componentes contenedores de
React para conectarlos al store que es manejado por Redux, donde el
componente intermedio Provider hace visible al store para el componente
contenedor sin pasar el store explícitamente.
• Una llamada asíncrona es una llamada hacia una función o método que
ejecuta en un hilo su funcionalidad, generalmente se usan las funciones
asíncronas en llamadas a funciones en el lado del backend, es decir para la
conexión a un end-point. Como React solo maneja flujos síncronos se utilizan
Middlewares asíncronos como redux-thunk o redux-promise que envuelven
el método dispatch() y permiten despachar otras cosas además de acciones,
por ejemplo funciones o promesas. El middleware Thunk es un orquestador
de acciones en Redux.
41
Bibliografía
42