👨🏼‍💻

khriztianmoreno's Blog

Inicio Etiquetas Acerca |

Posts with tag redux

Redux explicado de manera simple y sucinta para los desarrolladores de React

2022-08-10
reactreduxjavascript

Redux es una biblioteca de administración de estado ampliamente utilizada para aplicaciones React y TypeScript. Es más fácil que nunca administrar el estado en React gracias al useState React Hook, así como a la API de contexto. Sin embargo, cuando su base de código crezca mucho, necesitará una solución de administración de estado más potente y estructurada, en lugar de ad-hoc. Ahí es donde Redux puede ayudar.Redux¿Por qué necesitas Redux?Cuando trabajas con React, generalmente terminas con un estado que se usa globalmente en toda la aplicación.Uno de los enfoques para compartir el estado en todo el árbol de componentes es usar la API de contexto. A menudo, lo usamos en combinación con hooks como useReducer y useState para administrar el estado global de la aplicación.Este enfoque funciona, pero solo puede llevarte hasta cierto punto. Al final, debes inventar tus propias formas de administrar los side-effects, depurar y dividir código de administración de estado en módulos para que no se convierta en un desastre incomprensible.Una mejor idea es utilizar herramientas especializadas. Una de esas herramientas para administrar el estado de la aplicación global es Redux.Cómo funciona ReduxRedux es un marco de gestión de estado que se basa en la idea de representar el estado global de la aplicación como una función reductora.En Redux, para administrar el estado, definimos una función que acepta dos argumentos: state, para el estado anterior, y action, el objeto que describe la actualización del estado.function reducer(state = "", action: Action) { switch (action.type) { case "SET_VALUE": return action.payload; default: return state; } }Este reductor representa un valor de tipo cadena. Maneja solo un tipo de acción: SET_VALUE.Si el tipo de campo de acción recibido no es SET_VALUE, el reductor devuelve el estado sin cambios.Después de tener el reductor, creamos la store(tienda) usando el método redux createStore.const store = createStore(reducer, "Initial Value");La store proporciona un método de suscripción que nos permite suscribirnos a las actualizaciones de la store.store.subscribe(() => { const state = store.getState(); console.log(state); });Aquí, le hemos pasado un callback que registra el valor del estado en la consola.Para actualizar el estado, despachamos(dispatch) una acción:store.dispatch({ type: "SET_VALUE", payload: "New value", });Aquí pasamos un objeto que representa la acción(action). Se requiere que cada acción tenga el campo de type y opcionalmente, payload.Por lo general, en lugar de crear acciones en el lugar, las personas definen action creator functions:const setValue = (value) => ({ type: "SET_VALUE", payload: value, });Y esta es la esencia de Redux.¿Por qué no podemos usar el hook useReducer en lugar de Redux?Desde la versión 16.8, React admite Hooks. Uno de ellos, useReducer, funciona de manera muy similar a Redux.Es fácil administrar el estado de la aplicación usando una combinación de useReducer y React Context API.Entonces, ¿por qué necesitamos Redux si tenemos una herramienta nativa que también nos permite representar el estado como un reductor? Si lo ponemos a disposición en toda la aplicación mediante la API de contexto, ¿no será suficiente?Redux ofrece algunas ventajas importantes:Herramientas del navegador: pueded usar Redux DevTools para depurar tu código Redux. Est nos permite ver la lista de acciones enviadas, inspeccionar el estado e incluso viajar en el tiempo. Puede alternar en el historial de acciones y ver cómo el estado se ocupó de cada uno de ellos.Manejo de efectos secundarios: con useReducer, debes inventar tus propias formas de organizar el código que realiza las solicitudes de red. Redux proporciona la API de middleware para manejar eso. Además, existen herramientas como Redux Thunk que facilitan aún más esta tarea.Pruebas: como Redux se basa en funciones puras, es fácil de probar. Todas las pruebas se reducen a verificar la salida con las entradas dadas.Patrones y organización de código: Redux está bien estudiado y hay recetas y mejores prácticas que puede aplicar. Existe una metodología llamada Ducks que puedes usar para organizar el código Redux.Construyendo con ReduxAhora que ha visto ejemplos de lo que hace Redux y cómo funciona, está listo para usarlo en un proyecto real.Profile@khriztianmorenoHasta la próxima

¿Qué es un “side effect”?

2020-02-20
javascriptreactredux

