{"id":2998,"date":"2021-10-21T16:36:30","date_gmt":"2021-10-21T21:36:30","guid":{"rendered":"https:\/\/www.pensemosweb.com\/?p=2998"},"modified":"2024-04-02T17:33:05","modified_gmt":"2024-04-02T23:33:05","slug":"react-hooks-usestate-y-useeffect","status":"publish","type":"post","link":"https:\/\/pensemosweb.com\/en\/react-hooks-usestate-y-useeffect\/","title":{"rendered":"React Hooks, useState and useEffect"},"content":{"rendered":"<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 son los React Hooks?<\/h2>\n\n\n\n<p>Los React Hooks, son funciones que se ejecutan en un determinado punto en la vida de un componente funcional. Permiten usar caracter\u00edsticas de React, sin la necesidad de usar clases. Por ejemplo te permite agregar <strong>state<\/strong> a un componente funcional.<\/p>\n\n\n\n<p>Tambi\u00e9n permite controlar efectos colaterales en caso de ser necesarios. Por ejemplo, peticiones a servicios, subscribirse a eventos, modificar el DOM, logging o cualquier otro c\u00f3digo imperativo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfPor qu\u00e9 funciones y componentes funcionales?<\/h2>\n\n\n\n<p>Si necesitas m\u00e1s detalles sobre como son las funciones en Javascript, puedes revisar estas dos publicaciones:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/pensemosweb.com\/en\/funciones-node-js-javascript-realmente-importante\/\" target=\"_blank\" rel=\"noreferrer noopener\">Functions in Node.js and JavaScript. What&#039;s really important<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/pensemosweb.com\/en\/funciones-en-node-js-y-javascript-mas-detalles\/\" target=\"_blank\" rel=\"noreferrer noopener\">Functions in Node.js and Javascript. More details<\/a><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Organizaci\u00f3n y reutilizaci\u00f3n<\/h3>\n\n\n\n<p>Se sabe que las funciones son la unida esencial para la organizaci\u00f3n y reutilizaci\u00f3n de c\u00f3digo, es decir, las funcionalidades de cualquier software.<\/p>\n\n\n\n<p>Al utilizar funciones se elimina la complejidad de usar clases. No necesitas usar <code>this<\/code>, constructores, ni separar funcionalidades estrechamente relacionadas en varios m\u00e9todos del ciclo de vida de un componente en React.<\/p>\n\n\n\n<p>Si has creado componentes en React, de seguro has aprendido ver a los componentes como una funci\u00f3n y sus propiedades como sus par\u00e1metros. \u00bfPor qu\u00e9 no hacerlo m\u00e1s transparentes al usar solamente funciones?<\/p>\n\n\n\n<p>De hecho las clases, surgieron de funciones. Como se explica <a href=\"https:\/\/pensemosweb.com\/en\/paradigma-programacion-javascript\/#Surgido_de_funciones\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a> and <a href=\"https:\/\/pensemosweb.com\/en\/funciones-node-js-javascript-realmente-importante\/#POO_surgio_de_funciones\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>. No necesitamos clases y nos ahorramos muchos dolores de cabeza.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Composici\u00f3n<\/h3>\n\n\n\n<p>Es mucho m\u00e1s simple y flexible utilizar funciones en lugar de clases para la composici\u00f3n, tanto de componentes como de cualquier funcionalidad en general.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Better object composition over class inheritance<\/strong><\/p>\n<cite>Design Patterns: Elements of Reusable Object-Oriented Software<\/cite><\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Simplicidad<\/h3>\n\n\n\n<p>Normalmente con las clases, el flujo del c\u00f3digo de los efectos colaterales necesita brincar de un m\u00e9todo del ciclo de vida a otro, con <strong>React Hooks <\/strong>esto es m\u00e1s lineal y f\u00e1cil de leer. Tambi\u00e9n la definici\u00f3n del estado de un componente es mucho m\u00e1s simple, sin necesidad de definirlo en el constructor.&nbsp; En el siguiente punto viene un ejemplo de como los React Hooks son m\u00e1s simples.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Se elimina el uso de componentes de alto nivel<\/h3>\n\n\n\n<p>Aunque los componentes de alto nivel (<strong>HOC<\/strong>) se basan en las funciones de alto nivel, la naturaleza del c\u00f3digo HTML y clases hace que esto sea complejo. El c\u00f3digo se vuelve dif\u00edcil de leer y tambi\u00e9n provoca que los componentes envolventes se aniden demasiado.<\/p>\n\n\n\n<p>Los React Hooks resuelven el famoso <strong>\u201cHOC hell\u201d,<\/strong> muy parecido a como las promesas y funciones as\u00edncronas resuelven el <strong>\u201cCallback hell\u201d<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2021\/10\/hocs-complejo.jpeg\" alt=\"HOCs, complejo\" class=\"wp-image-3058\"\/><figcaption class=\"wp-element-caption\">HOCs, complejo<\/figcaption><\/figure>\n\n\n\n<p>Ahora, si se utilizan React Hooks, esos HOC complejos se convierte en un c\u00f3digo m\u00e1s simple y lineal.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2021\/10\/react-hooks-simple.jpeg\" alt=\"React hooks, simple y lineal\" class=\"wp-image-3060\"\/><figcaption class=\"wp-element-caption\">React hooks, simple y lineal<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">M\u00e1s r\u00e1pido<\/h3>\n\n\n\n<p>Es un hecho que las funciones tienen mayor rendimiento que las clases. En el caso de React, un componente de funci\u00f3n es m\u00e1s r\u00e1pido que un componente de alto nivel. Adem\u00e1s, usando los React hooks adecuadamente, los componentes con React hooks suelen ser m\u00e1s r\u00e1pidos que los componentes de clases en React.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">F\u00e1cil de probar<\/h3>\n\n\n\n<p>Haciendo tus pruebas correctas evitando detalles de implementaci\u00f3n, tu react hook deber\u00eda estar cubierto con tus pruebas del componente funcional. En otras publicaciones veremos c\u00f3mo hacer esto. En caso de que tengas un React Hook complejo, existen herramientas que te facilitan estas pruebas aisladas o tambi\u00e9n podemos hacer a mano nuestro wrapper que use nuestro React Hook para cada uno de sus casos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Las dos reglas importantes de React Hooks<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Solo ejecuta React Hooks en el nivel superior de la funci\u00f3n<\/h3>\n\n\n\n<p>La clave de esta regla es que React depende del orden en que se ejecutan los React Hooks.<\/p>\n\n\n\n<p>No ejecutes React Hooks dentro de condiciones, ciclos o funciones anidadas porque se necesita asegurar el orden correcto de los hooks cada vez que el componente se renderiza. Esto permite que React controle correctamente el estado entre multiples useState y useEffect.<\/p>\n\n\n\n<p>Si existe alguna condici\u00f3n en el c\u00f3digo, y permite que a veces un hook se ejecute y otras no, el orden se pierde al igual que los datos correctos del estado. Hay que aclarar que las condiciones, ciclos y funciones anidadas dentro de los hooks como en el caso de useEffect si son posibles.<\/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=\"\/\/ No hagos esto!!if (nombre) {  useEffect(() =&gt; {    document.title = `Algo con ${nombre}`;  }, [nombre]);}\/\/ Esto si lo puedes haceruseEffect(() =&gt; {  if (nombre !== '') {    document.title = `Algo con ${nombre}`;  }}, [nombre]);\" 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: #464B5D; font-style: italic\">\/\/ No hagos esto!!<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #BABED8\"> (nombre) <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #82AAFF\">useEffect<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #C792EA\">=&gt;<\/span><span style=\"color: #F07178\"> <\/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: #BABED8\">title<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">`<\/span><span style=\"color: #C3E88D\">Algo con <\/span><span style=\"color: #89DDFF\">${<\/span><span style=\"color: #BABED8\">name<\/span><span style=\"color: #89DDFF\">}`<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #89DDFF\">},<\/span><span style=\"color: #F07178\"> [<\/span><span style=\"color: #BABED8\">name<\/span><span style=\"color: #F07178\">])<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #464B5D; font-style: italic\">\/\/ Esto si lo puedes hacer<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">useEffect<\/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: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #F07178\"> (<\/span><span style=\"color: #BABED8\">name<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">!==<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">&#39;&#39;<\/span><span style=\"color: #F07178\">) <\/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: #BABED8\">title<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">`<\/span><span style=\"color: #C3E88D\">Algo con <\/span><span style=\"color: #89DDFF\">${<\/span><span style=\"color: #BABED8\">name<\/span><span style=\"color: #89DDFF\">}`<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">},<\/span><span style=\"color: #BABED8\"> [nombre])<\/span><span style=\"color: #89DDFF\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Solo ejecuta React Hooks dentro de funciones de React<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Ejecuta React Hooks dentro de componentes de funci\u00f3n.\n<ol class=\"wp-block-list\">\n<li>En las clases los React Hooks no funcionan, adem\u00e1s en clases ya existen los m\u00e9todos del ciclo de vida de un componente en React.<\/li>\n<\/ol>\n<\/li>\n\n\n\n<li>Ejecuta React Hooks dentro de otros React Hooks (puedes hacer tus propios hooks).\n<ol class=\"wp-block-list\">\n<li>Para garantizar el orden y controlar correctamente el estado entre m\u00faltiples Hooks. Te permite ejecutar react hooks al inicio de otro hook creado por ti.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Reac Hooks, useState(initialState)<\/h2>\n\n\n\n<p>Empecemos con el hook m\u00e1s utilizado, <code><strong>useState<\/strong><\/code>. Este hook proporciona la misma capacidad de los componentes de clases para tener un estado interno. Vamos a hacer un formulario de registro de un usuario nuevo, algo sencillo y gen\u00e9rico, nada de detalles de implementaci\u00f3n espec\u00edficos. Probablemente con el campo nombre ser\u00e1 suficiente.<\/p>\n\n\n\n<p>Vamos a utilizar la herramienta de <a href=\"https:\/\/codesandbox.io\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">codesandbox.io<\/a>, usando la plantilla de React. Agregamos un archivo <code>RegistroDeUsuario.js<\/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=\"import { useState } from &quot;react&quot;;export default function RegistroDeUsuario() {  const [nombre, setNombre] = useState(&quot;&quot;);  return (    &lt;form&gt;      &lt;label htmlFor=&quot;nombre&quot;&gt;Nombre&lt;\/label&gt;      &lt;input        type=&quot;text&quot;        value={nombre}        id=&quot;nombre&quot;        onChange={(e) =&gt; setNombre(e.target.value)}      \/&gt;      &lt;button type=&quot;submit&quot;&gt;Enviar&lt;\/button&gt;      &lt;section&gt;{nombre}&lt;\/section&gt;    &lt;\/form&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; font-style: italic\">import<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">useState<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">from<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">react<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">export<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">default<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">functions<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">RegistroDeUsuario<\/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: #C792EA\">const<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">[<\/span><span style=\"color: #BABED8\">name<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">setNombre<\/span><span style=\"color: #89DDFF\">]<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">useState<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">&quot;&quot;<\/span><span style=\"color: #F07178\">)<\/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>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">form<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">      <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">label<\/span><span style=\"color: #89DDFF\"> <\/span><span style=\"color: #C792EA\">htmlFor<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">name<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #BABED8\">Name<\/span><span style=\"color: #89DDFF\">&lt;\/<\/span><span style=\"color: #F07178\">label<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">      <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">input<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #C792EA\">type<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">text<\/span><span style=\"color: #89DDFF\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #C792EA\">value<\/span><span style=\"color: #89DDFF\">={<\/span><span style=\"color: #BABED8\">name<\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><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\">name<\/span><span style=\"color: #89DDFF\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #C792EA\">onChange<\/span><span style=\"color: #89DDFF\">={(<\/span><span style=\"color: #BABED8; font-style: italic\">and<\/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: #82AAFF\">setNombre<\/span><span style=\"color: #BABED8\">(e<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">target<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">value)<\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">      \/&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">      <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">button<\/span><span style=\"color: #89DDFF\"> <\/span><span style=\"color: #C792EA\">type<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">submit<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #BABED8\">Send<\/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: #BABED8\">      <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">section<\/span><span style=\"color: #89DDFF\">&gt;{<\/span><span style=\"color: #BABED8\">name<\/span><span style=\"color: #89DDFF\">}&lt;\/<\/span><span style=\"color: #F07178\">section<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #89DDFF\">&lt;\/<\/span><span style=\"color: #F07178\">form<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><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>Y en el archivo <code>App.js<\/code> importamos el componente <code>RegistroDeUsuario<\/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=\"import RegistroDeUsuario from &quot;.\/RegistroDeUsuario&quot;;export default function App() {  return (    &lt;div className=&quot;App&quot;&gt;      &lt;RegistroDeUsuario \/&gt;    &lt;\/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; font-style: italic\">import<\/span><span style=\"color: #BABED8\"> RegistroDeUsuario <\/span><span style=\"color: #89DDFF; font-style: italic\">from<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">.\/RegistroDeUsuario<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">export<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">default<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">functions<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">App<\/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: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #F07178\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">div<\/span><span style=\"color: #89DDFF\"> <\/span><span style=\"color: #C792EA\">className<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">App<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">      <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #FFCB6B\">RegistroDeUsuario<\/span><span style=\"color: #89DDFF\"> \/&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #89DDFF\">&lt;\/<\/span><span style=\"color: #F07178\">div<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><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<h3 class=\"wp-block-heading\">Desctructuring assignment<\/h3>\n\n\n\n<p>Primero, la funci\u00f3n <code><strong>useState(initialState)<\/strong><\/code>, regresa un arreglo de dos elementos, el valor del estado (inicializado) que queremos controlar y un m\u00e9todo para modificar ese estado. Este par de valores se asignaron a las constantes <code>name<\/code> and <code>setNombre<\/code> con la sintaxis de <code>destructuring assignment<\/code>.<\/p>\n\n\n\n<p>He <code>desctructuring assignment<\/code> de la l\u00ednea 4 se traduce a lo siguiente.<\/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 statePair = useState('');const nombre = statePair[0];const setNombre = statePair[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: #C792EA\">const<\/span><span style=\"color: #BABED8\"> statePair <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">useState<\/span><span style=\"color: #BABED8\">(<\/span><span style=\"color: #89DDFF\">&#39;&#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\"> name <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> statePair[<\/span><span style=\"color: #F78C6C\">0<\/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\"> setNombre <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> statePair[<\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #BABED8\">]<\/span><span style=\"color: #89DDFF\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Invocaciones y renderizados<\/h3>\n\n\n\n<p>Cada vez que se escribe sobre el campo <strong>Name<\/strong>, se vuelve a renderizar el componente. Pero React guarda el estado entre renderizados. Se puede notar como la l\u00ednea <code>5<\/code> se ejecuta al primer r\u00e9nder (<strong>Montar<\/strong>, con texto vac\u00edo) y tambi\u00e9n cada vez que se actualiza el valor de <code>name<\/code> (<strong>Actualizar<\/strong>, revisa la consola de la parte derecha de la imagen de abajo).<\/p>\n\n\n\n<p>El resultado debe ser algo como lo siguiente.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2021\/10\/useState-input-nombre-renders.jpg\" alt=\"Renderizados por useState input Nombre\" class=\"wp-image-3003\"\/><figcaption class=\"wp-element-caption\">Renderizados por useState input Nombre<\/figcaption><\/figure>\n\n\n\n<p>El flujo de <strong>useState<\/strong> es el siguiente. Modificado de este <a href=\"https:\/\/github.com\/donavon\/hook-flow\" target=\"_blank\" rel=\"noreferrer noopener\">original<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2021\/10\/flujo-useState.png\" alt=\"Flujo useState\" class=\"wp-image-3026\"\/><figcaption class=\"wp-element-caption\">Flujo useState<\/figcaption><\/figure>\n\n\n\n<p>El valor de <code><strong>name<\/strong><\/code> se actualiza a trav\u00e9s del evento <code><strong>onChange<\/strong><\/code> and the method <code><strong>setNombre<\/strong><\/code>. Al modificar este estado interno, provoca la ejecuci\u00f3n de la funci\u00f3n <code>RegistroDeUsuarios<\/code> y un &#8220;re-renderizado&#8221;. Si el componente se renderiza debido a un cambio a otro estado u otra propiedad, el estado de <code><strong>name<\/strong><\/code> permanece con la \u00faltima actualizaci\u00f3n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">useState(() =&gt; { return initialState; })<\/h3>\n\n\n\n<p><code><strong>useState(initialState)<\/strong><\/code> puede recibir una funci\u00f3n que regrese el estado inicial usado en el primer render. Un ejemplo de su uso es el que sige, \u00bfQu\u00e9 podemos hacer si queremos guardar y obtener el estado de localStorage?<\/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=\"import { useState } from &quot;react&quot;;export default function RegistroDeUsuario() {  const [nombre, setNombre] = useState(() =&gt; {    console.log(&quot;Solo una vez&quot;);    return localStorage.getItem(&quot;nombre&quot;) || &quot;&quot;;  });  console.log(&quot;M\u00e1s invocaciones&quot;);  function actualizarNombre(e) {    setNombre(e.target.value);    localStorage.setItem(&quot;nombre&quot;, e.target.value);  }  return (    &lt;form&gt;      &lt;label htmlFor=&quot;nombre&quot;&gt;Nombre&lt;\/label&gt;      &lt;input        type=&quot;text&quot;        value={nombre}        id=&quot;nombre&quot;        onChange={actualizarNombre}      \/&gt;      &lt;button type=&quot;submit&quot;&gt;Enviar&lt;\/button&gt;      &lt;section&gt;{nombre}&lt;\/section&gt;    &lt;\/form&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; font-style: italic\">import<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">useState<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">from<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">react<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">export<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">default<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">functions<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">RegistroDeUsuario<\/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: #C792EA\">const<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">[<\/span><span style=\"color: #BABED8\">name<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">setNombre<\/span><span style=\"color: #89DDFF\">]<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">useState<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #C792EA\">=&gt;<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #BABED8\">console<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">log<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Solo una vez<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #F07178\">)<\/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\">localStorage<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">getItem<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">name<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #F07178\">) <\/span><span style=\"color: #89DDFF\">||<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">&quot;&quot;<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #BABED8\">console<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">log<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">M\u00e1s invocaciones<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #C792EA\">functions<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">actualizarNombre<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8; font-style: italic\">and<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #82AAFF\">setNombre<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">and<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">target<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">value<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #BABED8\">localStorage<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">setItem<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">name<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">and<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">target<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">value<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/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>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">form<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">      <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">label<\/span><span style=\"color: #89DDFF\"> <\/span><span style=\"color: #C792EA\">htmlFor<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">name<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #BABED8\">Name<\/span><span style=\"color: #89DDFF\">&lt;\/<\/span><span style=\"color: #F07178\">label<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">      <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">input<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #C792EA\">type<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">text<\/span><span style=\"color: #89DDFF\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #C792EA\">value<\/span><span style=\"color: #89DDFF\">={<\/span><span style=\"color: #BABED8\">name<\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><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\">name<\/span><span style=\"color: #89DDFF\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #C792EA\">onChange<\/span><span style=\"color: #89DDFF\">={<\/span><span style=\"color: #BABED8\">actualizarNombre<\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">      \/&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">      <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">button<\/span><span style=\"color: #89DDFF\"> <\/span><span style=\"color: #C792EA\">type<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">submit<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #BABED8\">Send<\/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: #BABED8\">      <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">section<\/span><span style=\"color: #89DDFF\">&gt;{<\/span><span style=\"color: #BABED8\">name<\/span><span style=\"color: #89DDFF\">}&lt;\/<\/span><span style=\"color: #F07178\">section<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #89DDFF\">&lt;\/<\/span><span style=\"color: #F07178\">form<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><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>Ahora usamos una funci\u00f3n para definir el estado, le agregamos un <code>console.log('Solo una vez')<\/code> para demostrar que la funci\u00f3n solo se ejecuta una vez.  Y un <code>console.log('M\u00e1s invocaciones')<\/code>  para demostrar que en los siguientes invocaciones ya no se ejecuta la funci\u00f3n de nuestro <code>useState(initialState)<\/code>, pero si el de <code>M\u00e1s invocaciones.<\/code><\/p>\n\n\n\n<p>En el resultado de abajo, escrib\u00ed <code>Jaime<\/code> en el campo nombre, luego recargue la p\u00e1gina, revisa el lado derecho en la vista y la consola.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2021\/10\/useState-campo-nombre-localStorage.jpg\" alt=\"useState, campo nombre en localStorage\" class=\"wp-image-3006\"\/><figcaption class=\"wp-element-caption\">useState, campo nombre en localStorage<\/figcaption><\/figure>\n\n\n\n<p>Al recargar se imprime <code><strong>Sola una vez<\/strong><\/code> y al empezar a escribir <code><strong>Cervantes<\/strong><\/code> se imprime <strong><code>M\u00e1s invocaciones<\/code><\/strong> un total de 11 veces. Mi nombre <strong>James<\/strong>, lo obtuvo del <strong>localStorage<\/strong> al primer renderizado.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">setState(prevState =&gt; {})<\/h3>\n\n\n\n<p>El m\u00e9todo para actualizar el estado <code><strong>setNombre<\/strong><\/code> tambi\u00e9n puede recibir una funci\u00f3n, cuyo par\u00e1metro es el valor anterior. Veamos un ejemplo modificando la funci\u00f3n <code><strong>actualizarNombre<\/strong><\/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 actualizarNombre(e) {  setNombre(nombreAnterior =&gt; {    console.log(nombreAnterior); \/\/ '', 'J', 'Ja', 'Jai', 'Jaim'    return e.target.value;  });  localStorage.setItem(&quot;nombre&quot;, e.target.value);}\" 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\">actualizarNombre<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8; font-style: italic\">and<\/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: #82AAFF\">setNombre<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8; font-style: italic\">nombreAnterior<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #C792EA\">=&gt;<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #BABED8\">console<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">log<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">nombreAnterior<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #464B5D; font-style: italic\">\/\/ &#39;&#39;, &#39;J&#39;, &#39;Ja&#39;, &#39;Jai&#39;, &#39;Jaim&#39;<\/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\">and<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">target<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">value<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #BABED8\">localStorage<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">setItem<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">name<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">and<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">target<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">value<\/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>The function <code><strong>setNombre<\/strong><\/code> obtenida de <strong><code>useState<\/code><\/strong> recibe como par\u00e1metro el <code><strong>nombreAnterior<\/strong><\/code>, y al imprimir en la consola nos damos cuenta de que siempre imprimir\u00e1 el valor anterior del estado <code><strong>name<\/strong><\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2021\/10\/actualizar-state-funcion.jpg\" alt=\"Actualizar state pasando una funci\u00f3n\" class=\"wp-image-3008\"\/><figcaption class=\"wp-element-caption\">Actualizar el estado pasando una funci\u00f3n<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">useEffect(effectFn, [deps])<\/h2>\n\n\n\n<p>Este React hook, <strong>useEffect<\/strong>, nos permite ejecutar y controlar efectos colaterales, como pueden ser peticiones a servicios, subscribirse a eventos, modificar el DOM o cualquier funcionalidad que no pueda ejecutarse en el cuerpo de nuestro componente funci\u00f3n porque no pertenece al flujo lineal del mismo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Flujo de useEffect<\/h3>\n\n\n\n<p>The function <strong>effectFn<\/strong> se ejecuta despu\u00e9s de que el navegador ya ha pintado el componente en pantalla por primera vez (<strong>montar<\/strong>). Tambi\u00e9n por defecto despu\u00e9s de cada posterior repintado (<strong>actualizar<\/strong>). Este comportamiento descrito tiene el mismo prop\u00f3sito que los m\u00e9todos <code><strong>componentDidMount<\/strong><\/code> and <code><strong>componentDidUpdate<\/strong><\/code>.<\/p>\n\n\n\n<p>El tercer prop\u00f3sito en useEffect se le llama <strong>limpieza<\/strong>, el cual lo podemos comparar con <code><strong>componentDidUnmount<\/strong><\/code>. En el primer pintado (<strong>montar<\/strong>) la funci\u00f3n de limpieza no se ejecuta, solo se ejecuta en la fase de <strong>actualizar<\/strong>. Es decir, se ejecuta despu\u00e9s de cada repintando, pero antes del que el cuerpo de useEffect se ejecute. Este caso en espec\u00edfico se explica mejor con ejemplos en<a href=\"https:\/\/pensemosweb.com\/en\/react-hooks-personalizados-useeffect\/\" target=\"_blank\" rel=\"noreferrer noopener\"> <strong>this post<\/strong><\/a>.<\/p>\n\n\n\n<p>El flujo de <strong>useEffect<\/strong> es el siguiente. Modificado de este <a href=\"https:\/\/github.com\/donavon\/hook-flow\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">original<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2021\/10\/flujo-useEffect-renderizado-pintado.png\" alt=\"Flujo useEffect\" class=\"wp-image-3021\"\/><figcaption class=\"wp-element-caption\">Flujo useEffect<\/figcaption><\/figure>\n\n\n\n<p><strong>useEffect<\/strong> recibe un segundo par\u00e1metro, <strong>deps<\/strong>, el cual es un Array con la lista de dependencias que permiten decidir si ejecutar el efecto colateral o no, despu\u00e9s de cada repintado. Sirve bastante para mejorar el rendimiento si no queremos que despu\u00e9s de cada repintado se ejecute <strong>effectFn<\/strong>.<\/p>\n\n\n\n<p>Si te das cuenta, he usado la palabra <strong>pintado<\/strong> en lugar de <strong>renderizado<\/strong>. Esto se debe a que efectivamente el efecto se ejecuta despu\u00e9s de que los cambios ya est\u00e9n pintados en el navegador web. El renderizado involucra al <strong>Virtual DOM<\/strong>, y React decide en que momento es conveniente actualizar el DOM, pero el pintado sucede un poco despu\u00e9s de lo anterior. Aclaremos que aunque se actualice el DOM, el navegador debe calcular estilos y el layout de los elementos para posteriormente realizar el pintado de los pixeles.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">useEffect(effectFn)<\/h3>\n\n\n\n<p>Veamos un ejemplo, aqu\u00ed la idea es tener un input de b\u00fasqueda y queremos que lo que tengamos en el input se imprima en t\u00edtulo de la pesta\u00f1a de nuestro navegador web. Para poder realizar esto necesitamos un efecto utilizando la API del DOM.<\/p>\n\n\n\n<p>De nuevo, con la herramienta <a href=\"https:\/\/codesandbox.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">codesandbox.io<\/a> y su plantilla de react, creamos un nuevo proyecto. Agregamos un archivo llamado <code><strong>OldNewsPapers.js<\/strong><\/code> donde vivir\u00e1 nuestra funcionalidad en forma de un componente funcional.<\/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=\"import { useEffect, useState } from &quot;react&quot;;export default function OldNewsPapers() {  const [query, setQuery] = useState(&quot;&quot;);  useEffect(() =&gt; {    console.log(&quot;document.title&quot;);    document.title = `Periodicos viejos ${query}`;  });  console.log('Invocaci\u00f3n);  return (    &lt;&gt;      &lt;h1&gt;Peri\u00f3dicos viejos que contienen {query}&lt;\/h1&gt;      &lt;form&gt;        &lt;input          type=&quot;text&quot;          value={query}          onChange={(e) =&gt; setQuery(e.target.value)}        \/&gt;      &lt;\/form&gt;    &lt;\/&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; font-style: italic\">import<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">useEffect<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">useState<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">from<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">react<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">export<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">default<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">functions<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">OldNewsPapers<\/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: #C792EA\">const<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">[<\/span><span style=\"color: #BABED8\">query<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">setQuery<\/span><span style=\"color: #89DDFF\">]<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">useState<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">&quot;&quot;<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #82AAFF\">useEffect<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #C792EA\">=&gt;<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #BABED8\">console<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">log<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">document.title<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #F07178\">)<\/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: #BABED8\">title<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">`<\/span><span style=\"color: #C3E88D\">Periodicos viejos <\/span><span style=\"color: #89DDFF\">${<\/span><span style=\"color: #BABED8\">query<\/span><span style=\"color: #89DDFF\">}`<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #BABED8\">console<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">log<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Invocaci\u00f3n);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #82AAFF\">return<\/span><span style=\"color: #F07178\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF\">&lt;&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">      <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">h1<\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #BABED8\">Peri\u00f3dicos viejos que contienen <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #BABED8\">query<\/span><span style=\"color: #89DDFF\">}&lt;\/<\/span><span style=\"color: #F07178\">h1<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">      <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">form<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">        <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">input<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">          <\/span><span style=\"color: #C792EA\">type<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">text<\/span><span style=\"color: #89DDFF\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">          <\/span><span style=\"color: #C792EA\">value<\/span><span style=\"color: #89DDFF\">={<\/span><span style=\"color: #BABED8\">query<\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">          <\/span><span style=\"color: #C792EA\">onChange<\/span><span style=\"color: #89DDFF\">={(<\/span><span style=\"color: #BABED8; font-style: italic\">and<\/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: #82AAFF\">setQuery<\/span><span style=\"color: #BABED8\">(e<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">target<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">value)<\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        \/&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">      <\/span><span style=\"color: #89DDFF\">&lt;\/<\/span><span style=\"color: #F07178\">form<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #89DDFF\">&lt;\/&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  );<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Este efecto se ejecuta despu\u00e9s de la primera vez que se pinta el componente, esto es el primer prop\u00f3sito que se puede comparar con <strong><code>componentDidMount<\/code><\/strong>. \u00bfC\u00f3mo es el flujo?<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Se ejecuta la funci\u00f3n, es decir, el componente funcional.\n<ol class=\"wp-block-list\">\n<li>Lo cual inicializa el estado de <code>query<\/code> y el efecto colateral.<\/li>\n<\/ol>\n<\/li>\n\n\n\n<li>Se renderiza y se pinta el elemento de react en el navegador con el valor inicial de <code>query = ''<\/code>.\n<ol class=\"wp-block-list\">\n<li>Texto \u201cPeri\u00f3dicos viejos que contienen\u201d en el <code>&lt;h1&gt;<\/code>.<\/li>\n<\/ol>\n<\/li>\n\n\n\n<li>Se ejecuta el efecto colateral despu\u00e9s del primer pintado.\n<ol class=\"wp-block-list\">\n<li>Texto <strong>\u201cPeri\u00f3dicos viejos que\u201d<\/strong>  en el t\u00edtulo de la pesta\u00f1a.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2021\/10\/useEffect-flujo-inicial-console.jpg\" alt=\"useEffect flujo al montar\" class=\"wp-image-3015\"\/><figcaption class=\"wp-element-caption\">useEffect flujo al montar<\/figcaption><\/figure>\n\n\n\n<p>Si escribimos <strong>&#8220;texas&#8221;<\/strong> en el input, ahora el flujo es de la siguiente manera<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Cada vez que se introduce una letra en el input (cinco veces m\u00e1s, por las cinco letras de \u201c<strong>texas\u201d<\/strong>)\n<ol class=\"wp-block-list\">\n<li>El estado de <code>query<\/code> cambia debido al <code>setQuery<\/code> en el <strong>onChange<\/strong>, provocando un nuevo pintado (invocaci\u00f3n del componente funci\u00f3n, renderizado y finalmente pintado).<\/li>\n\n\n\n<li>Despu\u00e9s del pintado se actualiza <code>document.title<\/code>, cambiando el t\u00edtulo de la pesta\u00f1a del navegador web.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2021\/10\/useEffect-flujo-actualizar-console.jpg\" alt=\"useEffect, flujo actualizar document.title\" class=\"wp-image-3018\"\/><figcaption class=\"wp-element-caption\">useEffect, flujo actualizar document.title<\/figcaption><\/figure>\n\n\n\n<p>En la imagen de arriba vemos seis \u201cdocument.title\u201d, como describimos al principio, <strong>por defecto el useEffect se invoca despu\u00e9s de cada pintado en el navegador web.<\/strong><\/p>\n\n\n\n<p>Puedes ver el c\u00f3digo completo en <a href=\"https:\/\/codesandbox.io\/s\/useeffect-kqhzq?file=\/src\/OldNewsPapers.js\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">useEffect(effectFn, [deps])<\/h3>\n\n\n\n<p>En el \u00faltimo ejemplo nuestro efecto se va a ejecutar despu\u00e9s de cada pintado, incluso si el estado de <code>query<\/code> no ha cambiado. Para comprobar esto vamos a agregar otro estado para llevar la cuenta del n\u00famero de invocaciones de nuestro componente funcional, que se traduce en el n\u00famero de renderizados realizados. Estas invocaciones las haremos a trav\u00e9s de un bot\u00f3n.<\/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=\"import { useEffect, useState } from &quot;react&quot;;export default function OldNewsPapers() {  const [query, setQuery] = useState(&quot;&quot;);  const [invocations, setInvocations] = useState(1);  useEffect(() =&gt; {    console.log(&quot;document.title&quot;);    document.title = `Peri\u00f3dicos viejos ${query}`;  });  return (    &lt;&gt;      &lt;h1&gt;Peri\u00f3dicos viejos que contienen {query}&lt;\/h1&gt;      &lt;p&gt;{invocations} Invocaciones&lt;\/p&gt;      &lt;form&gt;        &lt;input          type=&quot;text&quot;          value={query}          onChange={(e) =&gt; setQuery(e.target.value)}        \/&gt;        &lt;button          onClick={(e) =&gt; {            e.preventDefault();            setInvocations((prev) =&gt; prev + 1);          }}        &gt;          Invocar        &lt;\/button&gt;      &lt;\/form&gt;    &lt;\/&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; font-style: italic\">import<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">useEffect<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">useState<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">from<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">react<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">export<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">default<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">functions<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">OldNewsPapers<\/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: #C792EA\">const<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">[<\/span><span style=\"color: #BABED8\">query<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">setQuery<\/span><span style=\"color: #89DDFF\">]<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">useState<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">&quot;&quot;<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #C792EA\">const<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">[<\/span><span style=\"color: #BABED8\">invocations<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">setInvocations<\/span><span style=\"color: #89DDFF\">]<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">useState<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #82AAFF\">useEffect<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #C792EA\">=&gt;<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #BABED8\">console<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">log<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">document.title<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #F07178\">)<\/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: #BABED8\">title<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">`<\/span><span style=\"color: #C3E88D\">Peri\u00f3dicos viejos <\/span><span style=\"color: #89DDFF\">${<\/span><span style=\"color: #BABED8\">query<\/span><span style=\"color: #89DDFF\">}`<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #F07178\">)<\/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>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF\">&lt;&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">      <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">h1<\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #BABED8\">Peri\u00f3dicos viejos que contienen <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #BABED8\">query<\/span><span style=\"color: #89DDFF\">}&lt;\/<\/span><span style=\"color: #F07178\">h1<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">      <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">p<\/span><span style=\"color: #89DDFF\">&gt;{<\/span><span style=\"color: #BABED8\">invocations<\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #BABED8\"> Invocaciones<\/span><span style=\"color: #89DDFF\">&lt;\/<\/span><span style=\"color: #F07178\">p<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">      <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">form<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">        <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">input<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">          <\/span><span style=\"color: #C792EA\">type<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">text<\/span><span style=\"color: #89DDFF\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">          <\/span><span style=\"color: #C792EA\">value<\/span><span style=\"color: #89DDFF\">={<\/span><span style=\"color: #BABED8\">query<\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">          <\/span><span style=\"color: #C792EA\">onChange<\/span><span style=\"color: #89DDFF\">={(<\/span><span style=\"color: #BABED8; font-style: italic\">and<\/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: #82AAFF\">setQuery<\/span><span style=\"color: #BABED8\">(e<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">target<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">value)<\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        \/&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">        <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">button<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">          <\/span><span style=\"color: #C792EA\">onClick<\/span><span style=\"color: #89DDFF\">={(<\/span><span style=\"color: #BABED8; font-style: italic\">and<\/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\">and<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">preventDefault<\/span><span style=\"color: #F07178\">()<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">            <\/span><span style=\"color: #82AAFF\">setInvocations<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8; font-style: italic\">prev<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #C792EA\">=&gt;<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">prev<\/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: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">          <\/span><span style=\"color: #89DDFF\">}}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        &gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">          Invocar<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">        <\/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: #BABED8\">      <\/span><span style=\"color: #89DDFF\">&lt;\/<\/span><span style=\"color: #F07178\">form<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #89DDFF\">&lt;\/&gt;<\/span><\/span>\n<span class=\"line\"><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>Inicializamos <strong><code>invocations<\/code><\/strong> con <code><strong>1<\/strong><\/code>, porque la primera vez que se renderiza ser\u00e1 el estado actual. Luego si oprimimos el bot\u00f3n <strong>Invocar<\/strong>, se cambia el valor de <strong><code>invocations<\/code><\/strong>, se hace otro re-renderizado, y luego se vuelve a ejecutar nuestro efecto, incluso cuando <strong><code>query<\/code><\/strong> no ha cambiado.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2021\/10\/useEffect-por-defecto.jpg\" alt=\"useEffect por defecto siempre se ejecuta despu\u00e9s de cada pintado\" class=\"wp-image-3023\"\/><figcaption class=\"wp-element-caption\">useEffect por defecto siempre se ejecuta despu\u00e9s de cada pintado<\/figcaption><\/figure>\n\n\n\n<p>Para evitar que se ejecute demasiadas veces nuestro efecto, podemos indicarle que corra solo cuando una de sus dependencias ha cambiado. En este caso para evitar que se le asigne a cada rato el valor a <code><strong>documen.title<\/strong><\/code>, le indicamos que solo lo haga cuando <code><strong>query<\/strong><\/code> cambia.<\/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=\"import { useEffect, useState } from &quot;react&quot;;export default function OldNewsPapers() {  const [query, setQuery] = useState(&quot;&quot;);  const [invocations, setInvocations] = useState(1);  useEffect(() =&gt; {    console.log(&quot;document.title&quot;);    document.title = `Peri\u00f3dicos viejos ${query}`;  }, [query]);  return ( ... );}\" 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\">import<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">useEffect<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">useState<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">from<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">react<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">export<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">default<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">functions<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">OldNewsPapers<\/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: #C792EA\">const<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">[<\/span><span style=\"color: #BABED8\">query<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">setQuery<\/span><span style=\"color: #89DDFF\">]<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">useState<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">&quot;&quot;<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #C792EA\">const<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">[<\/span><span style=\"color: #BABED8\">invocations<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">setInvocations<\/span><span style=\"color: #89DDFF\">]<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">useState<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #82AAFF\">useEffect<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #C792EA\">=&gt;<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #BABED8\">console<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">log<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">document.title<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #F07178\">)<\/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: #BABED8\">title<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">`<\/span><span style=\"color: #C3E88D\">Peri\u00f3dicos viejos <\/span><span style=\"color: #89DDFF\">${<\/span><span style=\"color: #BABED8\">query<\/span><span style=\"color: #89DDFF\">}`<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #89DDFF\">},<\/span><span style=\"color: #F07178\"> [<\/span><span style=\"color: #BABED8\">query<\/span><span style=\"color: #F07178\">])<\/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: #89DDFF\">...<\/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>Ahora podemos ver que aunque hicimos muchas invocaciones con el bot\u00f3n \u201cinvocar\u201d, <code><strong>document.title<\/strong><\/code> solo se ejecut\u00f3 la primera vez.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2021\/10\/useEffect-deps-query.jpg\" alt=\"useEffect ejecutar solo cuando alguna &quot;dep&quot; cambie\" class=\"wp-image-3024\"\/><figcaption class=\"wp-element-caption\">useEffect se ejecuta solo cuando alguna &#8220;deps&#8221; cambie<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">useEffect(effectFn, [])<\/h3>\n\n\n\n<p>Cuando se especifica un Array vac\u00edo en las <strong>deps<\/strong>, effectFn solo se ejecuta una sola vez, despu\u00e9s del primer pintado.<\/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=\"import { useEffect, useState } from &quot;react&quot;;export default function OldNewsPapers() {  const [query, setQuery] = useState(&quot;&quot;);  const [invocations, setInvocations] = useState(1);  useEffect(() =&gt; {    console.log(&quot;document.title&quot;);    document.title = `Peri\u00f3dicos viejos ${query}`;  }, []);  return ( ... );}\" 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\">import<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">useEffect<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">useState<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">from<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">react<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">export<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">default<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">functions<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">OldNewsPapers<\/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: #C792EA\">const<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">[<\/span><span style=\"color: #BABED8\">query<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">setQuery<\/span><span style=\"color: #89DDFF\">]<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">useState<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">&quot;&quot;<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #C792EA\">const<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">[<\/span><span style=\"color: #BABED8\">invocations<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">setInvocations<\/span><span style=\"color: #89DDFF\">]<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">useState<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #82AAFF\">useEffect<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #C792EA\">=&gt;<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #BABED8\">console<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">log<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">document.title<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #F07178\">)<\/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: #BABED8\">title<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">`<\/span><span style=\"color: #C3E88D\">Peri\u00f3dicos viejos <\/span><span style=\"color: #89DDFF\">${<\/span><span style=\"color: #BABED8\">query<\/span><span style=\"color: #89DDFF\">}`<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #89DDFF\">},<\/span><span style=\"color: #F07178\"> [])<\/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: #89DDFF\">...<\/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>Las siguientes veces que se actualice <code><strong>query<\/strong><\/code> escribiendo en el input, el t\u00edtulo de la pesta\u00f1a ya no se actualiza.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2021\/10\/useEffect-deps-vacio.jpg\" alt=\"useEffect con deps vac\u00edo\" class=\"wp-image-3028\"\/><figcaption class=\"wp-element-caption\">useEffect con deps vac\u00edo<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n sobre<\/h2>\n\n\n\n<p>Las funciones han existido desde mucho antes de la programaci\u00f3n, gracias al c\u00e1lculo lambda de Alonzo Church. No es extra\u00f1o que en los \u00faltimos a\u00f1os el desarrollo de software ha volteado hacia la <a href=\"https:\/\/pensemosweb.com\/en\/introduccion-programacion-funcional\/\" target=\"_blank\" rel=\"noreferrer noopener\">functional programming<\/a> debido a la simplicidad y el poder expresivo. Resolviendo varios problemas en el camino. <\/p>\n\n\n\n<p>Y bueno, con el uso de React Hooks, se ha dado un paso muy importante debido a los beneficios que es programar de esta manera, desde hace a\u00f1os que se utilizaban componentes funcionales, y ahora con esto creo que React tiene m\u00e1s futuro prometedor por delante.<\/p>\n\n\n\n<p>Hemos entendido, con suficiente profundidad (para comenzar con hooks), como funcionan los flujos de los Hooks <strong>useState y useEffect<\/strong>. De <strong>useEffect<\/strong> a\u00fan quedan temas por ver, as\u00ed como tambi\u00e9n los React Hooks personalizados. <strong>Aqu\u00ed<\/strong> pondr\u00e9 el enlace con los temas pendientes, cuando estos est\u00e9n publicados. Cualquier duda, no dudes en escribirla en los comentarios, \u00a1Estaremos contentos de ayudarte!.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">References<\/h2>\n\n\n\n<p><a href=\"https:\/\/reactjs.org\/docs\/hooks-intro.html\">https:\/\/reactjs.org\/docs\/hooks-intro.html<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/reactjs.org\/docs\/hooks-state.html\">https:\/\/reactjs.org\/docs\/hooks-state.html<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/reactjs.org\/docs\/hooks-effect.html\">https:\/\/reactjs.org\/docs\/hooks-effect.html<\/a><\/p>\n\n\n\n<p>Foto de fondo de portada por  <a href=\"https:\/\/unsplash.com\/@sapegin?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\">Artem Sapegin<\/a> in <a href=\"https:\/\/unsplash.com\/s\/photos\/react?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\">Unsplash<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>\u00bfQu\u00e9 son los React Hooks? Los React Hooks, son funciones que se ejecutan en un determinado punto en la vida de un componente funcional. Permiten usar caracter\u00edsticas de React, sin la necesidad de usar clases. Por ejemplo te permite agregar state a un componente funcional. Tambi\u00e9n permite controlar efectos colaterales en caso de ser necesarios. [&hellip;]<\/p>","protected":false},"author":2,"featured_media":3715,"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,35],"tags":[42,54,73,74],"class_list":["post-2998","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript","category-react","tag-componentes-web","tag-javascript","tag-react","tag-react-hooks"],"_links":{"self":[{"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/posts\/2998","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=2998"}],"version-history":[{"count":2,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/posts\/2998\/revisions"}],"predecessor-version":[{"id":3802,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/posts\/2998\/revisions\/3802"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/media\/3715"}],"wp:attachment":[{"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/media?parent=2998"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/categories?post=2998"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/tags?post=2998"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}