<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Leonardo Trujillo</title>
    <description>The latest articles on Forem by Leonardo Trujillo (@hileodev).</description>
    <link>https://forem.com/hileodev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3596382%2F58773f19-0390-42ca-a89d-b19eec1e5e8e.jpg</url>
      <title>Forem: Leonardo Trujillo</title>
      <link>https://forem.com/hileodev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/hileodev"/>
    <language>en</language>
    <item>
      <title>React Actions: el cambio más grande 🤯</title>
      <dc:creator>Leonardo Trujillo</dc:creator>
      <pubDate>Tue, 27 Jan 2026 20:32:25 +0000</pubDate>
      <link>https://forem.com/hileodev/react-actions-el-cambio-mas-grande-que-casi-nadie-esta-entendiendo-3mi5</link>
      <guid>https://forem.com/hileodev/react-actions-el-cambio-mas-grande-que-casi-nadie-esta-entendiendo-3mi5</guid>
      <description>&lt;p&gt;Si pensabas que el "estado" era lo único complicado en React, prepárate. React 19 trae algo que, a primera vista, parece una cosa más en la lista de "cosas nuevas que aprender", pero que en realidad es una patada en la mesa de cómo hemos manejado la interactividad hasta ahora. Hablo de las &lt;strong&gt;React Actions&lt;/strong&gt;, y sí, el título no es clickbait: presiento que no todos lo entenderemos o entendimos bien. Y no te culpo, al principio yo también pensé: "¿otra abstracción más?". Pero no, esto es diferente.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué son las Actions y por qué importa su existencia? 🤔
&lt;/h2&gt;

&lt;p&gt;Para simplificarlo sin perder el humor: las Actions son la respuesta de React a la pregunta: "¿Cómo podemos hacer que la interacción con el servidor sea menos... manual?". Durante años, hemos lidiado con &lt;code&gt;isLoading&lt;/code&gt;, &lt;code&gt;isError&lt;/code&gt;, &lt;code&gt;data&lt;/code&gt;, &lt;code&gt;setData&lt;/code&gt;, &lt;code&gt;try/catch&lt;/code&gt; y toda una coreografía de estados locales para manejar el envío de un formulario o cualquier otra interacción asíncrona. Era un infierno de boilerplate.&lt;/p&gt;

&lt;p&gt;Las Actions vienen a ser una especie de "directiva" que le dices a React: "Oye, cuando este evento ocurra (por ejemplo, un submit de un formulario), quiero que ejecutes esta función que probablemente interactúa con tu amigo el servidor". Pero lo crucial aquí es que React &lt;em&gt;toma el control&lt;/em&gt; de la ejecución, el manejo de estados pendientes, errores y, lo más importante, la revalidación.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Imagina que eres un director de orquesta y, en lugar de decirle a cada músico cuándo tocar y cuándo parar, simplemente les dices: "Cuando yo haga esto, ustedes tocan esta sinfonía completa y ya se encargan de los detalles". Eso son las Actions. Menos micro-gestión, más delegación.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  ¿Cómo cambian los formularios y por qué es una maravilla (a medias)? 📝
&lt;/h2&gt;

&lt;p&gt;Los formularios son el caso de uso estrella de las Actions. Antes, un formulario típico en React era algo así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;MyOldSchoolForm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setEmail&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isLoading&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setIsLoading&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setError&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;setIsLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;setError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/submit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="c1"&gt;// Lógica de éxito, limpiar formulario, etc.&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setIsLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;onSubmit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* Inputs y botones */&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isLoading&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Enviando...&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;red&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Error: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora, con las Actions, la cosa se simplifica drásticamente. Podemos vincular una función directamente al action prop de un &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt;, y React se encarga del resto. Esto es especialmente potente con useFormStatus y useFormState (que veremos en otro post, ¡no te precipites!).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// En tu archivo del servidor o en un Server Component si usas Next.js/RSC&lt;/span&gt;
&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Opcional, pero muy común para Server Actions&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;submitForm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// Lógica de validación y envío al DB/API&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Simula un delay de red&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Nombre no permitido.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Formulario enviado:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="c1"&gt;// revalidatePath('/') // Si estás en Next.js, por ejemplo&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Formulario enviado con éxito!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// En tu componente de cliente&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;MyNewSchoolForm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;submitForm&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Tu nombre"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Tu email"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Enviar&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* Aquí usaríamos useFormStatus o useFormState para mostrar el estado */&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fíjate en la magia: ¡no hay useState para isLoading o error dentro del componente del formulario! React, a través de sus nuevos hooks, nos proporciona esa información. Es como si el formulario mismo supiera lo que está pasando, sin que tengamos que programárselo explícitamente. Adios boilerplate, hola... ¿magia negra?&lt;/p&gt;




&lt;h2&gt;
  
  
  La relación con Server Components / Next.js: ¿es un amor verdadero o una relación complicada? 💘💔
&lt;/h2&gt;

&lt;p&gt;Aquí es donde la cosa se pone picante. Las Actions, si bien pueden usarse en el cliente (aunque con menos superpoderes), alcanzan su máximo potencial cuando se combinan con los Server Components (RSC).&lt;/p&gt;

&lt;p&gt;Cuando una Action se ejecuta en un Server Component, la función que asignas al action prop es ejecutada directamente en el servidor. Esto significa que puedes manejar la lógica de base de datos, llamadas a APIs sensibles, etc., sin exponer nada en el cliente. Es una forma increíblemente segura y eficiente de manejar mutaciones.&lt;/p&gt;

&lt;p&gt;🚀 Un pequeño "duh" para los que pensaban que las Server Actions eran solo para Next.js: No, amigo. Next.js las ha implementado de forma brillante, pero el concepto de Server Actions (y por ende, las React Actions) es una característica de React 19 que otras soluciones (como Remix) también están adoptando o planean adoptar. Es la visión de React de un mundo más integrado entre cliente y servidor.&lt;/p&gt;