En el anterior post, conocimos un poco sobre la inmutabilidad y la razon de porque deberia importarnos a la hora de escribir nuestro codigo en especial nuestros reducers.En esta ocasion, quiero abordar un poco sobre los *side effect *y como el trabajar con funciones puras nos puede servir, sin embargo, primero veamos qué hace que una función sea pura y porque está muy relacionada con la inmutabilidad.Reglas de inmutabilidadPara ser pura, una función debe seguir estas reglas:Una función pura siempre debe devolver el mismo valor cuando se le dan las mismas entradas.Una función pura no debe tener ningún efecto secundario (side effect).Los “side effects” son un término amplio, pero básicamente significa modificar cosas fuera del alcance de esa función inmediata. Algunos ejemplos de efectos secundarios …Mutar/modificar parámetros de entrada, como giveAwesomePowers (funcion del post anterior)Modificación de cualquier otro estado fuera de la función, como variables globales, o document.(anything) o window.(anything)Hacer llamadas a la APIconsole.log()Math.random()Las llamadas a la API pueden sorprenderte. Después de todo, hacer una llamada a algo comofetch('/users')podría no cambiar nada en su UI.Pero pregúntate esto: si llamó fetch('/users'), ¿podría cambiar algo en cualquier lugar? ¿Incluso fuera de tu UI?Sí. Creará una entrada en el registro de red del navegador. Creará (y quizás luego cerrará) una conexión de red al servidor. Y una vez que esa llamada llega al servidor, todas las apuestas están desactivadas. El servidor podría hacer lo que quiera, incluyendo llamar a otros servicios y hacer más mutaciones. Por lo menos, probablemente colocará una entrada en un archivo de registro en algún lugar (que es una mutación).Entonces, como dije: “side effect” es un término bastante amplio. Aquí hay una función que no tiene side effects:Puedes llamar esta función una vez, puedes llamarla un millón de veces y nada cambiará. Quiero decir, técnicamente, esto satisface la Regla 2. Llamar a esta función no causará directamente ningun efecto secundario.Además, cada vez que llame a esta función como add(1, 2) obtendrá la misma respuesta. No importa cuántas veces llame a add(1, 2) obtendrá la misma respuesta. Eso satisface la Regla 1: las mismas entradas == mismas respuestas.JS Array métodos que mutanCiertos métodos de vector mutarán el vector en el que se utiliza:push (agregar un item hasta el final)pop (eliminar un item del final)shift (eliminar un item desde el principio)unshift (agregar un item desde el principio)sortreversespliceLas funciones puras solo pueden llamar a otras funciones purasUna posible fuente de problemas es llamar a una función no pura desde una pura.La pureza es transititiva y es todo o nada. Puede escribir una función pura perfecta, pero si la finaliza con una llamada a alguna otra función que eventualmente llame a setStateo dispatch o cause algún otro tipo de efecto secundario … entonces todas las apuestas estarán desactivadas.Ahora, hay algunos tipos de efectos secundarios que son “aceptables”. Registrar mensajes con console.log está bien. Sí, técnicamente es un efecto secundario, pero no va a afectar nada.A Pure Version of giveAwesomePowersAhora podemos reescribir nuestra función teniendo en cuenta las Reglas.giveAwesomePowers — Pure functiongiveAwesomePowers — Pure functionEsto es un poco diferente ahora. En lugar de modificar a la persona, estamos creando una persona completamente nueva.Si no ha visto Object.assign, lo que hace es asignar propiedades de un objeto a otro. Puede pasarle una serie de objetos, y los combinará, de izquierda a derecha, mientras sobrescribe cualquier propiedad duplicada.(Y por “de izquierda a derecha”, quiero decir que la ejecución de Object.assign(result, a, b, c) copiará a en result, luego b, luego c).Sin embargo, no hace una fusión profunda(deep merge): solo se moverán las propiedades secundarias inmediatas de cada argumento. También, lo más importante, no crea copias o clones de las propiedades. Los asigna tal como están, manteniendo las referencias intactas.Entonces el código anterior crea un objeto vacío, luego asigna todas las propiedades de person, a ese objeto vacío y luego asigna la propiedad specialPower a ese objeto también. Otra forma de escribir esto es con el operador de propagación de objetos (spread):giveAwesomePowers — ES6 || spreadgiveAwesomePowers — ES6 || spreadPuedes leer esto como: “Cree un nuevo objeto, luego inserte las propiedades de person, luego agregue otra propiedad llamada specialPower”. Al escribir estas líneas, esta sintaxis spread es oficialmente parte de la especificación de JavaScript en ES2018.Funciones puras devuelven nuevos objetos a estrenarAhora podemos volver a ejecutar nuestro experimento desde antes, utilizando nuestra nueva versión pura degiveAwesomePowers.La gran diferencia es que esa person no fue modificada. Mafe no ha cambiado. La función creó un clon de Mafe, con todas las mismas propiedades, además de la capacidad de hacerse invisible.Esto es una especie de cosa extraña acerca de la programación funcional. Los objetos se crean y destruyen constantemente. No cambiamos a Mafe; creamos un clon, modificamos su clon y luego reemplazamos a Mafe con su clon.¡Espero que esto haya sido útil y/o te haya hecho aprender algo nuevo!Profile@khriztianmoreno �

