{"id":3565,"date":"2018-10-20T03:13:25","date_gmt":"2018-10-20T03:13:25","guid":{"rendered":"http:\/\/pensemosweb.com.mx\/index.php\/2018\/10\/20\/como-empezar-con-redux-en-7-minutos\/"},"modified":"2024-04-14T16:39:13","modified_gmt":"2024-04-14T22:39:13","slug":"como-empezar-con-redux-en-7-minutos","status":"publish","type":"post","link":"https:\/\/pensemosweb.com\/en\/como-empezar-con-redux-en-7-minutos\/","title":{"rendered":"\u00bfC\u00f3mo empezar con Redux en 7 minutos?"},"content":{"rendered":"<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 es Redux?<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Redux es un contenedor predecible del estado de aplicaciones JavaScript.<\/p>\n\n\n\n<p>Te ayuda a escribir aplicaciones que se comportan de manera consistente, corren en distintos ambientes (cliente, servidor y nativo), y son f\u00e1ciles de probar. Adem\u00e1s de eso, provee una gran experiencia de desarrollo, gracias a&nbsp;edici\u00f3n en vivo combinado con un depurador sobre una l\u00ednea de tiempo.<\/p>\n<cite>redux.org<\/cite><\/blockquote>\n\n\n\n<p>Te permite controlar el flujo de datos de una aplicaci\u00f3n Javascript, este flujo de los datos funciona en una sola direcci\u00f3n. Por esta \u00fanica direcci\u00f3n es mucho m\u00e1s f\u00e1cil controlar las <strong>mutaciones <\/strong>and <strong>operaciones as\u00edncronas.<\/strong><\/p>\n\n\n\n<p>Redux es parecido a <strong><a href=\"https:\/\/facebook.github.io\/flux\/\">flux<\/a><\/strong>, de hecho est\u00e1 basado en flux<\/p>\n\n\n\n<p>En el estado de una aplicaci\u00f3n, principalmente en aplicaciones <a href=\"https:\/\/es.wikipedia.org\/wiki\/Single-page_application\">SPA<\/a>, esto es muy importante, porque las aplicaciones web modernas tienen gran complejidad de operaciones as\u00edncronas. Adem\u00e1s de controlar el estado entre los componentes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 problemas puedo mitigar con Redux?<\/h2>\n\n\n\n<p>En el ejemplo de aplicaciones web, estas necesitan controlar peticiones a servidores, obtener datos y controlar el estado en el cliente. Aun cuando estos datos no han sido guardados en el servidor.<\/p>\n\n\n\n<p>Estas aplicaciones modernas requieren de un control complejo y por eso nuevos patrones de arquitectura como Redux y flux &nbsp;nacen para hacer el desarrollo m\u00e1s productivo.<\/p>\n\n\n\n<p>Las <strong>mutaciones <\/strong>de objetos son dif\u00edciles de manejar y m\u00e1s a escalas medianas y grandes. Se comienza a perder el control de los datos, este flujo de datos generan comportamiento no deseados. Mala informaci\u00f3n desplegada al usuario y c\u00f3digo que es muy dif\u00edcil de mantener.<\/p>\n\n\n\n<p>Sin contar cosas m\u00e1s elevadas como tu salud y causa de estr\u00e9s por el esfuerzo en arreglar estas inconsistencias, te hace perder tiempo para mantener la aplicaci\u00f3n funcionando correctamente. Por si fuera poco afectas a tus usuarios porque ellos obtienen informaci\u00f3n incorrecta y pierden su tiempo al utilizar esa informaci\u00f3n.<\/p>\n\n\n\n<p>\u00bfQu\u00e9 decir de las <strong>operaciones as\u00edncronas<\/strong>? Bueno, pr\u00e1cticamente pasa lo mismo o a\u00fan peor. Porque en una operaci\u00f3n as\u00edncrona no sabes cuando obtendr\u00e1s el resultado y adem\u00e1s normalmente vienen acompa\u00f1adas con el deseo de hacer modificaciones al estado de la aplicaci\u00f3n.<\/p>\n\n\n\n<p>Un ejemplo com\u00fan es el control de los datos de tu aplicaci\u00f3n con cualquier frawework front-end de componentes visuales.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"tres-elementos-importantes-que-forman-el-estado-de-tu-aplicaci-n-en-redux\">\u00bfDe qu\u00e9 est\u00e1 hecho Redux? Tres elementos<\/h2>\n\n\n\n<p><strong>Store. <\/strong>El store es un objeto donde guardas toda la informaci\u00f3n del estado, es como el modelo de una aplicaci\u00f3n, con la excepci\u00f3n que no lo puedes modificar directamente, es necesario disparar una acci\u00f3n para modificar el estado.<\/p>\n\n\n\n<p><strong>Actions. <\/strong>Son el medio por el cual indicas que quieres realizar una modificaci\u00f3n en el estado, es un mensaje o notificaci\u00f3n liviana. Solo enviando la informaci\u00f3n necesaria para realizar el cambio.<\/p>\n\n\n\n<p><strong>Reducers<\/strong>. Son las funciones que realizan el cambio en el estado o store, lo que hacen internamente es crear un nuevo estado con la informaci\u00f3n actualizada, de tal manera que los cambios se reflejan inmediatamente en la aplicaci\u00f3n. Los reducers son <strong><a href=\"https:\/\/pensemosweb.com\/en\/introduccion-programacion-funcional\/#sinefectoscolaterales\">funciones puras<\/a><\/strong>, es decir, sin efectos colaterales, no mutan el estado, sino que crean uno con informaci\u00f3n nueva.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"redux-se-basa-en-tres-principios\">\u00bfQu\u00e9 principios debo seguir? Tres principios<\/h2>\n\n\n\n<p><strong>Un \u00fanico Store para representar el estado de toda la aplicaci\u00f3n<\/strong>. Tener una sola fuente de datos para toda tu aplicaci\u00f3n permite tener centralizada la informaci\u00f3n, evita problemas de comunicaci\u00f3n entre componentes para desplegar los datos, f\u00e1cil de depurar y menos tiempo agregando funcionalidad o detectando errores.<\/p>\n\n\n\n<p><strong>Estado de solo lectura.&nbsp;<\/strong>Esto permite tener el control de cambios y evitar un relajo entre los diferentes componentes de tu aplicaci\u00f3n, ni los componentes, ni peticiones ajax pueden modificar directamente el <strong>Estado (state) <\/strong>de tu aplicaci\u00f3n, esto quiere decir que si quieres actualizar tu estado, debes &nbsp;hacerlo a trav\u00e9s de <strong>actions<\/strong>, de esta manera redux se encarga de realizar las actualizaciones de manera estricta y en el orden que le corresponden.<\/p>\n\n\n\n<p><strong>Los cambios solo se hacen con funciones puras. <\/strong>Al realizar los cambios con funciones puras, lo que realmente se hace es crear un nuevo objeto con la informaci\u00f3n actualizada, estas funciones puras son los <strong>reducers&nbsp;<\/strong>y no mutan el estado, al no mutar el estado, se evitan problemas de control, datos incorrectos, mal comportamiento y errores, tambi\u00e9n permite que la depuraci\u00f3n sea m\u00e1s f\u00e1cil. Puedes dividir los reducer en varios archivos diferentes y las pruebas unitarias son f\u00e1ciles de implementar. Los reducers son funciones puras que toman el estado anterior y una acci\u00f3n, y devuelven un nuevo estado.<\/p>\n\n\n\n<p>Otras arquitecturas como MVC (Modelo, Vista, Controlador), los cambios pueden existir en ambas direcciones, es decir, la vista puede cambiar el estado, el modelo lo podr\u00eda modificar y tambi\u00e9n el controlador.  Todos estos cambios necesitan estar sincronizados en varias partes de una aplicaci\u00f3n para evitar inconsistencias, lamentablemente este problema de inconsistencia se vuelve muy dif\u00edcil y tedioso de resolver.<\/p>\n\n\n\n<p>Lo anterior no sucede con Redux.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"mi-primer-state-con-redux\">\u00bfC\u00f3mo funciona? Mi primer estado predecible con Redux<\/h2>\n\n\n\n<p>Primero veamos el flujo de una sola direcci\u00f3n de redux:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2018\/10\/flujo-control-redux.jpg\" alt=\"Redux: flujo de control una sola direcci\u00f3n\" class=\"wp-image-1409\"\/><figcaption class=\"wp-element-caption\">Redux: flujo de control una sola direcci\u00f3n<\/figcaption><\/figure>\n\n\n\n<p>Ahora un ejemplo concreto para saber de que estamos hablando, el control de un contador:<\/p>\n\n\n\n<p class=\"codepen\" data-height=\"544\" data-theme-id=\"default\" data-default-tab=\"js,result\" data-user=\"jaime_cervantes_ve\" data-slug-hash=\"yRzjod\" style=\"height: 544px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;\" data-pen-title=\"Redux: Contador State, es5\">\n  <span>See the Pen <a href=\"https:\/\/codepen.io\/jaime_cervantes_ve\/pen\/yRzjod\">\n  Redux: Contador State, es5<\/a> by Jaime Cervantes Velasco (<a href=\"https:\/\/codepen.io\/jaime_cervantes_ve\">@jaime_cervantes_ve<\/a>)\n  on <a href=\"https:\/\/codepen.io\">CodePen<\/a>.<\/span>\n<\/p>\n<script async=\"\" src=\"https:\/\/static.codepen.io\/assets\/embed\/ei.js\"><\/script>\n\n\n\n<p>Si quieres probar este ejemplo en tu m\u00e1quina recuerda insertar o importar la librer\u00eda <strong>Redux. <\/strong>En este ejemplo podemos ver el funcionamiento de Redux, cada vez que se da clic sobre los botones de incrementar y decrementar, el contador se incrementa y decrementa.<\/p>\n\n\n\n<p>Si ahora nos vamos al c\u00f3digo JS, podremos ver que solo tenemos una funci\u00f3n llamada <code>counter<\/code>, esta funci\u00f3n es un <strong>reducer&nbsp;<\/strong>y es una <strong>funci\u00f3n pura<\/strong>, sin efectos colaterales.<\/p>\n\n\n\n<p>Luego vemos que como par\u00e1metros recibe un <strong>state&nbsp;<\/strong>y un <strong>action<\/strong>, cuando creamos nuestro Store con Redux, estas funciones reducer son utilizadas para modificar el <strong>State<\/strong>. <\/p>\n\n\n\n<p>Normalmente, el <strong>state<\/strong>, <strong>reducer <\/strong>and <strong>action <\/strong>son definidos en puntos diferentes, y pueden ser organizados en varios archivos y carpetas dependiendo de la necesidad de la aplicaci\u00f3n, toda esta organizaci\u00f3n tiene la finalidad de tener un c\u00f3digo limpio y separar funcionalidades. En este caso sencillo no es necesario, en un solo archivo tenemos todo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">State<\/h3>\n\n\n\n<p>Nuestro <strong>state <\/strong>es solo un valor num\u00e9rico, el cual se va a incrementar o decrementar con los botones que est\u00e1n en la p\u00e1gina, normalmente el state es un objeto literal o un array literal, pero en nuestro caso solo necesitamos un n\u00famero. Su definici\u00f3n podr\u00eda estar en otro archivo, sin embargo, para este ejemplo no es necesario, lo agregamos como valor por defecto del par\u00e1metro <code>state<\/code>.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"function counter(state = 0, action) { ...\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">functions<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">counter<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8; font-style: italic\">state<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #BABED8; font-style: italic\">action<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">...<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Actions<\/h3>\n\n\n\n<p>Si seguimos revisando nuestro c\u00f3digo, veremos unos cuantas condiciones que revisa el valor del par\u00e1metro <strong>action&nbsp;<\/strong>y dependiendo de la acci\u00f3n, se ejecuta alguna operaci\u00f3n, en nuestro caso son las operaciones <code>INCREMENTAR<\/code> either <code>DECREMENTAR<\/code>.<\/p>\n\n\n\n<p>The <strong>actions&nbsp;<\/strong>no son m\u00e1s que objetos literales como los siguientes:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"const incrementar = { type: 'INCREMENTAR' }const decrementar = { type: 'DECREMENTAR' }\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> incrementar <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #F07178\">type<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">INCREMENTAR<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> decrementar <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #F07178\">type<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">DECREMENTAR<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Reducers<\/h3>\n\n\n\n<p>The <strong>reducer <\/strong>revisan esos <strong>actions, <\/strong>en nuestro ejemplo:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"if (action.type === 'INCREMENTAR') {  return state +  1;}if (action.type === 'DECREMENTAR') {  return state - 1;}\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #BABED8\"> (action<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">type <\/span><span style=\"color: #89DDFF\">===<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">INCREMENTAR<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #BABED8\">) <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">state<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #F07178\">  <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #BABED8\"> (action<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">type <\/span><span style=\"color: #89DDFF\">===<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">DECREMENTAR<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #BABED8\">) <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">state<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Con todo esto ya tenemos nuestro <strong>State <\/strong>y su estado inicial en caso de no estar definido, tambi\u00e9n nuestra primer reducer, <code>counter<\/code>, y nuestros primeros <strong>actions&nbsp;<\/strong><code>INCREMENTAR<\/code> and <code>DECREMENTAR<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Store<\/h3>\n\n\n\n<p>Es el momento de crear nuestro <strong>Store, <\/strong>utilizando la librer\u00eda redux esto es muy f\u00e1cil:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"const store = Redux.createStore(counter);\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> store <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> Redux<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">createStore<\/span><span style=\"color: #BABED8\">(counter)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Con la anterior l\u00ednea, Redux crea un Store para controlar el estado de nuestra aplicaci\u00f3n. Internamente, un Store es un <a href=\"https:\/\/pensemosweb.com\/en\/implementar-patron-observador-javascript\/\">Patr\u00f3n observador<\/a> que utiliza un <a href=\"https:\/\/pensemosweb.com\/en\/patrones-de-diseno-en-javascript-singleton-factory\/\">Singleton <\/a>para el <strong>State&nbsp;<\/strong>y expone los siguientes m\u00e9todos principales:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>store.getState()<\/code><\/li>\n\n\n\n<li><code>store.subscribe(listener)<\/code><\/li>\n\n\n\n<li><code>store.dispatch(action)<\/code><\/li>\n<\/ul>\n\n\n\n<p><code>store.getState()<\/code> te permite obtener el estado actual de tu aplicaci\u00f3n.<\/p>\n\n\n\n<p><code>store.subscribe(listener)<\/code> ejecuta la funci\u00f3n listener (u observador), cada vez que el store es actualizado.<\/p>\n\n\n\n<p><code>store.dispatch(action)<\/code> pide actualizar el estado, esta modificaci\u00f3n no es directa, siempre se realiza a trav\u00e9s de un <strong>action <\/strong>y se ejecuta con un <strong>reducer.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Reaccionar a cambios del state<\/h3>\n\n\n\n<p>Luego creamos una funci\u00f3n <code>render<\/code>, para que se ejecute cada vez que el <strong>State <\/strong>de tu aplicaci\u00f3n cambie.<\/p>\n\n\n\n<p>Aqu\u00ed nuestro contenido html:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"<button id=&quot;incrementar&quot;&gt;Incrementar<\/button&gt;<button id=&quot;decrementar&quot;&gt;Decrementar<\/button&gt;<div id=&quot;state&quot;&gt;<\/div&gt;\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">button<\/span><span style=\"color: #89DDFF\"> <\/span><span style=\"color: #C792EA\">id<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">incrementar<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #BABED8\">Incrementar<\/span><span style=\"color: #89DDFF\">&lt;\/<\/span><span style=\"color: #F07178\">button<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">button<\/span><span style=\"color: #89DDFF\"> <\/span><span style=\"color: #C792EA\">id<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">decrementar<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #BABED8\">Decrementar<\/span><span style=\"color: #89DDFF\">&lt;\/<\/span><span style=\"color: #F07178\">button<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">div<\/span><span style=\"color: #89DDFF\"> <\/span><span style=\"color: #C792EA\">id<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">state<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">&gt;&lt;\/<\/span><span style=\"color: #F07178\">div<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Nuestra funci\u00f3n <code>render<\/code><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"function render () {  document.querySelector('#state').innerText = store.getState();}\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">functions<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">render<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #BABED8\">document<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">querySelector<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">#state<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">innerText<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">store<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">getState<\/span><span style=\"color: #F07178\">()<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Invocamos render para pintar el valor <strong>0<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"render()\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #82AAFF\">render<\/span><span style=\"color: #BABED8\">()<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Aqu\u00ed te preguntar\u00e1s, \u00bfC\u00f3mo es posible que esa l\u00ednea imprima <strong>0 <\/strong>en la pantalla?, pues internamente el store invoca  un dispatch con un <strong>action <\/strong>vac\u00edo <code>store.dispatch({})<\/code>, esto invoca nuestra funci\u00f3n <strong>reducer<\/strong> y al no encontrar ninguna acci\u00f3n, entonces regresa el estado inicial <strong>0<\/strong>.<\/p>\n\n\n\n<p>Luego nos subscribimos a store para escuchar u observar el State cada vez que se actualice y poder ejecutar la funci\u00f3n <code>render()<\/code>.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"store.subscribe(render);\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #BABED8\">store<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">subscribe<\/span><span style=\"color: #BABED8\">(render)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Esta l\u00ednea permite que cuando demos clic en los botones de incrementar y decrementar, se imprima el nuevo valor en la p\u00e1gina volviendo a renderizar su contenido.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ejecutar dispatch a trav\u00e9s de eventos del DOM<\/h3>\n\n\n\n<p>Y por \u00faltimo agregamos dos listeners correspondientes a los botones de incrementar y decrementar, cada bot\u00f3n realiza una invocaci\u00f3n <code>dispatch<\/code> para modificar el estado.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"<button id=&quot;incrementar&quot;&gt;Incrementar<\/button&gt;<button id=&quot;decrementar&quot;&gt;Decrementar<\/button&gt;<div id=&quot;state&quot;&gt;<\/div&gt;\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">button<\/span><span style=\"color: #89DDFF\"> <\/span><span style=\"color: #C792EA\">id<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">incrementar<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #BABED8\">Incrementar<\/span><span style=\"color: #89DDFF\">&lt;\/<\/span><span style=\"color: #F07178\">button<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">button<\/span><span style=\"color: #89DDFF\"> <\/span><span style=\"color: #C792EA\">id<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">decrementar<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #BABED8\">Decrementar<\/span><span style=\"color: #89DDFF\">&lt;\/<\/span><span style=\"color: #F07178\">button<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">div<\/span><span style=\"color: #89DDFF\"> <\/span><span style=\"color: #C792EA\">id<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">state<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">&gt;&lt;\/<\/span><span style=\"color: #F07178\">div<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"document.querySelector('#incrementar').addEventListener('click', () =&gt; {  store.dispatch(incrementar);});document.querySelector('#decrementar').addEventListener('click', () =&gt; {  store.dispatch(decrementar);});\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #BABED8\">document<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">querySelector<\/span><span style=\"color: #BABED8\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">#incrementar<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #BABED8\">)<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">addEventListener<\/span><span style=\"color: #BABED8\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">click<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">=&gt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #BABED8\">store<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">dispatch<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">incrementar<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #BABED8\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">document<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">querySelector<\/span><span style=\"color: #BABED8\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">#decrementar<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #BABED8\">)<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">addEventListener<\/span><span style=\"color: #BABED8\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">click<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">=&gt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #BABED8\">store<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">dispatch<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">decrementar<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #BABED8\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Al fin tenemos el flujo de datos de nuestro sencillo ejemplo usando Redux, en general los componentes que forman a una aplicaci\u00f3n que utiliza Redux son los siguientes:<\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-large\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2018\/10\/redux-control-unidireccional-completo.jpg\" alt=\"Redux: flujo de control completo\" class=\"wp-image-1413\"\/><figcaption class=\"wp-element-caption\">Redux: flujo de control completo<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusions<\/h2>\n\n\n\n<p>Podemos notar el flujo en una sola direcci\u00f3n desde la vista con los actions <code>dispatch(action)<\/code>, luego &nbsp;los reducers <code>counter(prevState, action)<\/code> para modificar el store y este \u00faltimo manda la informaci\u00f3n a trav\u00e9s de <code>subscribe(render)<\/code> and <code>getState()<\/code>.<\/p>\n\n\n\n<p>Redux como ya se mencion\u00f3 en p\u00e1rrafos anteriores, nos proporciona:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>El conocimiento en todo momento del estado de nuestra aplicaci\u00f3n y en cualquier parte de la aplicaci\u00f3n con mucha facilidad.<\/li>\n\n\n\n<li>F\u00e1cil organizaci\u00f3n, con actions, reducer y store, haciendo cambios en una sola direcci\u00f3n, adem\u00e1s puedes separar tus actions, reducer y el store en varios archivos.<\/li>\n\n\n\n<li>F\u00e1cil de mantener, debido a su organizaci\u00f3n y su \u00fanico store, mantener su funcionamiento y agregar nuevas funcionalidades es muy sencillo.<\/li>\n\n\n\n<li>Tiene muy buena documentaci\u00f3n, su comunidad es grande y tiene su propia herramienta para debuguear<\/li>\n\n\n\n<li>Todos &nbsp;los puntos anteriores hacen que sea f\u00e1cil de hacer pruebas unitarias.<\/li>\n\n\n\n<li><strong>Y lo m\u00e1s importante, te ahorra tiempo, dinero y esfuerzo xD.<\/strong><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>        Redux es una arquitectura que te permite controlar el flujo de datos de una aplicaci\u00f3n de manera m\u00e1s eficiente. Mutaciones y operaciones as\u00edncronas.<\/p>","protected":false},"author":2,"featured_media":3737,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[28,36],"tags":[54,68,76],"class_list":["post-3565","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript","category-redux","tag-javascript","tag-intermedio","tag-redux"],"_links":{"self":[{"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/posts\/3565","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/comments?post=3565"}],"version-history":[{"count":3,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/posts\/3565\/revisions"}],"predecessor-version":[{"id":3914,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/posts\/3565\/revisions\/3914"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/media\/3737"}],"wp:attachment":[{"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/media?parent=3565"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/categories?post=3565"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/tags?post=3565"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}