&lt;p&gt;¿Por qué importa esta relación?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Seguridad: Las credenciales y la lógica sensible nunca tocan el navegador.&lt;/li&gt;
&lt;li&gt;Rendimiento: Menos JavaScript enviado al cliente, ya que la lógica de mutación vive en el servidor.&lt;/li&gt;
&lt;li&gt;Simplicidad: Adiós a la necesidad de crear endpoints API dedicados para cada pequeña mutación. Ahora, tu función de mutación puede vivir justo al lado de tu componente (o en un archivo separado marcado como 'use server').&lt;/li&gt;
&lt;li&gt;Coherencia de datos: React es capaz de revalidar el caché de datos de forma "inteligente" después de una Action exitosa, asegurando que tu UI refleje el estado más reciente del servidor sin que tengas que refrescar la página manualmente. ¡Es como tener un useEffect mágico que solo se dispara cuando tiene sentido!&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusión: Prepárense para cambiar su chip 🧠
&lt;/h2&gt;

&lt;p&gt;React Actions no son un simple azúcar sintáctico; son un cambio fundamental en cómo pensamos la interacción en una aplicación React. Nos empujan a considerar el "lado servidor" de nuestras aplicaciones de una manera mucho más integrada y menos separada.&lt;/p&gt;

&lt;p&gt;Si aún estás en la fase de "¿qué demonios es esto?", no te preocupes. Estamos todos en el mismo barco. Pero la clave es empezar a internalizar que React está buscando reducir drásticamente el boilerplate para interacciones comunes y, de paso, acercar el desarrollo frontend al backend de una forma que hace unos años era impensable.&lt;/p&gt;

&lt;p&gt;Así que, respira hondo, y prepárate para un mundo donde el onSubmit ya no es el único protagonista. Las Actions llegaron para quedarse, y su potencial es, francamente, aterradoramente emocionante.&lt;/p&gt;

&lt;p&gt;¡Hasta el próximo post! 😁&lt;/p&gt;

</description>
    </item>
    <item>
      <title>React 19 - Primer post del año</title>
      <dc:creator>Leonardo Trujillo</dc:creator>
      <pubDate>Wed, 14 Jan 2026 22:06:13 +0000</pubDate>
      <link>https://forem.com/hileodev/react-19-3f17</link>
      <guid>https://forem.com/hileodev/react-19-3f17</guid>
      <description>&lt;p&gt;He vuelto después de unas ligeras vacaciones, no quiero perder la constancia así que aquí vamos de nuevo 😅&lt;/p&gt;

&lt;p&gt;Después de publicar mi último post sobre el Profiler de React, tenía&lt;br&gt;
planeado seguir con la serie de rendimiento y arquitectura.&lt;br&gt;
Pero mientras revisaba la documentación y empezaba a leer sobre React&lt;br&gt;
19, me pasó algo curioso:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;En lugar de querer seguir con la serie… me dieron ganas de detenerme y&lt;br&gt;
   hablar de esto primero.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Decidí hacer una pausa para hablar de la nueva versión.&lt;br&gt;
No desde el hype, no desde el changelog, sino desde la mirada de alguien&lt;br&gt;
que usa React en proyectos reales.&lt;/p&gt;

&lt;p&gt;Este post es el inicio de una mini-serie sobre React 19:&lt;br&gt;
qué cambia, qué no, qué vale la pena mirar… y qué todavía conviene tomar&lt;br&gt;
con calma.&lt;/p&gt;




&lt;p&gt;Cuando ves "React 19" podrías pensar:&lt;br&gt;
"Ok, React con más mejoras".&lt;/p&gt;

&lt;p&gt;Pero no.&lt;/p&gt;

&lt;p&gt;La versión no cambia tanto la API…&lt;br&gt;
cambia más la forma en la que React quiere que pensemos las apps.&lt;/p&gt;

&lt;p&gt;Cada vez empuja más hacia:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Menos lógica manual en formularios.&lt;/li&gt;
&lt;li&gt;  Más integración entre servidor y cliente.&lt;/li&gt;
&lt;li&gt;  Menos boilerplate para manejar estados async.&lt;/li&gt;
&lt;li&gt;  Más enfoque en experiencia de usuario.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;React ya no quiere ser solo una librería para pintar componentes.&lt;br&gt;
Quiere ayudarte a construir aplicaciones completas.&lt;/p&gt;




&lt;p&gt;Algo importante que noté rápido&lt;/p&gt;

&lt;p&gt;se entiende mucho mejor cuando lo ves junto a frameworks como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Next.js&lt;/li&gt;
&lt;li&gt;  Remix&lt;/li&gt;
&lt;li&gt;  Frameworks con Server Components&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si vienes de React puro con Vite o CRA, algunas cosas pueden sentirse&lt;br&gt;
raras o incluso innecesarias.&lt;/p&gt;

&lt;p&gt;Y eso es clave:&lt;/p&gt;

&lt;p&gt;Esta nueva versión no está pensado para todos los proyectos por igual.&lt;/p&gt;

&lt;p&gt;Y eso, para mí, es algo positivo.&lt;/p&gt;




&lt;p&gt;Qué sí cambia de verdad&lt;/p&gt;

&lt;p&gt;Sin entrar todavía en ejemplos técnicos, React 19 trae mejoras reales&lt;br&gt;
en:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Formularios y acciones.&lt;/li&gt;
&lt;li&gt;  Estados de carga, error y éxito.&lt;/li&gt;
&lt;li&gt;  UX asíncrona más natural.&lt;/li&gt;
&lt;li&gt;  Integración server ↔ client.&lt;/li&gt;
&lt;li&gt;  Manejo de transiciones y estados optimistas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pero lo mejor:&lt;/p&gt;

&lt;p&gt;👉 No te obliga a usarlas.&lt;br&gt;
👉 No rompe tu forma actual de trabajar.&lt;br&gt;
👉 No te dice “así se hace ahora o estás mal”.&lt;/p&gt;

&lt;p&gt;Suma herramientas, no reemplaza.&lt;/p&gt;




&lt;p&gt;Qué no cambia&lt;/p&gt;

