{"id":3025,"date":"2021-10-25T12:41:38","date_gmt":"2021-10-25T17:41:38","guid":{"rendered":"https:\/\/www.pensemosweb.com\/?p=3025"},"modified":"2024-04-02T17:29:40","modified_gmt":"2024-04-02T23:29:40","slug":"useeffect-react-hooks-personalizados","status":"publish","type":"post","link":"https:\/\/pensemosweb.com\/en\/useeffect-react-hooks-personalizados\/","title":{"rendered":"Custom React Hooks with useEffect"},"content":{"rendered":"<p>Ya se explic\u00f3 como usar <strong>useEffect<\/strong> in <a href=\"https:\/\/pensemosweb.com\/en\/react-hooks-usestate-y-useeffect\/\" target=\"_blank\" rel=\"noreferrer noopener\">esta<\/a> <a href=\"https:\/\/pensemosweb.com\/en\/react-hooks-usestate-y-useeffect\/\" target=\"_blank\" rel=\"noreferrer noopener\">publicaci\u00f3n<\/a>, sin embargo a\u00fan queda una variante muy importante que de hecho es la variante m\u00e1s compleja, por esta raz\u00f3n merece ser parte de este contenido. <\/p>\n\n\n\n<p>Inicialmente crearemos un ejemplo con esta forma de <strong>useEffect<\/strong>, la cual tendr\u00e1 una funci\u00f3n de retorno que sirve para hacer limpieza, llamaremos <strong>limpieza<\/strong>  a esta funci\u00f3n a lo largo de todo el contenido. Adicionalmente, crearemos dos React hooks personalizados para extraer la funcionalidad de la variante limpieza en piezas m\u00e1s peque\u00f1as.<\/p>\n\n\n\n<p>Como recordatorio, <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 de manera imperativa.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Recordando el flujo de useEffect(effectFn, [deps])<\/h2>\n\n\n\n<p>Primero, la funci\u00f3n <strong>effecFn<\/strong> (el primer par\u00e1metro que recibe useEffect) se ejecuta despu\u00e9s de que el navegador ya ha pintado el componente en pantalla por primera vez (<strong>montar<\/strong>). Segundo, la funci\u00f3n <strong>effectFn<\/strong> se ejecuta despu\u00e9s de cada posterior repintado (<strong>actualizar<\/strong>). Estos dos comportamientos descritos tienen 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>. Esto se debe a que la funci\u00f3n <strong>limpieza<\/strong>, en realidad no existe a\u00fan en el primer pintado porque es el valor de retorno de <strong>effectFn<\/strong>.<\/p>\n\n\n\n<p>El flujo de <strong>useEffect<\/strong> se representa en la imagen de abajo. 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<h2 class=\"wp-block-heading\">Haciendo una petici\u00f3n a un servicio con useEffect(effectFn, [deps])<\/h2>\n\n\n\n<p>En un proyecto nuevo de <a href=\"https:\/\/codesandbox.io\/s\/useeffect-usando-fetch-bid4h?file=\/src\/OldNewsPapers.js\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">codesandbox.io<\/a>, crea el archivo <strong>OldNewsPapers.js<\/strong>. Lo que se busca con este componente es hacer peticiones a un servicio, donde podemos buscar informaci\u00f3n sobre peri\u00f3dicos antiguos de USA. <\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>En resumen, la funcionalidad de este ejemplo es que en el campo de b\u00fasqueda el usuario escriba alg\u00fan texto relacionado, cuando el usuario se detenga de escribir por un tiempo mayor al definido, entonces es cuando se dispara la petici\u00f3n.<\/p>\n<\/blockquote>\n\n\n\n<p>Primero vamos a hacer solo la petici\u00f3n sin preocuparnos del tiempo definido de espera para ejectuarla.<\/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 [newsPaperNumber, setNewsPaperNumber] = useState(0);  useEffect(() =&gt; {    if (query) {      console.log(&quot;fetch -&gt; &quot;, query);      fetchOldNewsPapers();    }    async function fetchOldNewsPapers() {      const response = await fetch(        `https:\/\/chroniclingamerica.loc.gov\/search\/pages\/results\/?andtext=${query}&amp;format=json`      );      const json = await response.json();      setNewsPaperNumber(json.totalItems);    }  }, [query]);  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;section&gt;{newsPaperNumber}&lt;\/section&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\">newsPaperNumber<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">setNewsPaperNumber<\/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\">0<\/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: #89DDFF; font-style: italic\">if<\/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: #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\">fetch -&gt; <\/span><span style=\"color: #89DDFF\">&quot;<\/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: #82AAFF\">fetchOldNewsPapers<\/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: #C792EA\">async<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #C792EA\">functions<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">fetchOldNewsPapers<\/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: #C792EA\">const<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">response<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">fetch<\/span><span style=\"color: #F07178\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #89DDFF\">`<\/span><span style=\"color: #C3E88D\">https:\/\/chroniclingamerica.loc.gov\/search\/pages\/results\/?andtext=<\/span><span style=\"color: #89DDFF\">${<\/span><span style=\"color: #BABED8\">query<\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #C3E88D\">&amp;format=json<\/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: #C792EA\">const<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">json<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">response<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">json<\/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\">setNewsPaperNumber<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">json<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">totalItems<\/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\">},<\/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>\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;<\/span><span style=\"color: #F07178\">section<\/span><span style=\"color: #89DDFF\">&gt;{<\/span><span style=\"color: #BABED8\">newsPaperNumber<\/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;\/&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>Aqu\u00ed est\u00e1 el <a href=\"https:\/\/codesandbox.io\/s\/useeffect-usando-fetch-bid4h?file=\/src\/OldNewsPapers.js\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">ejemplo en codesandbox.io<\/a>. Cada vez que <code>query<\/code> es modificado, se realiza una petici\u00f3n, como se ve en la imagen de abajo.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2021\/10\/useEffect-usando-fetch.jpg\" alt=\"useEffect usando fetch\" class=\"wp-image-3071\"\/><figcaption class=\"wp-element-caption\">useEffect usando fetch<\/figcaption><\/figure>\n\n\n\n<p>Al instante que el usuario empieza a escribir &#8220;texas&#8221;, se actualiza el estado de <strong><code>query<\/code><\/strong> provocando un <strong>\u201crepintado\u201d<\/strong> y se ejecuta la funci\u00f3n <strong>effecFn<\/strong> por cada letra que se inserte.<\/p>\n\n\n\n<p>Desafortunadamente hacer peticiones a un servicio cada vez que escribimos una letra no es un buen funcionamiento, es mejor solo hacer la petici\u00f3n cuando el usuario deja de escribir, tal como se plante\u00f3 al principio, asi que vamos a implementar esta mejor soluci\u00f3n en la siguiente secci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">useEffect(() =&gt; { return function limpieza(){}; }, [deps])<\/h2>\n\n\n\n<p>Comentamos previamente que esta funci\u00f3n de limpieza se ejecuta solamente en los <strong>\u201crepintados\u201d<\/strong>, en el primer pintado no se ejecuta porque la funci\u00f3n <strong>limpieza<\/strong> es el valor de retorno de la funci\u00f3n <strong>effectFn<\/strong>.  En el pintado n\u00famero uno la funci\u00f3n <strong>limpieza<\/strong> a\u00fan no existe.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Example<\/h3>\n\n\n\n<p>Para hacer la petici\u00f3n al servicio cuando el usuario deje de escribir, vamos a utilizar un temporizador, este temporizador estar\u00e1 cre\u00e1ndose y limpi\u00e1ndose despu\u00e9s de cada repintado. Cuando el usuario se detenga de escribir y pase el tiempo definido en el temporizador, ah\u00ed es donde haremos la petici\u00f3n al servicio.<\/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 [newsPaperCount, setNewsPaperCount] = useState(0);  const [isTyping, setIsTyping] = useState(false);  useEffect(() =&gt; {    console.log(&quot;funci\u00f3n effectFn&quot;);    if (query &amp;&amp; !isTyping) {      console.log(&quot;  fetch--&gt;&quot;, query);      fetchOldNewsPaperTitles();    }    async function fetchOldNewsPaperTitles() {      const response = await fetch(        `https:\/\/chroniclingamerica.loc.gov\/search\/pages\/results\/?andtext=${query}&amp;format=json`      );      const json = await response.json();      setNewsPaperCount(json.totalItems);    }    let timeoutId;    if (isTyping) {      timeoutId = setTimeout(() =&gt; {        console.log('  setIsTyping(false), provoca otro &quot;re-pintado&quot;');        setIsTyping(false);      }, 1000);      console.log(&quot;  timeout&quot;, timeoutId);    }    return () =&gt; {      console.log(&quot;----------re-pintado--------------&quot;);      console.log(&quot;funci\u00f3n limpieza&quot;);      if (timeoutId) {        clearTimeout(timeoutId);        console.log(&quot;  clearTimeout&quot;, timeoutId);      }    };  }, [query, isTyping]);  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; {            setIsTyping(true);            setQuery(e.target.value);            console.log(              `onChange: setIsTyping(true) y setQuery(${e.target.value})`            );          }}        \/&gt;      &lt;\/form&gt;      &lt;section&gt;{newsPaperCount}&lt;\/section&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\">newsPaperCount<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">setNewsPaperCount<\/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\">0<\/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\">isTyping<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">setIsTyping<\/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: #FF9CAC\">false<\/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\">funci\u00f3n effectFn<\/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\">if<\/span><span style=\"color: #F07178\"> (<\/span><span style=\"color: #BABED8\">query<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">&amp;&amp;<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">!<\/span><span style=\"color: #BABED8\">isTyping<\/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\">  fetch--&gt;<\/span><span style=\"color: #89DDFF\">&quot;<\/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: #82AAFF\">fetchOldNewsPaperTitles<\/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: #C792EA\">async<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #C792EA\">functions<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">fetchOldNewsPaperTitles<\/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: #C792EA\">const<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">response<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">fetch<\/span><span style=\"color: #F07178\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #89DDFF\">`<\/span><span style=\"color: #C3E88D\">https:\/\/chroniclingamerica.loc.gov\/search\/pages\/results\/?andtext=<\/span><span style=\"color: #89DDFF\">${<\/span><span style=\"color: #BABED8\">query<\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #C3E88D\">&amp;format=json<\/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: #C792EA\">const<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">json<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">response<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">json<\/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\">setNewsPaperCount<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">json<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">totalItems<\/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: #C792EA\">let<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">timeoutId<\/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\">isTyping<\/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\">timeoutId<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">setTimeout<\/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\">&#39;<\/span><span style=\"color: #C3E88D\">  setIsTyping(false), provoca otro &quot;re-pintado&quot;<\/span><span style=\"color: #89DDFF\">&#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: #82AAFF\">setIsTyping<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #FF9CAC\">false<\/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 style=\"color: #F07178\"> <\/span><span style=\"color: #F78C6C\">1000<\/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\">  timeout<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">timeoutId<\/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 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\">----------re-pintado--------------<\/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\">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\">funci\u00f3n limpieza<\/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\">if<\/span><span style=\"color: #F07178\"> (<\/span><span style=\"color: #BABED8\">timeoutId<\/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\">clearTimeout<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">timeoutId<\/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\">  clearTimeout<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">timeoutId<\/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\">};<\/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: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">isTyping<\/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\">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: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">            <\/span><span style=\"color: #82AAFF\">setIsTyping<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #FF9CAC\">true<\/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\">setQuery<\/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\">console<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">log<\/span><span style=\"color: #F07178\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">              <\/span><span style=\"color: #89DDFF\">`<\/span><span style=\"color: #C3E88D\">onChange: setIsTyping(true) y setQuery(<\/span><span style=\"color: #89DDFF\">${<\/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 style=\"color: #C3E88D\">)<\/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\">}}<\/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;<\/span><span style=\"color: #F07178\">section<\/span><span style=\"color: #89DDFF\">&gt;{<\/span><span style=\"color: #BABED8\">newsPaperCount<\/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;\/&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>Al c\u00f3digo de arriba le dej\u00e9 varios <code><strong>console.log<\/strong><\/code> para que podamos ver el flujo, si quieres se los puedes eliminar para mayor claridad. Aqu\u00ed esta <a href=\"https:\/\/codesandbox.io\/s\/useeffect-con-limpieza-1h0h8?file=\/src\/OldNewsPapers.js\" target=\"_blank\" rel=\"noreferrer noopener\">este ejemplo completo en codesandbox.io<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2021\/10\/useEffect-con-limpieza.jpg\" alt=\"useEffect con limpieza\" class=\"wp-image-3073\"\/><figcaption class=\"wp-element-caption\">useEffect con limpieza<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Explicaci\u00f3n de flujo<\/h3>\n\n\n\n<p>Despu\u00e9s del primer <strong>\u201cpintado\u201d <\/strong>se ejecuta <strong>effectFn<\/strong>, luego cuando el usuario empieza a escribir <strong>\u201ctexas&#8221;<\/strong> provoca un &#8220;<strong>repintado&#8221;<\/strong>, lo anterior sucede por cada letra insertada debido al evento <code><strong>onChange<\/strong><\/code> que actualiza el estado de <code><strong>query<\/strong><\/code>. <\/p>\n\n\n\n<p>Posterior a cada repintado se ejecuta primero la funci\u00f3n <strong>limpieza<\/strong>, eliminando el temporizador, luego la funci\u00f3n <strong>effectFn<\/strong> volviendo a activar un temporizador y retornando una nueva funci\u00f3n limpieza.<\/p>\n\n\n\n<p>Cuando el usuario deja de escribir, la funci\u00f3n <strong>callback<\/strong> del <strong>setTimeout<\/strong> se ejecuta, provocando la actualizaci\u00f3n del estado <strong>isTyping<\/strong> to <strong><code>false<\/code><\/strong>. Lo anterior causa otro <strong>repintado<\/strong> adicional, teniendo a <strong><code>isTyping<\/code><\/strong> equal to <strong><code>false<\/code> <\/strong>and <strong><code>query<\/code><\/strong> equal to <strong><code>\u201ctexas\u201d<\/code><\/strong>, siendo las condiciones (<code>query &amp;&amp; !isTyping<\/code>) necesarias para realizar una petici\u00f3n. En el momento que el resultado de la petici\u00f3n est\u00e1 listo, se actualiza <code><strong>setNewsPaperCount<\/strong><\/code> con el n\u00famero de peri\u00f3dicos antiguos que contiene la palabra <strong>&#8220;texas&#8221;<\/strong>. La actualizaci\u00f3n de <strong><code>setNewsPaperCount<\/code><\/strong> provoca un \u00faltimo <strong>repintado<\/strong>, solo que en este \u00faltimo <strong>repintado<\/strong> no se ejecuta la funci\u00f3n <strong>limpieza<\/strong> ni <strong>effectFn<\/strong> porque <code><strong>query<\/strong><\/code> and <code><strong>isTyping<\/strong>,<\/code> las dependencias de nuestro <strong>useEffect<\/strong>, permanecen sin cambiar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">React Hooks personalizados<\/h2>\n\n\n\n<p>Las funciones son la unida esencial para la organizaci\u00f3n y reutilizaci\u00f3n de c\u00f3digo, ya sea solo para separar las responsabilidades de cada funci\u00f3n y\/o para encapsular c\u00f3digo\/funcionalidad reutilizable. Los React Hooks perzonalizados, al ser funciones tambi\u00e9n tienen esta habilidad de organizaci\u00f3n y reutilizaci\u00f3n.<\/p>\n\n\n\n<p>Vamos a extraer funciones de nuestro ejemplo anterior con la finalidad de hacer m\u00e1s f\u00e1cil de leer el c\u00f3digo, lo primero que podemos ver es que dentro del <strong>useEffect<\/strong>, tenemos un c\u00f3digo que realiza una petici\u00f3n usando el API de fetch y otro para llevar el control del temporizador. Tal vez valga la pena separarlos, a estas funciones separadas se les llama <strong>React hooks personalizados<\/strong> porque la separaci\u00f3n se realiza en forma de Hooks<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">React Hook personalizado useCanContinueTimeout(trigger, waitTime)<\/h3>\n\n\n\n<p>Empezamos con el c\u00f3digo del temporizador. Aqu\u00ed est\u00e1 el c\u00f3digo extra\u00eddo, bueno, con algunas modificaciones para poder ser reutilizado.<\/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 useCanContinueTimeout(trigger, waitTime) {  const [canContinue, setCanContinue] = useState(false);  useEffect(() =&gt; {    let timeoutId;    if (canContinue) {      timeoutId = setTimeout(() =&gt; {        setCanContinue(false);      }, waitTime);    }    return () =&gt; {      clearTimeout(timeoutId);    }  }, [trigger, canContinue]);  return [canContinue, setCanContinue];}\" 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\">useCanContinueTimeout<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8; font-style: italic\">trigger<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #BABED8; font-style: italic\">waitTime<\/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\">canContinue<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">setCanContinue<\/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: #FF9CAC\">false<\/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: #C792EA\">let<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">timeoutId<\/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\">canContinue<\/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\">timeoutId<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">setTimeout<\/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: #82AAFF\">setCanContinue<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #FF9CAC\">false<\/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 style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">waitTime<\/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 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: #82AAFF\">clearTimeout<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">timeoutId<\/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\">},<\/span><span style=\"color: #F07178\"> [<\/span><span style=\"color: #BABED8\">trigger<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">canContinue<\/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\">canContinue<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">setCanContinue<\/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>Lo que hacemos en realidad es pasar tal cual el c\u00f3digo que queremos separar, y luego cambiar los nombres de los identificadores para mejorar su lectura y entendimiento.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Explicaci\u00f3n del Reack hook personalizado useCanContinueTimeout<\/h3>\n\n\n\n<p>Este React Hook personalizado, puede ser utilizando en cualquier campo de b\u00fasqueda donde se quiera realizar una acci\u00f3n despu\u00e9s de que el usuario deja de escribir por un tiempo determinado. Recibe dos par\u00e1metros, un valor que es el <code><strong>trigger<\/strong><\/code> o disparador principal del efecto. Y otro valor que indica el tiempo del temporizador (<strong><code>waitTime<\/code><\/strong>), si no se limpia y se crea otro temporizador, <strong><code>canContinue<\/code><\/strong> es actualizado a <code>false<\/code> indicando que la acci\u00f3n de escribir dejo de suceder durante el tiempo indicado por <strong>waitTime<\/strong>.<\/p>\n\n\n\n<p>El estado interno <code><strong>canContinue<\/strong><\/code> condiciona si puede seguir creando temporizadores o no, si es <strong>false<\/strong> ya no puede crear temporizadores, porque la acci\u00f3n de escribir dejo de suceder y si es <strong>true<\/strong> indica que el usuario est\u00e1 escribiendo. Se expone este estado <strong>canContinue<\/strong> al exterior regresando un par de valores tal cual lo hace <code>useState<\/code> para su manejo.<\/p>\n\n\n\n<p>La raz\u00f3n por la que se expone al exterior <code><strong>canContinue<\/strong><\/code> es porque es m\u00e1s flexible que desde donde se use este hook se pueda definir inmediatamente en que momento puede seguir creando temporizadores o no. <\/p>\n\n\n\n<p>En el caso particular del ejemplo solo le interesa indicarle que si puede continuar creando temporizadores mientras el usuario siga escribiendo dentro del campo de b\u00fasqueda.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfC\u00f3mo se puede usar el react hook personalizado useCanContinueTimeout?<\/h3>\n\n\n\n<p>Este Hooks se puede usar de la siguiente forma con el ejemplo que hemos estado trabajando.<\/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 WAIT_TIME = 1000;export default function OldNewsPapers() {  const [query, setQuery] = useState('');  const [isTyping, setIsTyping] = useCanContinueTimeout(query, WAIT_TIME);  ...  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: #C792EA\">const<\/span><span style=\"color: #BABED8\"> WAIT_TIME <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #F78C6C\">1000<\/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\">&#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: #C792EA\">const<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">[<\/span><span style=\"color: #BABED8\">isTyping<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">setIsTyping<\/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\">useCanContinueTimeout<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">query<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">WAIT_TIME<\/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 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>Aunque se cre\u00f3 pensando en el uso del campo de b\u00fasqueda, queda claro que pude ser usado para saber si se detuvo o continua cualquier otra acci\u00f3n. Puede usarse en cargadores, en notificaciones temporales, acciones de scroll en el navegador web y de momento no se me ocurre otro caso, es una primera versi\u00f3n del hook, pero es un ejemplo de como podemos extraer funcionalidad con react hooks personalizados.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">React Hook personalizado <code>useGetJsonWhenCondition(url, condition)<\/code><\/h3>\n\n\n\n<p>Ahora es el turno de la funci\u00f3n que realiza la petici\u00f3n a un servicio, primero separamos la funcionalidad, al igual que con <code>useCanContinueTimeout<\/code> solo copiamos el c\u00f3digo y cambiamos los nombres de las dependencias de <strong>useEffect<\/strong>.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"function useFetchOldNewsPaper(query, condition) {  const [newsPaperCount, setNewsPaperCount] = useState(0);  useEffect(() =&gt; {    if (query &amp;&amp; !condition) {      doFetch()    }    async function doFetch() {      const response = await fetch(        `https:\/\/chroniclingamerica.loc.gov\/search\/pages\/results\/?andtext=${query}&amp;format=json`      );      const json = await response.json();      setNewsPaperCount(json.totalItems);    }  }, [query, condition]);  return newsPaperCount;}\" 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\">useFetchOldNewsPaper<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8; font-style: italic\">query<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #BABED8; font-style: italic\">condition<\/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\">newsPaperCount<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">setNewsPaperCount<\/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\">0<\/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: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #F07178\"> (<\/span><span style=\"color: #BABED8\">query<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">&amp;&amp;<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">!<\/span><span style=\"color: #BABED8\">condition<\/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\">doFetch<\/span><span style=\"color: #F07178\">()<\/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: #C792EA\">async<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #C792EA\">functions<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">doFetch<\/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: #C792EA\">const<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">response<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">fetch<\/span><span style=\"color: #F07178\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #89DDFF\">`<\/span><span style=\"color: #C3E88D\">https:\/\/chroniclingamerica.loc.gov\/search\/pages\/results\/?andtext=<\/span><span style=\"color: #89DDFF\">${<\/span><span style=\"color: #BABED8\">query<\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #C3E88D\">&amp;format=json<\/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: #C792EA\">const<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">json<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">response<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">json<\/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\">setNewsPaperCount<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">json<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">totalItems<\/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\">},<\/span><span style=\"color: #F07178\"> [<\/span><span style=\"color: #BABED8\">query<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">condition<\/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\">newsPaperCount<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">React hook personalizado useGetJsonWhenCondition, m\u00e1s reutilizable<\/h4>\n\n\n\n<p>Ahora vamos a refactorizarlo para hacerlo m\u00e1s reutilizable.<\/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 useGetJsonWhenCondition(url, condition) {  const [state, setState] = useState({});  useEffect(() =&gt; {    if (url &amp;&amp; condition) {      (async () =&gt; {        const response = await fetch(url);        const json = await response.json();        setState(json);      })();    }  }, [url, condition]);  return state;}\" 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\">useGetJsonWhenCondition<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8; font-style: italic\">url<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #BABED8; font-style: italic\">condition<\/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\">state<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">setState<\/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: #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: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #F07178\"> (<\/span><span style=\"color: #BABED8\">url<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">&amp;&amp;<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">condition<\/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\">async<\/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: #C792EA\">const<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">response<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">fetch<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">url<\/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: #BABED8\">json<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">response<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">json<\/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\">setState<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">json<\/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 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\">},<\/span><span style=\"color: #F07178\"> [<\/span><span style=\"color: #BABED8\">url<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">condition<\/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\">state<\/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>De entrada le cambiamos el nombre para que tenga m\u00e1s sentido sobre lo que hace realmente, obtener un json cuando una condici\u00f3n se cumple. Luego ya no obtendremos solo el n\u00famero de resultados, mejor ahora guardamos la respuesta completa. Adem\u00e1s para no crear una funci\u00f3n separada abajo de la condici\u00f3n, se utiliz\u00f3 una funci\u00f3n autoinvocada <code><strong>(function() {})()<\/strong><\/code>. <\/p>\n\n\n\n<p>Solo se har\u00e1 la petici\u00f3n si se tiene una <strong>url<\/strong> y la <strong>condici\u00f3n<\/strong> se cumple, el manejo de estos dos datos no es responsabilidad de este hook, as\u00ed que se la delegamos al usuario final,  que en nuestro caso es el componente <code><strong>OldNewsPapers<\/strong><\/code>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Funcion async\/await del useEffect<\/h4>\n\n\n\n<p>Creamos una funci\u00f3n an\u00f3nima para poder hacer la petici\u00f3n asincr\u00f3nicamente sin hacer a <strong>effectFn<\/strong> as\u00edncrona, <strong>\u00bfPor qu\u00e9 no queremos hacer la funci\u00f3n effectFn as\u00edncrona?<\/strong> La respuesta en realidad es simple, normalmente la funci\u00f3n <strong>effectFn<\/strong> came back <strong>undefined<\/strong> o una funci\u00f3n normal de <strong>limpieza<\/strong>, pero si la hacemos as\u00edncrona deber\u00e1 regresar una promesa, lo cual romper\u00e1 con el funcionamiento normal de valores de retorno de <strong>useEffect<\/strong>. Por no mencionar que  funci\u00f3n <strong>effectFn<\/strong> es invocada de manera normal, no de forma async\/await.<\/p>\n\n\n\n<p>Aclaramos que la forma anterior donde primero se defin\u00eda la funci\u00f3n por separado de la invocaci\u00f3n dentro del <strong>effectFn<\/strong> es equivalente a  esta funci\u00f3n an\u00f3nima autoinvocada. Al final regresamos el estado del hook, que es la respuesta del servicio o un objeto vac\u00edo cuando la respuesta a\u00fan no se ha obtenido.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Extraer en su propia funci\u00f3n a fetch con petici\u00f3n GET para respuestas JSON.<\/h4>\n\n\n\n<p>Finalmente vamos a extraer la funcionalidad de hacer la peticion para que sea mas simple de leer el efecto<\/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 useGetJsonWhenCondition(url, condition) {  const [state, setState] = useState({});  useEffect(() =&gt; {    if (url &amp;&amp; condition) {      (async () =&gt; {        setState(await getJson(url));      })();    }  }, [url, condition]);  return state;}\/\/ Es simple , sin control de errores para no perder el enfoque de los hooksasync function getJson(url) {  const response = await fetch(url)  return await response.json();}\" 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\">useGetJsonWhenCondition<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8; font-style: italic\">url<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #BABED8; font-style: italic\">condition<\/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\">state<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">setState<\/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: #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: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #F07178\"> (<\/span><span style=\"color: #BABED8\">url<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">&amp;&amp;<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">condition<\/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\">async<\/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: #82AAFF\">setState<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">getJson<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">url<\/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 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\">},<\/span><span style=\"color: #F07178\"> [<\/span><span style=\"color: #BABED8\">url<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">condition<\/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\">state<\/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\">\/\/ Es simple , sin control de errores para no perder el enfoque de los hooks<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">async<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">functions<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">getJson<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8; font-style: italic\">url<\/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: #BABED8\">response<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">fetch<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">url<\/span><span style=\"color: #F07178\">)<\/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; font-style: italic\">await<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">response<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">json<\/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>Separamos el uso de fetch en su propia funci\u00f3n <code>getJson<\/code>, porque el uso de fetch y la llamada al servicio involucra un manejo m\u00e1s detallado de errores, de momento lo dejamos de manera simple separando la invocaci\u00f3n.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Implementamos el react hook personalizado useGetJsonWhenCondition en nuestro componente OldNewsPapers<\/h4>\n\n\n\n<p>Ahora si se puede utilizar el hook en nuestro componente de ejemplo, de la siguiente forma.<\/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=\"export default function OldNewsPapers({ url }) {  const [query, setQuery] = useState('');  const [fetchUrl, setFetchUrl] = useState('');  const [isTyping, setIsTyping] = useCanContinueTimeout(query, WAIT_TIME);  const newsPapers = useGetJsonWhenCondition(fetchUrl, !isTyping);  \/\/ Dejamos el manejo de url y la actualizaci\u00f3n de canCantinue al componente que los utiliza  useEffect(() =&gt; {    if (query) {      setIsTyping(true);      setFetchUrl(url.replace('{query}', query));    } else {      setFetchUrl('');    }  }, [query, url]);  return (    &lt;&gt;      &lt;h1&gt;Periodicos 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;section&gt;        {newsPapers.totalItems}      &lt;\/section&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\">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: #BABED8; font-style: italic\">url<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">})<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #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\">&#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: #C792EA\">const<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">[<\/span><span style=\"color: #BABED8\">fetchUrl<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">setFetchUrl<\/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\">&#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: #C792EA\">const<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">[<\/span><span style=\"color: #BABED8\">isTyping<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">setIsTyping<\/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\">useCanContinueTimeout<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">query<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">WAIT_TIME<\/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: #BABED8\">newsPapers<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">useGetJsonWhenCondition<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">fetchUrl<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">!<\/span><span style=\"color: #BABED8\">isTyping<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">  <\/span><span style=\"color: #464B5D; font-style: italic\">\/\/ Dejamos el manejo de url y la actualizaci\u00f3n de canCantinue al componente que los utiliza<\/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: #89DDFF; font-style: italic\">if<\/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: #82AAFF\">setIsTyping<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #FF9CAC\">true<\/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\">setFetchUrl<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">url<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">replace<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">{query}<\/span><span style=\"color: #89DDFF\">&#39;<\/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\">}<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">else<\/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\">setFetchUrl<\/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: #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: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">url<\/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\">Periodicos 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: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">            <\/span><span style=\"color: #82AAFF\">setQuery<\/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: #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\">section<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">        <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #BABED8\">newsPapers<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">totalItems<\/span><span style=\"color: #89DDFF\">}<\/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>\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>Como vemos el manejo de la condici\u00f3n y la formaci\u00f3n de la <strong>url<\/strong> se la dejamos el componente que usa el hook, no al hook <strong>useGetJsonWhenCondition(url, condition)<\/strong>. De esta manera el React Hook personalizado <code><strong>useGetJsonWhenCondition(url, condition)<\/strong><\/code> puede ser reutilizado, es decir, el componente <strong>OldNewsPapers<\/strong> depende de los dos React Hooks personalizados que acabamos de crear, no al rev\u00e9s.<\/p>\n\n\n\n<p><a href=\"https:\/\/codesandbox.io\/s\/custom-hooks-useeffect-con-limpieza-lnybt?file=\/src\/OldNewsPapers.js\" target=\"_blank\" rel=\"noreferrer noopener\">Aqu\u00ed<\/a> puedes revisar el ejemplo completo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Puntos importantes al usar y crear React Hooks Personalizados<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Invocaciones y renderizados<\/h3>\n\n\n\n<p>Los componentes funcionales se vuelven a ejecutar cuando algo en el estado cambia, y por consiguiente tambi\u00e9n se ejecutan las funciones de react hooks personalizados. En los ejemplos que vimos, cada vez que cambia algo en el estado de <strong><code>query<\/code><\/strong>, <strong><code>fetchUrl<\/code><\/strong>, <strong><code>isTyping<\/code><\/strong> and <strong><code>newsPaper<\/code>s<\/strong>, provocara otra invocaci\u00f3n del componente funci\u00f3n <strong>OldNewsPaper<\/strong>, por consiguiente tambi\u00e9n se invocaran las funciones <strong><code>useCanContinueTimeout<\/code>  <\/strong> and <strong><code>useGetJsonWhenCondition<\/code><\/strong> (React hooks personalizados) que creamos y todo esto se traduce a un <strong>re-renderizado<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u00bfPor qu\u00e9 NO queremos hacer la funci\u00f3n effectFn as\u00edncrona?<\/strong><\/h3>\n\n\n\n<p>La respuesta en realidad es simple, normalmente la funci\u00f3n <strong>effectFn<\/strong> came back <strong>undefined<\/strong> o una funci\u00f3n normal de limpieza, pero si la hacemos as\u00edncrona, deber\u00e1 regresar una promesa, lo cual romper\u00e1 con el funcionamiento normal de valores de retorno de <strong>useEffect<\/strong>. Por no mencionar que funci\u00f3n <strong>effectFn<\/strong> es invocada de manera normal, no de forma async\/await.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Reglas de React hooks personalizados<\/h3>\n\n\n\n<p>Las mismas dos reglas importantes aplicadas a los React Hooks, son tambien aplicadas a los React Hooks personalizados.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Solo ejecuta React Hooks al nivel superior de una funci\u00f3n componente o React Hook personalizado<\/li>\n\n\n\n<li>Solo ejecuta React Hooks dentro de funciones de React<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Los nombres de los React hooks personalizados deben empezar con &#8220;<code><strong>use\"<\/strong><\/code><\/h3>\n\n\n\n<p>Esto es una convenci\u00f3n importante, de esta manera cualquier desarrollador a simple vista se da cuenta que se trata de un React Hook. Ademas asi se nombran los Hooks de React y asi el plugin de eslint detecta posibles errores en el codigo relacionados con las reglas de los hooks.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cada React hook personalizado, tiene su propio estado<\/h3>\n\n\n\n<p>Cada invocaci\u00f3n de un React Hook personalizado contiene su propio estado, los Hooks no tienen estados compartidos, porque recordemos que <code>useState()<\/code> guarda un estado totalmente separado de cualquier otra invocaci\u00f3n. Adem\u00e1s cada invocaci\u00f3n de una funci\u00f3n contiene su propio \u00e1mbito.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusions<\/h2>\n\n\n\n<p>En esta publicaci\u00f3n aprendimos como usar la variante m\u00e1s compleja de <code><strong>useEffect(() =&gt; { return function limpieza(){}; }, [deps])<\/strong><\/code> y adem\u00e1s se extrajo dos React Hooks personalizados porque el <strong>useEffect<\/strong> inicial es complejo. Se estableci\u00f3 que la creaci\u00f3n de React Hooks personalizados es igual que cuando extraemos funciones m\u00e1s peque\u00f1as de una funci\u00f3n grande. Por \u00faltimo vimos los puntos a tomar en cuenta cuando creamos y usamos React Hooks personalizados.<\/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><a href=\"https:\/\/reactjs.org\/docs\/hooks-custom.html\">https:\/\/reactjs.org\/docs\/hooks-custom.html<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Custom React Hooks with useEffect. Cleanup of useEffect, async\/await, and important notes when using and creating custom React Hooks<\/p>","protected":false},"author":2,"featured_media":3714,"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":[73,74,81],"class_list":["post-3025","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript","category-react","tag-react","tag-react-hooks","tag-useeffect"],"_links":{"self":[{"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/posts\/3025","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=3025"}],"version-history":[{"count":2,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/posts\/3025\/revisions"}],"predecessor-version":[{"id":3800,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/posts\/3025\/revisions\/3800"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/media\/3714"}],"wp:attachment":[{"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/media?parent=3025"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/categories?post=3025"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/tags?post=3025"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}