<?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>DEV Community: Victor Badaró</title>
    <description>The latest articles on DEV Community by Victor Badaró (@victorbadaro).</description>
    <link>https://dev.to/victorbadaro</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%2F365256%2Fa4c412ea-0f2d-492e-902f-e655900a4233.png</url>
      <title>DEV Community: Victor Badaró</title>
      <link>https://dev.to/victorbadaro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/victorbadaro"/>
    <language>en</language>
    <item>
      <title>🚀 Melhore a Performance do Seu App React com o AbortController!</title>
      <dc:creator>Victor Badaró</dc:creator>
      <pubDate>Sat, 07 Sep 2024 05:03:13 +0000</pubDate>
      <link>https://dev.to/victorbadaro/melhore-a-performance-do-seu-app-react-com-o-abortcontroller-2mkg</link>
      <guid>https://dev.to/victorbadaro/melhore-a-performance-do-seu-app-react-com-o-abortcontroller-2mkg</guid>
      <description>&lt;p&gt;Se você trabalha com React, provavelmente já se deparou com a necessidade de fazer requisições HTTP dentro dos seus componentes. Mas como evitar requisições desnecessárias que podem impactar a performance do seu app e a experiência do usuário? A resposta pode estar no &lt;strong&gt;AbortController&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;✨ O AbortController é uma API nativa do Javascript que permite cancelar uma requisição HTTP antes que ela seja finalizada. Isso é extremamente útil em cenários onde o componente que disparou a requisição se torna &lt;em&gt;unmounted&lt;/em&gt; (é desmontado/retirado de tela - numa troca de página, por exemplo) antes do retorno da mesma, ou quando queremos evitar múltiplas requisições simultâneas em casos onde apenas a última resposta é relevante.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como Utilizar o &lt;u&gt;AbortController&lt;/u&gt; no &lt;u&gt;React&lt;/u&gt;? 🤔
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Criação do Controller&lt;/strong&gt;: Dentro do &lt;em&gt;useEffect&lt;/em&gt;, crie uma instância do AbortController e passe o &lt;em&gt;signal&lt;/em&gt; para a sua requisição &lt;em&gt;fetch&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cancelamento da Requisição&lt;/strong&gt;: No retorno da função &lt;em&gt;useEffect&lt;/em&gt;, chame o método &lt;em&gt;abort()&lt;/em&gt; para cancelar a requisição no &lt;em&gt;unmount&lt;/em&gt; do componente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Manuseio de Erros&lt;/strong&gt;: Lembre-se de tratar o erro de "requisição abortada" para evitar mensagens desnecessárias no console.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AbortController&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;signal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;;&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;https://api.exemplo.com/dados&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;signal&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&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;error&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&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;error&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;AbortError&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;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;Erro na requisição:&lt;/span&gt;&lt;span class="dl"&gt;'&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="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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/*
      Cancela a requisição se o componente for unmounted
      (for desmontado/sair da tela)
    */&lt;/span&gt;
    &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abort&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="p"&gt;[]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;💡 Com essa abordagem, você melhora a performance do seu app, evita bugs e garante uma experiência mais fluida para o usuário.&lt;/p&gt;

&lt;p&gt;E você? Já utiliza o &lt;strong&gt;AbortController&lt;/strong&gt; nos seus projetos? Compartilhe suas experiências e dicas nos comentários!&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>react</category>
      <category>performance</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Como Criar um Botão de Submit Fora da tag &lt;form&gt;</title>
      <dc:creator>Victor Badaró</dc:creator>
      <pubDate>Tue, 08 Feb 2022 20:16:55 +0000</pubDate>
      <link>https://dev.to/victorbadaro/como-criar-um-botao-de-submit-fora-da-tag-2e00</link>
      <guid>https://dev.to/victorbadaro/como-criar-um-botao-de-submit-fora-da-tag-2e00</guid>
      <description>&lt;p&gt;Nem sempre o melhor lugar para se colocar o botão de &lt;em&gt;submit&lt;/em&gt; é dentro da tag &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt;. Em alguns casos é preferível que ele esteja fora dessa tag (por questões de layout por exemplo).&lt;/p&gt;

&lt;h3&gt;
  
  
  Como fazer?
&lt;/h3&gt;

&lt;p&gt;É muito simples. O próprio &lt;code&gt;HTML&lt;/code&gt; já torna isso possível. De que forma? Basta seguir dois passos simples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Declarar um &lt;strong&gt;id&lt;/strong&gt; para o formulário
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"my-form"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
...
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Informar o &lt;strong&gt;id&lt;/strong&gt; do formulário no atributo &lt;strong&gt;form&lt;/strong&gt; do botão que irá submeter o formulário (esse botão pode estar em qualquer lugar na árvore de elementos. Dentro ou fora da tag &lt;code&gt;form&lt;/code&gt;).
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;form=&lt;/span&gt;&lt;span class="s"&gt;"my-form"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Submit Button&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Legal né? 🙂&lt;/p&gt;

</description>
      <category>html</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