&lt;p&gt;React sigue siendo React:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Componentes.&lt;/li&gt;
&lt;li&gt;  Props.&lt;/li&gt;
&lt;li&gt;  Estado.&lt;/li&gt;
&lt;li&gt;  Hooks.&lt;/li&gt;
&lt;li&gt;  Composición.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No necesitas reaprenderlo.&lt;br&gt;
Solo necesitas entender qué nuevas opciones tienes cuando las necesites.&lt;/p&gt;




&lt;p&gt;Para mí, el cambio es más mental que técnico&lt;br&gt;
No te grita:&lt;br&gt;
"Tienes que migrar ya".&lt;/p&gt;

&lt;p&gt;Más bien te dice:&lt;br&gt;
"Si quieres, aquí tienes nuevas formas de hacer las cosas".&lt;/p&gt;

&lt;p&gt;Y ahí está la parte interesante:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  No todo debe vivir en el cliente.&lt;/li&gt;
&lt;li&gt;  No todo formulario debe ser un infierno.&lt;/li&gt;
&lt;li&gt;  No todo estado async debe ser manual.&lt;/li&gt;
&lt;li&gt;  No toda UX tiene que sentirse torpe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pero también:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  No todos los proyectos necesitan esto hoy.&lt;/li&gt;
&lt;li&gt;  No todos los equipos están listos.&lt;/li&gt;
&lt;li&gt;  No todo vale la pena migrar.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Cómo seguirá esta mini-serie&lt;/p&gt;

&lt;p&gt;En los próximos posts voy a hablar de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  React Actions.&lt;/li&gt;
&lt;li&gt;  Formularios en React 19.&lt;/li&gt;
&lt;li&gt;  useOptimistic y UX.&lt;/li&gt;
&lt;li&gt;  Server Actions vs estado en cliente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pero este primer post solo tenía un objetivo:&lt;/p&gt;

&lt;p&gt;Dejar claro que esta nueva versión no es obligatoria…&lt;br&gt;
pero sí es interesante.&lt;/p&gt;

&lt;p&gt;No es una moda.&lt;br&gt;
Tampoco es algo milagroso.&lt;/p&gt;

&lt;p&gt;Es solo otra herramienta más.&lt;br&gt;
Y como todas, depende de cómo y cuándo la uses.&lt;/p&gt;

&lt;p&gt;Nos leemos 👋&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Cómo usar el Profiler de React para medir renders de verdad (y dejar de adivinar)</title>
      <dc:creator>Leonardo Trujillo</dc:creator>
      <pubDate>Fri, 28 Nov 2025 19:06:05 +0000</pubDate>
      <link>https://forem.com/hileodev/como-usar-el-profiler-de-react-para-medir-renders-de-verdad-y-dejar-de-adivinar-2o1k</link>
      <guid>https://forem.com/hileodev/como-usar-el-profiler-de-react-para-medir-renders-de-verdad-y-dejar-de-adivinar-2o1k</guid>
      <description>&lt;p&gt;Hubo un punto en mi carrera donde me di cuenta de algo simple:&lt;br&gt;
estaba optimizando React a ciegas.&lt;/p&gt;

&lt;p&gt;Sabía que algunos componentes renderizaban más de lo necesario, intuía que había funciones recreándose sin motivo… pero la mayoría de las veces estaba adivinando.&lt;br&gt;
Y cuando optimizas sin medir, puedes terminar "arreglando" cosas que no estaban rotas.&lt;/p&gt;

&lt;p&gt;Fue ahí cuando empecé a usar el Profiler de React, y honestamente, me cambió la forma de entender cómo mis componentes se comportaban en tiempo real.&lt;/p&gt;

&lt;p&gt;Este post es justo sobre eso:&lt;br&gt;
cómo aprovechar el Profiler para ver lo que realmente pasa… y no lo que asumimos que pasa.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧭 El Profiler: una herramienta que todos deberían utilizar
&lt;/h2&gt;

&lt;p&gt;React Developer Tools incluye una pestaña llamada Profiler.&lt;br&gt;
No es tan famosa como el “Components” o el “Hooks”, pero es quizá la más útil cuando quieres mejorar rendimiento.&lt;/p&gt;

&lt;p&gt;El Profiler te permite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ver cuántas veces se renderiza un componente&lt;/li&gt;
&lt;li&gt;Ver por qué se renderizó&lt;/li&gt;
&lt;li&gt;Medir el tiempo que tomó cada render&lt;/li&gt;
&lt;li&gt;Entender qué parte del árbol está causando más trabajo&lt;/li&gt;
&lt;li&gt;Comparar renders antes y después de una optimización&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Antes de usarlo, mis suposiciones eran eso: suposiciones.&lt;br&gt;
Después, tenía datos concretos.&lt;/p&gt;


&lt;h2&gt;
  
  
  📌 Cómo empezar a usarlo
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Instala React DevTools (si no lo tienes).&lt;/li&gt;
&lt;li&gt;Abre tu app en modo desarrollo.&lt;/li&gt;
&lt;li&gt;Ve a la pestaña Profiler.&lt;/li&gt;
&lt;li&gt;Haz clic en “Record”.&lt;/li&gt;
&lt;li&gt;Interactúa con la app normalmente.&lt;/li&gt;
&lt;li&gt;Detén la grabación.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Instantáneamente verás una gráfica con barras de colores.&lt;br&gt;
Cada barra representa un render del árbol de componentes.&lt;/p&gt;

&lt;p&gt;Si algo se está renderizando demasiado, lo verás ahí, sin necesidad de adivinar.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔍 Lo que más me ayudó a entender
&lt;/h2&gt;
&lt;h4&gt;
  
  
  1. Los "renders silenciosos" existen
&lt;/h4&gt;

&lt;p&gt;Hay componentes que crees que se renderizan una o dos veces… y resulta que van por la décima.&lt;/p&gt;

&lt;p&gt;El Profiler muestra exactamente cuántas veces se repintó un componente.&lt;/p&gt;
&lt;h4&gt;
  
  
  2. No todos los renders son malos
&lt;/h4&gt;