¿Qué es la inmutabilidad?

2020-02-10
javascriptreduxreact

Inmutabilidad en React y ReduxLa inmutabilidad puede ser un tema confuso, y aparece en todas partes en React, Redux y JavaScript en general.Es posible que hayas encontrado errores en los que tus componentes de React no se vuelven a renderizar, a pesar de que sabes que has cambiado las props, y alguien dice, “Deberías estar haciendo actualizaciones de estado inmutables.” Tal vez tú o uno de tus compañeros de equipo escribe regularmente reducers en Redux que mutan el estado, y nos toca corregirlos constantemente (los reducers, o a nuestros compañeros de trabajo 😄).Es complicado. Puede ser muy sutil, especialmente si no estás seguro de qué buscar. Y sinceramente, si no estás seguro de por qué es importante, es difícil preocuparse.

Flux Standard Action (FSA)

2020-01-20
reactjavascriptreduxtutorial

Es una especificación ligera que define la estructura de una acción, para ser implementada en librerías que usan el patrón o arquitectura Flux.El cumplimiento de FSA ayuda a los desarrolladores a crear abstracciones que pueden funcionar con diferentes implementaciones de Flux.Flux Standard Action — ExampleFlux Standard Action — ExampleTodo inicia después de que Facebook publicó su arquitectura/patrón Flux, muchas librerías implementaron la filosofía Flux, Redux fue una de ellas.Flux se puede dividir en varios conceptos Dispatcher, Store, Action y View. Pero en este post vamos a conocer la parte de Action y como trabajar con estas de una forma mas estandarizada, para mas adelante poder hacer uso de otras librerías que implementan la filosofía FSA.Antes de adentrarnos mas en el tema principal de hoy, conozcamos el concepto de Action y como es definido por flux:Actions define the internal API of your application. They capture the ways to interact with your application. They are simple objects that consist of a “type” field and data.La especificación conduciría al siguiente objeto:{ type: 'ADD_TODO', text: 'TODO content' }El único problema con este ejemplo simple es que el desarrollador puede elegir cualquier nombre de propiedad para los valores. Todos los siguientes nombres son válidos: título, nombre, texto, todoNombre, etc. Es imposible saber qué propiedades esperar del ADD_TODO en el reductor de Redux.Sería mucho más fácil trabajar con acciones de Flux, si pudiéramos hacer ciertas suposiciones sobre su forma. Tal vez la definición de un estándar común mínimo para estos patrones permitiría tener la abstracción necesaria para comunicar nuestras acciones con el reducer. Esto es algo que Flux Standard Action (FSA) viene a resolver.Para entrar un poco en detalle sobre FSA, en necesario partir de la siguiente premisa que Flux Standard Action nos proporciona sobre las acciones:Una acción DEBE:ser un objeto JavaScript simple.tener una propiedad type.Una acción PUEDEtener una propiedad error.tener una propiedad payload.tener una propiedad meta.Una acción NO DEBE incluir propiedades que no sean type, payload, error, y meta.¿pero entonces que significa cada una de estas propiedades que nuestro objeto javascript puede llegar a contener?Veamos entonces cada uno de estostypeLa propiedad requerida type identifica la naturaleza de la acción que ha ocurrido al consumidor, type es una constante de tipo StringpayloadLa propiedad opcional payload PUEDE ser cualquier tipo de valor. Representa la carga de la acción. Cualquier información sobre la acción que no sea el type o el estado de la acción debe ser parte del campo payload.Por convención, el payload DEBERÍA ser un objeto.errorLa propiedad opcional error PUEDE establecerse en verdadero si la acción representa un error.An action whose error is true is analogous to a rejected Promise. By convention, the payload SHOULD be an error object.Si el error tiene cualquier otro valor además de true, incluyendo undefined y null, la acción NO DEBE ser interpretada como un error.metaLa propiedad opcional meta PUEDE ser cualquier tipo de valor. Está destinado a cualquier información adicional que no forme parte de payload .El concepto Flux Standard Action (FSA) es usado por algunas librerías que nos puede ayudar a reducir el texto repetitivo que debemos crear para nuestras accionesLibreríasredux-actions — un conjunto de helpers para crear y manejar acciones de FSA en Redux..redux-promise — Es un middleware que admite acciones de FSA.redux-rx — Utilidades RxJS para Redux, incluido un middleware que admite acciones de FSA.Espero en una próxima ocasión tener la posibilidad de dar una introducción de como reducir el Boilerplate de Redux con Redux-Actions.¡Espero que esto haya sido útil y/o te haya hecho aprender algo nuevo!Profile@khriztianmoreno �