&lt;p&gt;Ver muchos renders no significa que tu app está mal.&lt;br&gt;
Lo que buscas es:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;renders muy frecuentes&lt;/li&gt;
&lt;li&gt;componentes muy costosos&lt;/li&gt;
&lt;li&gt;cascadas innecesarias desde un padre&lt;/li&gt;
&lt;li&gt;o cálculos que duran más de lo razonable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;React está diseñado para renderizar mucho sin problemas.&lt;br&gt;
El profiler te dice cuándo sí es un problema.&lt;/p&gt;
&lt;h4&gt;
  
  
  3. Los patrones "costosos" saltan a la vista
&lt;/h4&gt;

&lt;p&gt;Cosas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;funciones recreadas sin necesidad&lt;/li&gt;
&lt;li&gt;arrays y objetos nuevos en cada render&lt;/li&gt;
&lt;li&gt;componentes hijos que dependen demasiado del padre&lt;/li&gt;
&lt;li&gt;llamadas innecesarias a APIs o cálculos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Antes lo intuía.&lt;br&gt;
Ahora puedo señalar exactamente dónde pasa.&lt;/p&gt;


&lt;h2&gt;
  
  
  🛠️ Un ejemplo práctico
&lt;/h2&gt;

&lt;p&gt;Supongamos que tienes una lista grande:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function List({ items }) {
  return items.map(item =&amp;gt; &amp;lt;Item key={item.id} item={item} /&amp;gt;);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Desde fuera todo parece normal.&lt;br&gt;
Pero al perfilar, notas que List se renderiza en cada interacción, incluso una interacción que no tiene nada que ver con la lista.&lt;/p&gt;

&lt;p&gt;Ahí empiezas a cuestionarte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;¿El estado está en el lugar correcto?&lt;/li&gt;
&lt;li&gt;¿Estoy pasando props que cambian en cada render?&lt;/li&gt;
&lt;li&gt;¿Necesito React.memo en Item?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El Profiler te da el tipo de información que no obtienes leyendo código:&lt;br&gt;
&lt;strong&gt;qué pasa realmente, no qué crees que pasa.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🚦 Qué sí hacer después de perfilar
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Revisar si un cálculo tarda más de lo esperado&lt;/li&gt;
&lt;li&gt;Identificar componentes que se renderizan demasiado&lt;/li&gt;
&lt;li&gt;Ver si useMemo o React.memo harían una diferencia&lt;/li&gt;
&lt;li&gt;Confirmar si una optimización realmente funcionó&lt;/li&gt;
&lt;li&gt;Ajustar estados que deberían vivir en otros componentes&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛑 Qué NO hacer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Optimizar algo solo porque aparece muchas veces&lt;/li&gt;
&lt;li&gt;Memoizar todo “por si acaso”&lt;/li&gt;
&lt;li&gt;Añadir useCallback sin que un hijo lo necesite&lt;/li&gt;
&lt;li&gt;Asumir que un render costoso es siempre un problema (no siempre lo es)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📘 Lo más importante que aprendí
&lt;/h2&gt;

&lt;p&gt;El Profiler me ayudó a dejar de programar "por intuición" cuando se trata de performance.&lt;/p&gt;

&lt;p&gt;Hoy optimizo menos, pero optimizo mejor.&lt;br&gt;
Ya no dependo de suposiciones:&lt;br&gt;
&lt;strong&gt;si un componente está causando problemas, el Profiler me lo confirma.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🏁 Lección aprendida
&lt;/h2&gt;

&lt;p&gt;Si nunca has usado el Profiler de React, te recomiendo dedicarle 10 minutos a explorarlo.&lt;br&gt;
Es una herramienta sencilla, pero te da claridad inmediata sobre cómo realmente funciona tu UI.&lt;/p&gt;

&lt;p&gt;En el siguiente post voy a mostrar cómo interpretar una sesión completa del Profiler y cómo convertir esos datos en mejoras concretas.&lt;/p&gt;

&lt;p&gt;Nos leemos 👋&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>performance</category>
      <category>learning</category>
    </item>
    <item>
      <title>useMemo y useCallback: cuándo sí sirven… y cuándo solo estorban</title>
      <dc:creator>Leonardo Trujillo</dc:creator>
      <pubDate>Fri, 21 Nov 2025 18:53:55 +0000</pubDate>
      <link>https://forem.com/hileodev/usememo-y-usecallback-cuando-si-sirven-y-cuando-solo-estorban-3hnj</link>
      <guid>https://forem.com/hileodev/usememo-y-usecallback-cuando-si-sirven-y-cuando-solo-estorban-3hnj</guid>
      <description>&lt;p&gt;Hubo una etapa de mi vida como desarrollador donde pensaba que optimizar React significaba una cosa:&lt;br&gt;
agregar &lt;code&gt;useMemo&lt;/code&gt;y &lt;code&gt;useCallback&lt;/code&gt; a todo lo que se moviera.&lt;/p&gt;

&lt;p&gt;Si veía un cálculo, un array filtrado, una función…&lt;br&gt;
“Memoízalo, por si acaso. No vaya a ser que React sufra.”&lt;/p&gt;

&lt;p&gt;Y sí, React sufría… pero por culpa mía.&lt;/p&gt;

&lt;p&gt;Este post es sobre cómo dejé de usar memoization como si fuera una aspirina para todo, y aprendí a aplicarla solo donde realmente aporta algo.&lt;br&gt;
Si alguna vez te ha pasado que agregas &lt;code&gt;useMemo&lt;/code&gt; y tu app va más lenta, créeme, estás en el lugar correcto.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧩 La sobre-optimización que me estrelló contra la realidad
&lt;/h2&gt;

&lt;p&gt;En uno de mis primeros proyectos grandes, tenía una lista enorme que se re-renderizaba seguido. Yo, muy confiado, pensé:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"¿Cuál es la mejor forma de optimizar React?&lt;br&gt;
Fácil: memorizo todo 🥸☝🏼"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Y lo hice.&lt;br&gt;
Cada función: &lt;code&gt;useCallback&lt;/code&gt;.&lt;br&gt;
Cada array: &lt;code&gt;useMemo&lt;/code&gt;.&lt;br&gt;
Cada cálculo: &lt;code&gt;useMemo&lt;/code&gt;otra vez.&lt;br&gt;
Y practicamente así con todo ^_____^&lt;/p&gt;

&lt;p&gt;Pero algo raro pasó:&lt;br&gt;
la interfaz no iba más rápida… iba peor.&lt;/p&gt;

&lt;p&gt;Se sentía "pesada", como si React estuviera peleando contra sí mismo.&lt;/p&gt;

&lt;p&gt;Después recibí un feedback que me dejo pensando mucho:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Leo… no puedes optimizar algo que no sabes si necesita optimización."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Y ahí me cayó el veinte.&lt;/p&gt;


&lt;h2&gt;
  
  
  ⚙️ La revelación: memoization NO hace tu código más rápido
&lt;/h2&gt;

&lt;p&gt;Yo pensaba que &lt;code&gt;useMemo&lt;/code&gt; y &lt;code&gt;useCallback&lt;/code&gt;eran como un "modo turbo".&lt;br&gt;
Pero la realidad es más simple y más dura:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;useMemo&lt;/code&gt; evita un cálculo costoso&lt;br&gt;
 → Solo si ese cálculo es realmente costoso.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;useCallback&lt;/code&gt; evita que una función cambie de referencia&lt;br&gt;
→ Solo si esa función se pasa a un componente memoizado.&lt;/p&gt;

&lt;p&gt;Antes de eso, yo memorizaba filtros que tardaban 1 ms.&lt;br&gt;
O funciones que ni siquiera pasaba como prop.&lt;/p&gt;

&lt;p&gt;Era como ponerle cinturón de seguridad a una bicicleta estacionada.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔍 useMemo en la vida real (no en el tutorial)
&lt;/h2&gt;

&lt;p&gt;El propósito real:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const sortedList = useMemo(() =&amp;gt; {
  return heavySortFunction(list);
}, [list]);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si heavySortFunction tarda 100 ms, esta línea te salva la vida.&lt;br&gt;
Si tarda 0.5 ms, estás haciendo más trabajo del necesario.&lt;/p&gt;

&lt;p&gt;💭 El momento en el que lo entendí&lt;/p&gt;

&lt;p&gt;Un día estaba perfilando una app y me di cuenta de algo ridículo:&lt;br&gt;
mi useMemo estaba tardando MÁS en comparar dependencias que el cálculo real que intentaba optimizar.&lt;/p&gt;

&lt;p&gt;Ahí fue cuando dije: "Ok React, te escucho. Ya entendí."&lt;/p&gt;


&lt;h2&gt;
  
  
  🔧 useCallback: el primo que todos usan mal
&lt;/h2&gt;

&lt;p&gt;Antes:&lt;br&gt;
&lt;code&gt;useCallback(() =&amp;gt; console.log("hola"), [])&lt;/code&gt;&lt;br&gt;
en todos lados.&lt;/p&gt;

&lt;p&gt;Ahora sé que esta regla es real:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Si tu hijo no está memoizado, tu useCallback no sirve.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ejemplo real en producción:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const handleClick = useCallback(() =&amp;gt; {
  doSomething();
}, []);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si luego haces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Child onClick={handleClick} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚦 Cuándo SÍ usar memoization (sin culpa)
&lt;/h2&gt;

&lt;p&gt;Sin drama, sin misterio:&lt;/p&gt;

&lt;p&gt;✔️ 1. Cuando un cálculo es verdaderamente pesado&lt;/p&gt;

&lt;p&gt;Filtro gigante, sort complejo, cálculos matemáticos, parseo.&lt;/p&gt;

&lt;p&gt;✔️ 2. Cuando pasas funciones a un componente memoizado&lt;/p&gt;

&lt;p&gt;Ese es el matrimonio perfecto:&lt;br&gt;
React.memo + useCallback.&lt;/p&gt;

&lt;p&gt;✔️ 3. Cuando tienes listas enormes o renders costosos&lt;/p&gt;

&lt;p&gt;Si tienes 300 items en pantalla → &lt;em&gt;ahí sí vale la pena.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🛑 Cuándo NO usar memoization (cerrando ciclos tóxicos)
&lt;/h2&gt;

&lt;p&gt;Esto me cambió la vida:&lt;/p&gt;

&lt;p&gt;❌ Cuando es “por si acaso”&lt;/p&gt;

&lt;p&gt;La sobre-optimización es el cardio del sufrimiento.&lt;/p&gt;

&lt;p&gt;❌ Cuando lo que optimizas es rápido&lt;/p&gt;

&lt;p&gt;No hay nada que ahorrar.&lt;/p&gt;

&lt;p&gt;❌ Cuando el hijo no está memoizado&lt;/p&gt;

&lt;p&gt;useCallback ahí es placebo.&lt;/p&gt;

&lt;p&gt;❌ Cuando el componente es pequeño&lt;/p&gt;

&lt;p&gt;Un memo innecesario solo añade complejidad.&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 Mi checklist personal (para evitar recaer)
&lt;/h2&gt;

&lt;p&gt;Antes de usar &lt;code&gt;useMemo&lt;/code&gt; o &lt;code&gt;useCallback&lt;/code&gt;, pregúntate:&lt;/p&gt;

&lt;p&gt;¿Esto realmente es costoso?&lt;/p&gt;

&lt;p&gt;¿Estoy evitando recrear algo que sí afecta a un hijo memoizado?&lt;/p&gt;

&lt;p&gt;¿Tengo forma de medirlo?&lt;/p&gt;

&lt;p&gt;¿Si lo quito, pasa algo?&lt;/p&gt;

&lt;p&gt;¿Estoy optimizando para un caso real o para sentirme "más pro"?&lt;/p&gt;

&lt;p&gt;Si la respuesta honesta es NO…&lt;br&gt;
ciérralo.&lt;br&gt;
No memorices.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏁 Lección aprendida
&lt;/h2&gt;

&lt;p&gt;Después de entender esto, dejé de pelearme con memoization y empecé a verla como lo que es:&lt;br&gt;
una herramienta quirúrgica, no una cinta adhesiva para todo.&lt;/p&gt;

&lt;p&gt;Hoy optimizo menos, pero optimizo mejor.&lt;br&gt;
Y React me lo agradece.&lt;/p&gt;

&lt;p&gt;En el próximo post voy a hablar del Profiler de React y cómo medir renders de verdad, sin adivinar.&lt;/p&gt;

&lt;p&gt;Nos leemos 👋&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>performance</category>
      <category>react</category>
    </item>
    <item>
      <title>useMemo y useCallback: cuándo sí sirven… y cuándo solo estorban</title>
      <dc:creator>Leonardo Trujillo</dc:creator>
      <pubDate>Fri, 21 Nov 2025 18:53:55 +0000</pubDate>
      <link>https://forem.com/hileodev/usememo-y-usecallback-cuando-si-sirven-y-cuando-solo-estorban-i0i</link>
      <guid>https://forem.com/hileodev/usememo-y-usecallback-cuando-si-sirven-y-cuando-solo-estorban-i0i</guid>
      <description>&lt;p&gt;Hubo una etapa de mi vida como desarrollador donde pensaba que optimizar React significaba una cosa:&lt;br&gt;
agregar &lt;code&gt;useMemo&lt;/code&gt;y &lt;code&gt;useCallback&lt;/code&gt; a todo lo que se moviera.&lt;/p&gt;

&lt;p&gt;Si veía un cálculo, un array filtrado, una función…&lt;br&gt;
“Memoízalo, por si acaso. No vaya a ser que React sufra.”&lt;/p&gt;

&lt;p&gt;Y sí, React sufría… pero por culpa mía.&lt;/p&gt;

&lt;p&gt;Este post es sobre cómo dejé de usar memoization como si fuera una aspirina para todo, y aprendí a aplicarla solo donde realmente aporta algo.&lt;br&gt;
Si alguna vez te ha pasado que agregas &lt;code&gt;useMemo&lt;/code&gt; y tu app va más lenta, créeme, estás en el lugar correcto.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧩 La sobre-optimización que me estrelló contra la realidad
&lt;/h2&gt;

&lt;p&gt;En uno de mis primeros proyectos grandes, tenía una lista enorme que se re-renderizaba seguido. Yo, muy confiado, pensé:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"¿Cuál es la mejor forma de optimizar React?&lt;br&gt;
Fácil: memorizo todo 🥸☝🏼"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Y lo hice.&lt;br&gt;
Cada función: &lt;code&gt;useCallback&lt;/code&gt;.&lt;br&gt;
Cada array: &lt;code&gt;useMemo&lt;/code&gt;.&lt;br&gt;
Cada cálculo: &lt;code&gt;useMemo&lt;/code&gt;otra vez.&lt;br&gt;
Y practicamente así con todo ^_____^&lt;/p&gt;

&lt;p&gt;Pero algo raro pasó:&lt;br&gt;
la interfaz no iba más rápida… iba peor.&lt;/p&gt;

&lt;p&gt;Se sentía "pesada", como si React estuviera peleando contra sí mismo.&lt;/p&gt;

&lt;p&gt;Después recibí un feedback que me dejo pensando mucho:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Leo… no puedes optimizar algo que no sabes si necesita optimización."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Y ahí me cayó el veinte.&lt;/p&gt;


&lt;h2&gt;
  
  
  ⚙️ La revelación: memoization NO hace tu código más rápido
&lt;/h2&gt;

&lt;p&gt;Yo pensaba que &lt;code&gt;useMemo&lt;/code&gt; y &lt;code&gt;useCallback&lt;/code&gt;eran como un "modo turbo".&lt;br&gt;
Pero la realidad es más simple y más dura:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;useMemo&lt;/code&gt; evita un cálculo costoso&lt;br&gt;
 → Solo si ese cálculo es realmente costoso.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;useCallback&lt;/code&gt; evita que una función cambie de referencia&lt;br&gt;
→ Solo si esa función se pasa a un componente memoizado.&lt;/p&gt;

&lt;p&gt;Antes de eso, yo memorizaba filtros que tardaban 1 ms.&lt;br&gt;
O funciones que ni siquiera pasaba como prop.&lt;/p&gt;

&lt;p&gt;Era como ponerle cinturón de seguridad a una bicicleta estacionada.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔍 useMemo en la vida real (no en el tutorial)
&lt;/h2&gt;

&lt;p&gt;El propósito real:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const sortedList = useMemo(() =&amp;gt; {
  return heavySortFunction(list);
}, [list]);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si heavySortFunction tarda 100 ms, esta línea te salva la vida.&lt;br&gt;
Si tarda 0.5 ms, estás haciendo más trabajo del necesario.&lt;/p&gt;

&lt;p&gt;💭 El momento en el que lo entendí&lt;/p&gt;

&lt;p&gt;Un día estaba perfilando una app y me di cuenta de algo ridículo:&lt;br&gt;
mi useMemo estaba tardando MÁS en comparar dependencias que el cálculo real que intentaba optimizar.&lt;/p&gt;

&lt;p&gt;Ahí fue cuando dije: "Ok React, te escucho. Ya entendí."&lt;/p&gt;


&lt;h2&gt;
  
  
  🔧 useCallback: el primo que todos usan mal
&lt;/h2&gt;

&lt;p&gt;Antes:&lt;br&gt;
&lt;code&gt;useCallback(() =&amp;gt; console.log("hola"), [])&lt;/code&gt;&lt;br&gt;
en todos lados.&lt;/p&gt;

&lt;p&gt;Ahora sé que esta regla es real:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Si tu hijo no está memoizado, tu useCallback no sirve.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ejemplo real en producción:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const handleClick = useCallback(() =&amp;gt; {
  doSomething();
}, []);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si luego haces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Child onClick={handleClick} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚦 Cuándo SÍ usar memoization (sin culpa)
&lt;/h2&gt;

&lt;p&gt;Sin drama, sin misterio:&lt;/p&gt;

&lt;p&gt;✔️ 1. Cuando un cálculo es verdaderamente pesado&lt;/p&gt;

&lt;p&gt;Filtro gigante, sort complejo, cálculos matemáticos, parseo.&lt;/p&gt;

&lt;p&gt;✔️ 2. Cuando pasas funciones a un componente memoizado&lt;/p&gt;

&lt;p&gt;Ese es el matrimonio perfecto:&lt;br&gt;
React.memo + useCallback.&lt;/p&gt;

&lt;p&gt;✔️ 3. Cuando tienes listas enormes o renders costosos&lt;/p&gt;

&lt;p&gt;Si tienes 300 items en pantalla → &lt;em&gt;ahí sí vale la pena.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🛑 Cuándo NO usar memoization (cerrando ciclos tóxicos)
&lt;/h2&gt;

&lt;p&gt;Esto me cambió la vida:&lt;/p&gt;

&lt;p&gt;❌ Cuando es “por si acaso”&lt;/p&gt;

&lt;p&gt;La sobre-optimización es el cardio del sufrimiento.&lt;/p&gt;

&lt;p&gt;❌ Cuando lo que optimizas es rápido&lt;/p&gt;

&lt;p&gt;No hay nada que ahorrar.&lt;/p&gt;

&lt;p&gt;❌ Cuando el hijo no está memoizado&lt;/p&gt;

&lt;p&gt;useCallback ahí es placebo.&lt;/p&gt;

&lt;p&gt;❌ Cuando el componente es pequeño&lt;/p&gt;

&lt;p&gt;Un memo innecesario solo añade complejidad.&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 Mi checklist personal (para evitar recaer)
&lt;/h2&gt;

&lt;p&gt;Antes de usar &lt;code&gt;useMemo&lt;/code&gt; o &lt;code&gt;useCallback&lt;/code&gt;, pregúntate:&lt;/p&gt;

&lt;p&gt;¿Esto realmente es costoso?&lt;/p&gt;

&lt;p&gt;¿Estoy evitando recrear algo que sí afecta a un hijo memoizado?&lt;/p&gt;

&lt;p&gt;¿Tengo forma de medirlo?&lt;/p&gt;

&lt;p&gt;¿Si lo quito, pasa algo?&lt;/p&gt;

&lt;p&gt;¿Estoy optimizando para un caso real o para sentirme "más pro"?&lt;/p&gt;

&lt;p&gt;Si la respuesta honesta es NO…&lt;br&gt;
ciérralo.&lt;br&gt;
No memorices.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏁 Lección aprendida
&lt;/h2&gt;

&lt;p&gt;Después de entender esto, dejé de pelearme con memoization y empecé a verla como lo que es:&lt;br&gt;
una herramienta quirúrgica, no una cinta adhesiva para todo.&lt;/p&gt;

&lt;p&gt;Hoy optimizo menos, pero optimizo mejor.&lt;br&gt;
Y React me lo agradece.&lt;/p&gt;

&lt;p&gt;En el próximo post voy a hablar del Profiler de React y cómo medir renders de verdad, sin adivinar.&lt;/p&gt;

&lt;p&gt;Nos leemos 👋&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>performance</category>
      <category>react</category>
    </item>
    <item>
      <title>Por qué React no es magia: lo entendí cuando dejé de pelearme con los renders</title>
      <dc:creator>Leonardo Trujillo</dc:creator>
      <pubDate>Fri, 14 Nov 2025 23:26:24 +0000</pubDate>
      <link>https://forem.com/hileodev/por-que-react-no-es-magia-lo-entendi-cuando-deje-de-pelearme-con-los-renders-29n2</link>
      <guid>https://forem.com/hileodev/por-que-react-no-es-magia-lo-entendi-cuando-deje-de-pelearme-con-los-renders-29n2</guid>
      <description>&lt;p&gt;Cuando empecé a usar React, había algo que me frustraba más que los warnings rojos en consola: no entendía por qué mis componentes se renderizaban cuando yo “no había tocado nada”.&lt;/p&gt;

&lt;p&gt;Era como si React tuviera vida propia.&lt;br&gt;
Un día funcionaba perfecto, al siguiente estaba renderizando como si le debieran dinero.&lt;/p&gt;

&lt;p&gt;Con el tiempo (y muchos cafés), me di cuenta de que no era React… era yo.&lt;br&gt;
O más bien, era que yo no entendía cómo React tomaba decisiones, por decirlo de alguna manera.&lt;/p&gt;

&lt;p&gt;Este post es justo sobre eso: cómo dejé de ver el render como magia negra y empecé a entenderlo paso a paso.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧩 OK... empecemos. Lo primero que entendí: React renderiza más de lo que imaginamos
&lt;/h2&gt;

&lt;p&gt;Yo creía que “renderizar” era sinónimo de “modificar el DOM”.&lt;br&gt;
Y no. Para nada.&lt;/p&gt;

&lt;p&gt;React siempre hace un render interno: recalcula, compara, analiza.&lt;br&gt;
Pero eso no significa que vaya a tocar el DOM cada vez.&lt;/p&gt;

&lt;p&gt;La primera vez que hice esto, algo hizo clic en mi cabeza:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function Counter() {
  const [count, setCount] = useState(0);

  console.log("Render...");

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;p&amp;gt;Contador: {count}&amp;lt;/p&amp;gt;
      &amp;lt;button onClick={() =&amp;gt; setCount(count + 1)}&amp;gt;Sumar&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada clic = un render.&lt;br&gt;
Pero el DOM… tranquilo, sin movimientos innecesarios.&lt;/p&gt;

&lt;p&gt;Ese fue mi primer “aha moment 🥸☝🏼”.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔁 Luego descubrí la parte dolorosa: los renders en cascada
&lt;/h2&gt;

&lt;p&gt;Tenía un componente padre que actualizaba un estado, y un hijo que solo mostraba un texto.&lt;br&gt;
Nada del otro mundo… hasta que vi que el hijo estaba renderizando con cada letra que escribía.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function Parent() {
  const [text, setText] = useState("");

  return (
    &amp;lt;&amp;gt;
      &amp;lt;input value={text} onChange={e =&amp;gt; setText(e.target.value)} /&amp;gt;
      &amp;lt;Child value={text} /&amp;gt;
    &amp;lt;/&amp;gt;
  );
}

function Child({ value }) {
  console.log("Child renderizado");
  return &amp;lt;p&amp;gt;{value}&amp;lt;/p&amp;gt;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mi reacción:🤬&lt;br&gt;
“¿Por qué el hijo también? ¡Si solo cambió el input!”&lt;/p&gt;

&lt;p&gt;React:🥱&lt;br&gt;
“Amigo… el padre cambió. ¿Qué esperabas?”&lt;/p&gt;

&lt;p&gt;Ahí entendí otra verdad incómoda:&lt;br&gt;
cuando un padre renderiza, sus hijos van con él — aunque no te guste.&lt;/p&gt;


&lt;h2&gt;
  
  
  ⚙️ Y finalmente entendí el antídoto (cuando de verdad hace falta)
&lt;/h2&gt;

&lt;p&gt;No todo se arregla con &lt;code&gt;useMemo&lt;/code&gt;, &lt;code&gt;useCallback&lt;/code&gt; o &lt;code&gt;React.memo&lt;/code&gt;.&lt;br&gt;
De hecho, yo los usaba como si fueran vitaminas diarias. Error.&lt;/p&gt;

&lt;p&gt;Pero cuando el render empieza a afectar la experiencia, ahí sí ayudan.&lt;/p&gt;

&lt;p&gt;El primer verdadero alivio lo sentí así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const Child = React.memo(function Child({ value }) {
  console.log("Child renderizado");
  return &amp;lt;p&amp;gt;{value}&amp;lt;/p&amp;gt;;
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con eso:&lt;/p&gt;

&lt;p&gt;El input fluía sin lag&lt;/p&gt;

&lt;p&gt;El hijo solo renderizaba cuando su prop cambiaba&lt;/p&gt;

&lt;p&gt;Y yo dejé de sentir que React me estaba saboteando&lt;/p&gt;

&lt;p&gt;¿La moraleja?&lt;br&gt;
La optimización sirve cuando hay un problema real, no cuando estás nervioso y optimizas por reflejo.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 Lo que realmente me cambió la perspectiva
&lt;/h2&gt;

&lt;p&gt;Hubo una frase que me cambió todo:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;React no intenta adivinar lo que quieres.&lt;br&gt;
Solo responde a los cambios que tú mismo provocas, aunque no te des cuenta.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Cuando entendí eso, muchas cosas se acomodaron:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pensé mejor dónde vive cada estado&lt;/li&gt;
&lt;li&gt;Dejé de pasar props inútiles&lt;/li&gt;
&lt;li&gt;Empecé a evitar renders por costumbre&lt;/li&gt;
&lt;li&gt;Y escribí componentes con más intención&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;De repente, esos “renders misteriosos” dejaron de aparecer.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏁 Conclusión/Aprendizaje
&lt;/h2&gt;

&lt;p&gt;No escribo esto porque sea experto en renders, sino porque durante mucho tiempo me parecieron un misterio.&lt;br&gt;
Y cuando finalmente los entendí, React dejó de ser frustrante y se volvió divertido.&lt;/p&gt;

&lt;p&gt;Si tú también sentiste alguna vez que React “renderiza por capricho”, espero que este post te dé claridad.&lt;/p&gt;

&lt;p&gt;La próxima semana voy a hablar de algo que todos usamos, pero pocos entienden realmente:&lt;br&gt;
useMemo y useCallback — cuándo sí sirven y cuándo solo estorban.&lt;/p&gt;

&lt;p&gt;Nos leemos 👋&lt;/p&gt;

</description>
      <category>react</category>
      <category>frontend</category>
      <category>javascript</category>
      <category>performance</category>
    </item>
    <item>
      <title>Por qué decidí compartir lo que sé (y lo que sigo aprendiendo) sobre desarrollo web</title>
      <dc:creator>Leonardo Trujillo</dc:creator>
      <pubDate>Thu, 06 Nov 2025 01:02:51 +0000</pubDate>
      <link>https://forem.com/hileodev/por-que-decidi-compartir-lo-que-se-y-lo-que-sigo-aprendiendo-sobre-desarrollo-web-351</link>
      <guid>https://forem.com/hileodev/por-que-decidi-compartir-lo-que-se-y-lo-que-sigo-aprendiendo-sobre-desarrollo-web-351</guid>
      <description>&lt;p&gt;Después de varios años construyendo productos web — desde sitios que apenas cargaban hasta apps complejas con muchos usuarios — entendí algo que suena obvio, pero que muchos olvidamos o al menos yo olvidé: aprender solo no tiene el mismo valor que aprender y compartir.&lt;/p&gt;

&lt;p&gt;Así que decidí abrir este espacio.&lt;br&gt;
No para presumir lo que sé, sino para poner en palabras las cosas que me hubiera gustado leer cuando empecé (y también las que sigo descubriendo hoy).&lt;/p&gt;

&lt;p&gt;Cada semana voy a publicar un post sobre desarrollo frontend, React, performance y buenas prácticas. Desde lo más básico hasta temas más avanzados, con ejemplos reales, errores que me dolieron y soluciones que me funcionaron.&lt;/p&gt;

&lt;p&gt;Si te interesa construir experiencias web más rápidas, entendibles y humanas, te invito a seguirme en este viaje.&lt;/p&gt;

&lt;p&gt;⚙️ Tecnologías que suelo usar: React, Next.js, TypeScript, Tailwind, Redux, y todo lo que ayude a crear productos con impacto real.&lt;/p&gt;

&lt;p&gt;🚀 Mi meta personal: compartir, aprender con la comunidad.&lt;/p&gt;

&lt;p&gt;Nos leemos cada semana (espero 😬).&lt;/p&gt;

&lt;p&gt;— Leo Trujillo&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
