<?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: Marcelo Petry</title>
    <description>The latest articles on DEV Community by Marcelo Petry (@mpetry).</description>
    <link>https://dev.to/mpetry</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%2F766163%2F78e71423-3f2d-4931-a4aa-97bb7da51dbf.JPG</url>
      <title>DEV Community: Marcelo Petry</title>
      <link>https://dev.to/mpetry</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mpetry"/>
    <language>en</language>
    <item>
      <title>⚔React vs. Vue.js: A Batalha dos Gigantes do Front-end</title>
      <dc:creator>Marcelo Petry</dc:creator>
      <pubDate>Tue, 21 Mar 2023 00:10:40 +0000</pubDate>
      <link>https://dev.to/mpetry/react-vs-vuejs-a-batalha-dos-gigantes-do-front-end-2pdk</link>
      <guid>https://dev.to/mpetry/react-vs-vuejs-a-batalha-dos-gigantes-do-front-end-2pdk</guid>
      <description>&lt;p&gt;Se você é um desenvolvedor iniciante ou alguém procurando mudar para um novo framework, esta batalha épica irá ajudá-lo a entender as semelhanças e diferenças entre React e Vue.js. Vamos explorar o que torna cada um deles especial, comparar seus recursos e capacidades, e descobrir qual deles é a melhor escolha para o seu próximo projeto.&lt;/p&gt;

&lt;p&gt;Antes de entrarmos na ação, vamos nos familiarizar brevemente com nossos competidores. React é uma biblioteca JavaScript criada pelo Facebook, focada em criar interfaces de usuário ricas e interativas. Ele ganhou popularidade rapidamente desde seu lançamento em 2013, e é utilizado por empresas como Airbnb, Netflix e Instagram.&lt;/p&gt;

&lt;p&gt;Vue.js, por outro lado, é um framework JavaScript progressivo criado por Evan You, ex-funcionário do Google. Lançado em 2014, Vue.js se orgulha de ser fácil de aprender e integrar, e tem uma comunidade crescente de entusiastas e contribuidores. Algumas empresas que usam Vue.js incluem Alibaba, Xiaomi e GitLab.&lt;/p&gt;

&lt;p&gt;Neste artigo, abordaremos tópicos como sintaxe, gerenciamento de estado, desempenho, curva de aprendizado e muito mais. Ao final, você terá uma visão clara das vantagens e desvantagens de cada framework e estará pronto para tomar uma decisão informada sobre qual deles é o melhor ajuste para as suas necessidades.&lt;/p&gt;

&lt;p&gt;Neste guia, você verá:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
 1. Comparação entre React e Vue.js
&lt;/li&gt;
&lt;li&gt;
 1.1 Componentização
&lt;/li&gt;
&lt;li&gt;
 1.1.1 Componentes React:
&lt;/li&gt;
&lt;li&gt;
 1.1.2 Componentes Vue.js
&lt;/li&gt;
&lt;li&gt;
 1.2 Propriedades (props) e comunicação entre componentes
&lt;/li&gt;
&lt;li&gt;
 1.2.1 React Props:
&lt;/li&gt;
&lt;li&gt;
 1.2.2 Propriedades em Vue.js:
&lt;/li&gt;
&lt;li&gt;
 1.3 Virtual DOM e atualizações eficientes do DOM real
&lt;/li&gt;
&lt;li&gt;
 1.3.1 DOM (Document Object Model)
&lt;/li&gt;
&lt;li&gt;
 1.3.1.1 Árvores DOM
&lt;/li&gt;
&lt;li&gt;
 1.3.1.2 DOM Real
&lt;/li&gt;
&lt;li&gt;
 1.3.1.3 Virtual DOM
&lt;/li&gt;
&lt;li&gt;
 1.3.2 DOM em React:
&lt;/li&gt;
&lt;li&gt;
 1.3.3 DOM em Vue.js:
&lt;/li&gt;
&lt;li&gt;
 1.4 Ecossistema e integrações com outras bibliotecas e ferramentas
&lt;/li&gt;
&lt;li&gt;
 1.5 Arquitetura e estrutura
&lt;/li&gt;
&lt;li&gt;
 1.5.1 Comparação da arquitetura de ambos os frameworks
&lt;/li&gt;
&lt;li&gt;
 1.5.1.1 Arquitetura do React:
&lt;/li&gt;
&lt;li&gt;
 1.5.1.2 Arquitetura do Vue.js:
&lt;/li&gt;
&lt;li&gt;
 1.5.2 Diferenças Fundamentais de Arquitetura
&lt;/li&gt;
&lt;li&gt;
 1.5.3 Estrutura de diretórios e organização de projetos
&lt;/li&gt;
&lt;li&gt;
 1.5.3.1 Estrutura de Diretórios em React:
&lt;/li&gt;
&lt;li&gt;
 1.5.3.1 Estrutura de Diretórios em Vue.js:
&lt;/li&gt;
&lt;li&gt;
 1.5.4 Diferenças fundamentais na organização de diretórios
&lt;/li&gt;
&lt;li&gt;
 2. Diferenças na sintaxe e estilo de programação
&lt;/li&gt;
&lt;li&gt;
 2.1 JSX no React
&lt;/li&gt;
&lt;li&gt;
 2.2 Templates no Vue.js
&lt;/li&gt;
&lt;li&gt;
 2.3 Comparação de sintaxe entre React e Vue.js
&lt;/li&gt;
&lt;li&gt;
 2.4 Diretivas do Vue.js e como elas se comparam ao React
&lt;/li&gt;
&lt;li&gt;
 2.4.1 v-if e v-else
&lt;/li&gt;
&lt;li&gt;
 2.4.2 v-for
&lt;/li&gt;
&lt;li&gt;
 2.4.3 v-model
&lt;/li&gt;
&lt;li&gt;
 2.5 Estilos
&lt;/li&gt;
&lt;li&gt;
 2.5.1 Estilos em React
&lt;/li&gt;
&lt;li&gt;
 2.5.1.1 Estilos inline
&lt;/li&gt;
&lt;li&gt;
 2.5.1.2 Tailwind CSS
&lt;/li&gt;
&lt;li&gt;
 2.5.1.3 Folhas de estilo externas (CSS)
&lt;/li&gt;
&lt;li&gt;
 2.5.2 Estilos em Vue.js
&lt;/li&gt;
&lt;li&gt;
 2.5.2.1 Estilos inline
&lt;/li&gt;
&lt;li&gt;
 2.5.2.2 Folhas de estilo externas
&lt;/li&gt;
&lt;li&gt;
 2.5.2.3 Estilos de escopo (scoped styles)
&lt;/li&gt;
&lt;li&gt;
 3. Gerenciamento de estado e fluxo de dados
&lt;/li&gt;
&lt;li&gt;
 3.1 Abordagem do React com o Redux
&lt;/li&gt;
&lt;li&gt;
 3.2 Abordagem do Vue.js com o Vuex
&lt;/li&gt;
&lt;li&gt;
 4. Curva de aprendizado e documentação
&lt;/li&gt;
&lt;li&gt;
 4.1 Nível de dificuldade para aprender React
&lt;/li&gt;
&lt;li&gt;
 4.2 Nível de dificuldade para aprender Vue.js
&lt;/li&gt;
&lt;li&gt;
 4.3 Qualidade e abrangência da documentação
&lt;/li&gt;
&lt;li&gt;
 4.3.1 Documentação do React
&lt;/li&gt;
&lt;li&gt;
 4.3.2 Documentação do Vue.js
&lt;/li&gt;
&lt;li&gt;
 5. Desempenho e otimizações
&lt;/li&gt;
&lt;li&gt;
 5.1 Comparação de desempenho entre React e Vue.js
&lt;/li&gt;
&lt;li&gt;
 5.1.1 Tamanho do bundle
&lt;/li&gt;
&lt;li&gt;
 5.1.2 Velocidade de renderização
&lt;/li&gt;
&lt;li&gt;
 5.1.3 Uso de memória
&lt;/li&gt;
&lt;li&gt;
 5.2 Otimizações disponíveis em cada framework
&lt;/li&gt;
&lt;li&gt;
 5.2.1 Otimizações no React:
&lt;/li&gt;
&lt;li&gt;
 5.2.2 Otimizações no Vue.js:
&lt;/li&gt;
&lt;li&gt;
 6. Comunidade e ecossistema
&lt;/li&gt;
&lt;li&gt;
 6.1 Comparação do tamanho da comunidade e contribuições
&lt;/li&gt;
&lt;li&gt;
 6.2 Disponibilidade de bibliotecas e plugins de terceiros
&lt;/li&gt;
&lt;li&gt;
 6.2.1 Bibliotecas React
&lt;/li&gt;
&lt;li&gt;
 6.2.2 Bibliotecas Vue.js
&lt;/li&gt;
&lt;li&gt;
 Considerações Finais
&lt;/li&gt;
&lt;li&gt;
 Resumo das principais semelhanças e diferenças
&lt;/li&gt;
&lt;li&gt;
 Orientação sobre como escolher entre React e Vue.js &lt;/li&gt;
&lt;/ul&gt;






&lt;h1&gt;
  
  
  1. Comparação entre React e Vue.js
&lt;/h1&gt;

&lt;p&gt;Nesta seção, vamos explorar os pontos em comum entre esses dois frameworks. Embora eles possam ter suas diferenças, também compartilham várias características fundamentais.&lt;/p&gt;

&lt;p&gt;Discutiremos as semelhanças entre React e Vue.js, destacando áreas como componentização, comunicação entre componentes e uso do Virtual DOM. Essas semelhanças são cruciais para entender por que React e Vue.js são tão populares e eficazes na criação de interfaces de usuário modernas e responsivas.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  1.1 Componentização
&lt;/h2&gt;

&lt;p&gt;A componentização é um conceito central tanto no React quanto no Vue.js. Ela é a base para construir interfaces de usuário &lt;strong&gt;modulares&lt;/strong&gt; e &lt;strong&gt;reutilizáveis&lt;/strong&gt;, dividindo a aplicação em &lt;strong&gt;pequenas partes independentes&lt;/strong&gt; chamadas &lt;strong&gt;componentes&lt;/strong&gt;. Os componentes facilitam a manutenção, melhoram a legibilidade do código e ajudam a isolar a lógica e a apresentação.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  1.1.1 Componentes React:
&lt;/h3&gt;

&lt;p&gt;No React, um componente é uma classe ou função que retorna um elemento &lt;strong&gt;JSX&lt;/strong&gt;. Um exemplo simples de um componente React é o seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Welcome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Olá&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&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="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Welcome&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, criamos um componente funcional chamado "Welcome", que recebe um objeto chamado "props" como argumento. O componente retorna um elemento JSX com um título e o nome passado como propriedade. Para usar este componente em outro lugar, você importa e o inclui em outro componente, assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Welcome&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Welcome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;App&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Welcome&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="s2"&gt;João&lt;/span&gt;&lt;span class="dl"&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="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;h3&gt;
  
  
  1.1.2 Componentes Vue.js
&lt;/h3&gt;

&lt;p&gt;No Vue.js, um componente é definido como um objeto JavaScript com opções, como &lt;code&gt;data&lt;/code&gt;, &lt;code&gt;methods&lt;/code&gt;, &lt;code&gt;computed&lt;/code&gt; e &lt;code&gt;template&lt;/code&gt;. Um exemplo simples de um componente Vue.js é o seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Olá, &lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;!&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&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="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, criamos um componente chamado "Welcome" com um &lt;code&gt;template&lt;/code&gt; que contém um título e a variável &lt;code&gt;name&lt;/code&gt; interpolada. A propriedade &lt;code&gt;name&lt;/code&gt; é definida como uma prop no objeto exportado. Para usar este componente em outro lugar, você o importa e o inclui em outro componente, assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Welcome&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"João"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Welcome&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Welcome.vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Welcome&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como você pode ver, tanto React quanto Vue.js seguem um padrão semelhante para criar e usar componentes. Ambos os frameworks incentivam a reutilização de componentes e a separação de preocupações, facilitando o desenvolvimento de interfaces de usuário escaláveis e de fácil manutenção.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  1.2 Propriedades (props) e comunicação entre componentes
&lt;/h2&gt;

&lt;p&gt;As propriedades, ou "props", são um mecanismo fundamental para a comunicação entre componentes tanto no React quanto no Vue.js. Elas permitem que você passe informações de um componente pai para um componente filho, facilitando a reutilização de componentes e a separação de responsabilidades.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  1.2.1 React Props:
&lt;/h3&gt;

&lt;p&gt;No React, você passa dados de um componente pai para um componente filho por meio de "props". As propriedades são como atributos HTML personalizados que você define ao usar um componente, permitindo que você forneça informações ao componente filho. Veja um exemplo de como passar propriedades no React:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;UserProfile&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./UserProfile&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;App&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;UserProfile&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jose123&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, passamos as propriedades &lt;code&gt;username&lt;/code&gt; e &lt;code&gt;age&lt;/code&gt; para o componente &lt;code&gt;UserProfile&lt;/code&gt;. O componente filho, &lt;code&gt;UserProfile&lt;/code&gt;, pode então acessar os valores dessas propriedades através do objeto &lt;code&gt;props&lt;/code&gt;. Veja como o componente &lt;code&gt;UserProfile&lt;/code&gt; usa as propriedades &lt;code&gt;username&lt;/code&gt; e &lt;code&gt;age&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;UserProfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&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;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Nome&lt;/span&gt; &lt;span class="nx"&gt;de&lt;/span&gt; &lt;span class="nx"&gt;usuário&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Idade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;UserProfile&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;h3&gt;
  
  
  1.2.2 Propriedades em Vue.js:
&lt;/h3&gt;

&lt;p&gt;No Vue.js, a comunicação entre componentes pai e filho é semelhante ao React. Você passa dados de um componente pai para um componente filho por meio de "props". Aqui está um exemplo de como passar propriedades no Vue.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;UserProfile&lt;/span&gt; &lt;span class="na"&gt;:username=&lt;/span&gt;&lt;span class="s"&gt;"'jose123'"&lt;/span&gt; &lt;span class="na"&gt;:age=&lt;/span&gt;&lt;span class="s"&gt;"30"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;UserProfile&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./UserProfile.vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;UserProfile&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, passamos as propriedades &lt;code&gt;username&lt;/code&gt; e &lt;code&gt;age&lt;/code&gt; para o componente &lt;code&gt;UserProfile&lt;/code&gt;. O componente filho, &lt;code&gt;UserProfile&lt;/code&gt;, pode então acessar os valores dessas propriedades como &lt;code&gt;props&lt;/code&gt;. Veja como o componente &lt;code&gt;UserProfile&lt;/code&gt; usa as propriedades &lt;code&gt;username&lt;/code&gt; e &lt;code&gt;age&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Nome de usuário: &lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Idade: &lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;age&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="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É importante notar que as propriedades em ambos os frameworks são de &lt;strong&gt;"fluxo unidirecional"&lt;/strong&gt;. Isso significa que os dados fluem &lt;strong&gt;apenas do componente pai para o componente filho&lt;/strong&gt;, e não vice-versa. Se você precisa comunicar informações do componente filho para o componente pai, você deve usar eventos personalizados no Vue.js ou "callbacks" no React.&lt;/p&gt;

&lt;p&gt;Tanto React quanto Vue.js utilizam propriedades para a comunicação entre componentes, proporcionando uma maneira consistente e previsível de passar dados de um componente pai para um componente filho. Isso facilita o desenvolvimento de interfaces de usuário modulares e a separação de responsabilidades em suas aplicações.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  1.3 Virtual DOM e atualizações eficientes do DOM real
&lt;/h2&gt;

&lt;p&gt;O Virtual DOM é uma técnica de otimização de desempenho empregada tanto pelo React quanto pelo Vue.js. Ele consiste em uma representação em memória do Document Object Model (DOM) real do navegador, que é atualizado de forma mais eficiente antes de ser renderizado na tela. Caso você não seja familizarizado com os conceitos de DOM, acompanhe a subseção abaixo para entender melhor.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  1.3.1 DOM (Document Object Model)
&lt;/h3&gt;

&lt;p&gt;O Document Object Model, ou simplesmente DOM, é uma representação estruturada de um documento HTML ou XML. Em outras palavras, é a maneira como os navegadores interpretam e organizam o conteúdo de uma página da web. O DOM transforma o código HTML em uma estrutura de objetos interconectados, que podem ser manipulados e atualizados através de linguagens de programação como JavaScript.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  1.3.1.1 Árvores DOM
&lt;/h4&gt;

&lt;p&gt;Quando falamos em "árvore de DOM", estamos nos referindo à estrutura hierárquica criada pelos elementos HTML (tags) do documento. Essa árvore começa com um &lt;strong&gt;nó raiz (geralmente o elemento &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;)&lt;/strong&gt;, e cada elemento subsequente do documento é representado por &lt;strong&gt;nós que se ramificam dessa raiz&lt;/strong&gt;. Por exemplo, a árvore de DOM de um documento HTML simples pode ser representada da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;html&lt;/span&gt;
 &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;head&lt;/span&gt;
 &lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;title&lt;/span&gt;
 &lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;link&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;stylesheet&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
 &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;body&lt;/span&gt;
      &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;header&lt;/span&gt;
      &lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;h1&lt;/span&gt;
      &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;main&lt;/span&gt;
      &lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;h2&lt;/span&gt;
      &lt;span class="err"&gt;│&lt;/span&gt;    &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;p&lt;/span&gt;
      &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;footer&lt;/span&gt;
           &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;small&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa estrutura ilustra como os elementos HTML estão organizados hierarquicamente, em uma relação de pais e filhos e nos ajuda a entender como os navegadores interpretam e constroem a interface de usuário a partir do código HTML.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  1.3.1.2 DOM Real
&lt;/h4&gt;

&lt;p&gt;O "DOM real" é a representação do DOM em um navegador web, que é construído a partir do código HTML fornecido. O DOM real é responsável por exibir e gerenciar a interface de usuário de uma página da web. Quando você interage com uma página da web, como clicar em um botão ou preencher um formulário, o DOM real é atualizado para refletir essas alterações.&lt;/p&gt;

&lt;p&gt;No entanto, atualizar o DOM real pode ser um processo lento e que consome recursos. Isso ocorre porque, sempre que uma parte do DOM real é alterada, o navegador precisa recalcular o layout, repintar a tela e executar outras tarefas que podem levar tempo, especialmente em aplicações web complexas.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  1.3.1.3 Virtual DOM
&lt;/h4&gt;

&lt;p&gt;Para resolver o problema de desempenho na atualização do DOM real, o conceito de "Virtual DOM" foi introduzido. O Virtual DOM é uma representação em memória do DOM real, geralmente implementada como objetos JavaScript. Ele atua como uma camada intermediária entre as atualizações de estado da aplicação e a atualização do DOM real.&lt;/p&gt;

&lt;p&gt;A ideia principal do Virtual DOM é minimizar a quantidade de trabalho que o navegador precisa realizar para atualizar a interface do usuário. Em vez de atualizar o DOM real toda vez que algo muda, as atualizações são feitas primeiro no Virtual DOM. Em seguida, o navegador compara o Virtual DOM atualizado com o Virtual DOM anterior e calcula a diferença entre os dois, conhecida como "diff". Após calcular a diferença, apenas as alterações necessárias são aplicadas ao DOM real, o que resulta em uma atualização muito mais rápida e eficiente da interface do usuário.&lt;/p&gt;

&lt;p&gt;Em resumo, o &lt;strong&gt;DOM é a representação estruturada de um documento HTML&lt;/strong&gt;, e o &lt;strong&gt;DOM real&lt;/strong&gt; é a &lt;strong&gt;versão do DOM que é gerenciada e renderizada pelo navegador&lt;/strong&gt;. O &lt;strong&gt;Virtual DOM&lt;/strong&gt; é uma &lt;strong&gt;otimização que minimiza a quantidade de atualizações que precisam ser feitas no DOM real&lt;/strong&gt;, melhorando o desempenho e a experiência do usuário.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  1.3.2 DOM em React:
&lt;/h3&gt;

&lt;p&gt;No React, o Virtual DOM é um objeto JavaScript que representa a estrutura do DOM real. Quando o estado de um componente é alterado, o React cria uma nova árvore Virtual DOM e calcula a diferença entre a nova árvore e a árvore anterior, um processo chamado &lt;strong&gt;"reconciliação"&lt;/strong&gt;. Em seguida, o React atualiza apenas os nós do DOM real que foram alterados, em vez de atualizar todo o DOM. Isso torna a atualização do DOM real mais rápida e eficiente.&lt;/p&gt;

&lt;p&gt;Vejamos um exemplo de como o React utiliza o Virtual DOM ao atualizar o estado de um componente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Importa o React e o hook "useState" para gerenciar o estado do componente&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Cria um componente funcional chamado "Counter"&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Define o estado "count" e a função "setCount" para atualizá-lo&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;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Retorna o JSX que será renderizado no DOM real&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;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&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;/* Exibe o valor atual de "count" */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Você&lt;/span&gt; &lt;span class="nx"&gt;clicou&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;vezes&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* Define um manipulador de clique que atualiza o valor de "count" */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Clique&lt;/span&gt; &lt;span class="nx"&gt;aqui&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;// Exporta o componente "Counter"&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, temos um componente &lt;code&gt;Counter&lt;/code&gt; com um estado &lt;code&gt;count&lt;/code&gt;. Quando o usuário clica no botão, o estado &lt;code&gt;count&lt;/code&gt; é atualizado. O React automaticamente cria uma nova árvore Virtual DOM, compara-a com a árvore anterior e &lt;strong&gt;atualiza apenas&lt;/strong&gt; os &lt;strong&gt;nós afetados&lt;/strong&gt; no DOM real.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  1.3.3 DOM em Vue.js:
&lt;/h3&gt;

&lt;p&gt;No Vue.js, o Virtual DOM também é utilizado para otimizar a atualização do DOM real. Quando o estado de um componente é alterado, o Vue.js cria uma nova árvore Virtual DOM e calcula a diferença entre a nova árvore e a árvore anterior, um processo chamado "diffing". Assim como no React, o Vue.js atualiza apenas os nós do DOM real que foram alterados, tornando a atualização do DOM real mais rápida e eficiente.&lt;/p&gt;

&lt;p&gt;Vejamos um exemplo de como o Vue.js utiliza o Virtual DOM ao atualizar o estado de um componente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;// Define o template HTML que será renderizado no DOM real
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
    // Exibe o valor atual de "count"
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Você clicou &lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt; vezes&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    // Define um manipulador de clique que chama a função "increment"
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"increment"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Clique aqui&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

// Define o script JavaScript que gerencia o estado e os métodos do componente
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Define os dados (estado) do componente&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;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="c1"&gt;// Inicializa a propriedade "count" com o valor 0&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="c1"&gt;// Define os métodos do componente&lt;/span&gt;
  &lt;span class="na"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Cria uma função chamada "increment" que atualiza o valor de "count"&lt;/span&gt;
    &lt;span class="nx"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Incrementa o valor de "count" em 1&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="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, temos um componente &lt;code&gt;Counter&lt;/code&gt; com um estado &lt;code&gt;count&lt;/code&gt;. Quando o usuário clica no botão, o estado &lt;code&gt;count&lt;/code&gt; é atualizado através da função &lt;code&gt;increment&lt;/code&gt;. O Vue.js automaticamente cria uma nova árvore Virtual DOM, compara-a com a árvore anterior e atualiza apenas os nós afetados no DOM real.&lt;/p&gt;

&lt;p&gt;Como podemos ver, tanto o React quanto o Vue.js utilizam o conceito de Virtual DOM para otimizar a atualização do DOM real. Ao calcular a diferença entre as árvores Virtual DOM e atualizar apenas os nós necessários, ambos os frameworks garantem um desempenho eficiente na atualização da interface do usuário. Isso é especialmente importante em aplicações web modernas e dinâmicas, onde as alterações no DOM são frequentes e a experiência do usuário deve ser rápida e suave.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  1.4 Ecossistema e integrações com outras bibliotecas e ferramentas
&lt;/h2&gt;

&lt;p&gt;Um dos aspectos mais importantes ao escolher um framework para o desenvolvimento de aplicações web é a disponibilidade de bibliotecas, ferramentas e comunidade que o rodeia. Um ecossistema rico e diversificado pode facilitar o desenvolvimento, fornecendo soluções prontas para uso e suporte da comunidade.&lt;/p&gt;

&lt;p&gt;Tanto o React quanto o Vue.js possuem ecossistemas prósperos e comunidades ativas. Isso significa que você encontrará uma ampla variedade de bibliotecas e ferramentas de terceiros disponíveis para estender e aprimorar as funcionalidades dos frameworks. Algumas das bibliotecas e ferramentas mais populares incluem:&lt;/p&gt;

&lt;p&gt;1 - &lt;strong&gt;Gerenciamento de estado:&lt;/strong&gt; &lt;a href="https://react-redux.js.org/"&gt;Redux (React)&lt;/a&gt;, &lt;a href="https://vuex.vuejs.org/"&gt;Vuex (Vue.js)&lt;/a&gt; - Essas bibliotecas facilitam o gerenciamento de estados complexos e compartilhados entre componentes.&lt;/p&gt;

&lt;p&gt;2 - &lt;strong&gt;Roteamento:&lt;/strong&gt; &lt;a href="https://reactrouter.com/en/main"&gt;React Router (React)&lt;/a&gt;, &lt;a href="https://router.vuejs.org/"&gt;Vue Router (Vue.js)&lt;/a&gt; - Essas bibliotecas permitem que você crie aplicações de página única (SPA) com navegação e histórico de URL.&lt;/p&gt;

&lt;p&gt;3 - &lt;strong&gt;Interface do usuário (UI) e componentes:&lt;/strong&gt; &lt;a href="https://mui.com/"&gt;Material-UI (React)&lt;/a&gt;, &lt;a href="https://vuetifyjs.com/"&gt;Vuetify (Vue.js)&lt;/a&gt; - Essas bibliotecas oferecem componentes de interface do usuário pré-construídos e estilizados, facilitando a criação de aplicações atraentes e responsivas.&lt;/p&gt;

&lt;p&gt;React e Vue.js são projetados para serem flexíveis e fáceis de integrar com outras bibliotecas e ferramentas. Ambos os frameworks podem ser utilizados com outras bibliotecas JavaScript populares, como &lt;a href="https://axios-http.com/docs/intro"&gt;Axios&lt;/a&gt; (para realizar solicitações HTTP) e &lt;a href="https://momentjs.com/"&gt;Moment.js&lt;/a&gt; (para manipulação de datas e horas). Além disso, os dois frameworks são compatíveis com ferramentas de desenvolvimento modernas, como &lt;a href="https://webpack.js.org/"&gt;Webpack&lt;/a&gt; (para empacotamento de módulos e otimização de recursos) e &lt;a href="https://babeljs.io/"&gt;Babel&lt;/a&gt; (para transpilação de código JavaScript).&lt;/p&gt;

&lt;p&gt;Os desenvolvedores de ambos os frameworks também podem tirar proveito das extensões do navegador que facilitam o desenvolvimento e a depuração de aplicações. O &lt;a href="https://react.dev/learn/react-developer-tools"&gt;React DevTools &lt;/a&gt;e o &lt;a href="https://devtools.vuejs.org/"&gt;Vue.js DevTools&lt;/a&gt; são extensões do navegador que fornecem uma série de recursos úteis, como inspeção de componentes, monitoramento de desempenho e visualização de mudanças de estado.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  1.5 Arquitetura e estrutura
&lt;/h2&gt;

&lt;p&gt;As diferenças em arquitetura e estrutura influenciam diretamente a maneira como você escreve e organiza o código, bem como a facilidade de manutenção e escalabilidade da aplicação. &lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  1.5.1 Comparação da arquitetura de ambos os frameworks
&lt;/h3&gt;

&lt;p&gt;A arquitetura de um framework refere-se à organização fundamental e aos princípios de design que governam como ele funciona, como os componentes se comunicam e como os desenvolvedores devem interagir com o framework para criar aplicações. A arquitetura de um framework é composta por diversos elementos, como &lt;strong&gt;padrões de design&lt;/strong&gt;, &lt;strong&gt;estruturas de dados&lt;/strong&gt;, &lt;strong&gt;bibliotecas e APIs&lt;/strong&gt;, que trabalham juntas para fornecer um ambiente de desenvolvimento coerente e eficiente.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  1.5.1.1 Arquitetura do React:
&lt;/h4&gt;

&lt;p&gt;A arquitetura do React é baseada em componentes, o que significa que ele permite dividir a interface do usuário em partes reutilizáveis e independentes. Os componentes React podem ser escritos como classes ou funções e são responsáveis por renderizar partes específicas da interface do usuário e gerenciar o estado local (se necessário).&lt;br&gt;
Vamos examinar um exemplo simples de componente React:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;HelloWorld&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;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setText&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello, World!&lt;/span&gt;&lt;span class="dl"&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;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&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;text&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;setText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello, React!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Mudar&lt;/span&gt; &lt;span class="nx"&gt;Texto&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;HelloWorld&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, criamos um componente funcional chamado &lt;code&gt;HelloWorld&lt;/code&gt;, que renderiza um parágrafo e um botão. O estado local &lt;code&gt;text&lt;/code&gt; é gerenciado usando o hook &lt;code&gt;useState&lt;/code&gt;, e é atualizado quando o usuário clica no botão. Ao final, o componente &lt;code&gt;HelloWorld&lt;/code&gt; é exportado para para que fique disponível para importação por outros módulos.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  1.5.1.2 Arquitetura do Vue.js:
&lt;/h4&gt;

&lt;p&gt;Semelhante ao React, a arquitetura do Vue.js também é baseada em componentes. No entanto, os componentes Vue.js são escritos usando uma combinação de &lt;strong&gt;HTML, JavaScript e CSS em um único arquivo&lt;/strong&gt; (arquivo &lt;code&gt;.vue&lt;/code&gt;). Os componentes Vue.js possuem uma estrutura clara e previsível, com seções distintas para &lt;strong&gt;template&lt;/strong&gt;, &lt;strong&gt;script&lt;/strong&gt; e &lt;strong&gt;estilo&lt;/strong&gt;.&lt;br&gt;
Vamos ver um exemplo de componente Vue.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"updateText"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Mudar Texto&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&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;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello, World!&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;methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;updateText&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello, Vue.js!&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="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No código acima, criamos um componente Vue.js chamado &lt;code&gt;HelloWorld&lt;/code&gt;, que renderiza um parágrafo e um botão. O estado local &lt;code&gt;text&lt;/code&gt; é gerenciado na função &lt;code&gt;data&lt;/code&gt;, e é atualizado quando o usuário clica no botão, chamando o método &lt;code&gt;updateText&lt;/code&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  1.5.2 Diferenças Fundamentais de Arquitetura
&lt;/h3&gt;

&lt;p&gt;Tanto o React quanto o Vue.js utilizam uma &lt;strong&gt;arquitetura baseada em componentes&lt;/strong&gt;, facilitando a reutilização de código e a divisão da interface do usuário em partes independentes. No entanto, há algumas diferenças fundamentais na forma como os componentes são escritos e estruturados em cada framework:&lt;/p&gt;

&lt;p&gt;1 - No React, os componentes podem ser escritos como classes ou funções, e a lógica do componente é misturada com a marcação JSX. Isso permite uma maior flexibilidade, mas pode tornar o código mais difícil de ler e organizar.&lt;/p&gt;

&lt;p&gt;2 - No Vue.js, os componentes são escritos em arquivos &lt;code&gt;.vue&lt;/code&gt;, com seções distintas para template, script e estilo. Essa estrutura clara e previsível torna o código mais fácil de ler e entender, especialmente para desenvolvedores menos familiarizados com o framework.&lt;/p&gt;

&lt;p&gt;3 - O gerenciamento de estado local nos componentes React é geralmente realizado usando hooks, como &lt;code&gt;useState&lt;/code&gt;, enquanto no Vue.js, o estado é gerenciado na função &lt;code&gt;data&lt;/code&gt; e os métodos são definidos na seção &lt;code&gt;methods&lt;/code&gt;. Ambas as abordagens têm suas vantagens e desvantagens, e a escolha entre elas pode ser uma questão de preferência pessoal ou familiaridade com a sintaxe e os conceitos.&lt;/p&gt;

&lt;p&gt;4 - A forma como os estilos são aplicados também difere entre os dois frameworks. No React, os estilos podem ser aplicados usando CSS-in-JS, estilos inline ou arquivos CSS externos, enquanto no Vue.js, os estilos são geralmente aplicados dentro da seção &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; do arquivo &lt;code&gt;.vue&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;A arquitetura e a estrutura dos componentes no React e no Vue.js são baseadas em conceitos similares, mas apresentam algumas diferenças na forma como os componentes são escritos e organizados. Ao escolher entre os dois frameworks, é importante considerar as preferências pessoais e a familiaridade com a sintaxe e os conceitos, bem como o tipo de projeto e as necessidades específicas de desenvolvimento.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  1.5.3 Estrutura de diretórios e organização de projetos
&lt;/h3&gt;

&lt;p&gt;A estrutura de diretórios e a organização de um projeto podem ter um impacto significativo na facilidade de desenvolvimento e manutenção de uma aplicação. Vamos comparar as estruturas de diretório e organização de projetos comuns no React e no Vue.js.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  1.5.3.1 Estrutura de Diretórios em React:
&lt;/h4&gt;

&lt;p&gt;O React não possui uma estrutura de diretórios obrigatória, permitindo que os desenvolvedores organizem seus projetos como desejarem. No entanto, ao utilizar o &lt;code&gt;create-react-app&lt;/code&gt; (uma ferramenta oficial para iniciar projetos React), é gerada uma estrutura de diretórios básica que inclui:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;my-react-app&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
  &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;node_modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
  &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;public&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
  &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;favicon&lt;/span&gt;&lt;span class="nc"&gt;.ico&lt;/span&gt;
  &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;index&lt;/span&gt;&lt;span class="nc"&gt;.html&lt;/span&gt;
  &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;manifest&lt;/span&gt;&lt;span class="nc"&gt;.json&lt;/span&gt;
  &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
  &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;App&lt;/span&gt;&lt;span class="nc"&gt;.css&lt;/span&gt;
  &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;App&lt;/span&gt;&lt;span class="nc"&gt;.js&lt;/span&gt;
  &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;App&lt;/span&gt;&lt;span class="nc"&gt;.test.js&lt;/span&gt;
  &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;index&lt;/span&gt;&lt;span class="nc"&gt;.css&lt;/span&gt;
  &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;index&lt;/span&gt;&lt;span class="nc"&gt;.js&lt;/span&gt;
  &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;logo&lt;/span&gt;&lt;span class="nc"&gt;.svg&lt;/span&gt;
  &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;serviceWorker&lt;/span&gt;&lt;span class="nc"&gt;.js&lt;/span&gt;
  &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nc"&gt;.gitignore&lt;/span&gt;
  &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;package&lt;/span&gt;&lt;span class="nc"&gt;.json&lt;/span&gt;
  &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;README&lt;/span&gt;&lt;span class="nc"&gt;.md&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro da pasta &lt;code&gt;src&lt;/code&gt;, os desenvolvedores geralmente organizam seus componentes e arquivos relacionados de várias maneiras, como:&lt;/p&gt;

&lt;p&gt;Por tipo de arquivo: agrupar arquivos por tipo, como componentes, estilos e testes.&lt;br&gt;
Por funcionalidade: agrupar arquivos relacionados a uma funcionalidade específica.&lt;br&gt;
Por componente: agrupar todos os arquivos relacionados a um componente específico, como JavaScript, CSS e testes.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  1.5.3.1 Estrutura de Diretórios em Vue.js:
&lt;/h4&gt;

&lt;p&gt;O Vue.js também não impõe uma estrutura de diretórios obrigatória, mas o Vue CLI (a ferramenta oficial para criar projetos Vue.js) gera uma estrutura básica de diretórios ao criar um novo projeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;my-vue-app&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
  &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;node_modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
  &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;public&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
  &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;favicon&lt;/span&gt;&lt;span class="nc"&gt;.ico&lt;/span&gt;
  &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;index&lt;/span&gt;&lt;span class="nc"&gt;.html&lt;/span&gt;
  &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
  &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;assets&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
  &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;components&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
  &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;HelloWorld&lt;/span&gt;&lt;span class="nc"&gt;.vue&lt;/span&gt;
  &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;App&lt;/span&gt;&lt;span class="nc"&gt;.vue&lt;/span&gt;
  &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;main&lt;/span&gt;&lt;span class="nc"&gt;.js&lt;/span&gt;
  &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nc"&gt;.gitignore&lt;/span&gt;
  &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;babel&lt;/span&gt;&lt;span class="nc"&gt;.config.js&lt;/span&gt;
  &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;package&lt;/span&gt;&lt;span class="nc"&gt;.json&lt;/span&gt;
  &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;README&lt;/span&gt;&lt;span class="nc"&gt;.md&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A estrutura gerada pelo Vue CLI já organiza os componentes e ativos (como imagens e estilos globais) em pastas separadas. Os desenvolvedores podem optar por organizar ainda mais os componentes em subpastas, com base em funcionalidades ou outros critérios.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  1.5.4 Diferenças fundamentais na organização de diretórios
&lt;/h3&gt;

&lt;p&gt;Tanto o React quanto o Vue.js permitem flexibilidade na organização de diretórios e arquivos de projeto. No entanto, existem algumas diferenças notáveis entre as duas abordagens:&lt;/p&gt;

&lt;p&gt;1 - A estrutura de diretórios gerada pelo &lt;code&gt;create-react-app&lt;/code&gt; para projetos React é mais simples e menos opinativa em comparação com a gerada pelo Vue CLI para projetos Vue.js. Isso pode ser vantajoso para desenvolvedores que preferem ter mais controle sobre a organização do projeto.&lt;/p&gt;

&lt;p&gt;2 - A estrutura de diretórios do Vue.js gerada pelo Vue CLI já inclui uma organização básica para componentes e ativos, enquanto a estrutura do React gerada pelo &lt;code&gt;create-react-app&lt;/code&gt; não faz distinções específicas para componentes ou outros tipos de arquivos. Isso pode ajudar os desenvolvedores a começar com uma organização mais clara no Vue.js.&lt;/p&gt;

&lt;p&gt;3 - O Vue.js utiliza arquivos de componente &lt;code&gt;.vue&lt;/code&gt;, que contêm template, script e estilo em um único arquivo, facilitando a localização e a manutenção de todos os aspectos de um componente em um só lugar. No React, os componentes, estilos e lógica geralmente são separados em arquivos diferentes, o que pode levar a uma organização mais complexa, especialmente em projetos maiores.&lt;/p&gt;

&lt;p&gt;4 - Ambos os frameworks permitem a criação de estruturas de diretório personalizadas, e os desenvolvedores podem optar por organizar seus projetos de acordo com suas preferências ou necessidades específicas. Algumas abordagens populares incluem a organização por &lt;strong&gt;funcionalidade&lt;/strong&gt;, por &lt;strong&gt;tipo de arquivo&lt;/strong&gt; ou por &lt;strong&gt;componente&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Tanto o React quanto o Vue oferecem flexibilidade na organização de diretórios e projetos, mas a estrutura gerada pelo Vue CLI tende a ser &lt;strong&gt;mais opinativa e orientada a componentes&lt;/strong&gt; desde o início. A escolha entre os dois frameworks dependerá das preferências pessoais dos desenvolvedores, bem como das necessidades e requisitos específicos do projeto.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  2. Diferenças na sintaxe e estilo de programação
&lt;/h1&gt;

&lt;p&gt;Uma das principais diferenças entre React e Vue.js está na maneira como eles lidam com a criação de componentes e suas interfaces visuais. Nesta subseção, vamos comparar o JSX usado no React e os templates no Vue.js, de maneira detalhada e com linguagem amigável para iniciantes.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2.1 JSX no React
&lt;/h2&gt;

&lt;p&gt;O React utiliza uma extensão de sintaxe chamada JSX (JavaScript XML) para definir a estrutura e a aparência dos componentes. JSX permite que você misture HTML e JavaScript de maneira concisa e expressiva. Com o JSX, você pode criar componentes funcionais ou de classe. Vejamos um exemplo mais prático de componente funcional no React que exibe uma lista de tarefas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;TodoList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&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;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&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;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;index&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;todo&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="p"&gt;))}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ul&lt;/span&gt;&lt;span class="err"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;TodoList&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos analisar o código, destacando como o JSX funciona neste caso:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Primeiro, importamos a biblioteca React, que é necessária para usar JSX e criar componentes no React.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Em seguida, definimos um componente funcional chamado &lt;code&gt;TodoList&lt;/code&gt;. Ele recebe um objeto chamado &lt;code&gt;props&lt;/code&gt; como argumento. O objeto &lt;code&gt;props&lt;/code&gt; é usado para passar dados de um componente pai para um componente filho no React. Neste caso, esperamos que o componente pai passe um array chamado &lt;code&gt;todos&lt;/code&gt; para o nosso componente &lt;code&gt;TodoList&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dentro do componente, usamos JSX para criar a interface visual. JSX é uma extensão de sintaxe que permite escrever HTML dentro do JavaScript. Neste exemplo, criamos uma lista não ordenada (&lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Usando chaves (&lt;code&gt;{}&lt;/code&gt;), podemos inserir expressões JavaScript diretamente no JSX. Neste caso, usamos a função &lt;code&gt;map&lt;/code&gt; para iterar sobre o array &lt;code&gt;todos&lt;/code&gt; e criar um elemento de lista (&lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;) para cada tarefa.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Para cada tarefa, criamos um elemento de lista &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; com um atributo &lt;code&gt;key&lt;/code&gt; que recebe o &lt;code&gt;index&lt;/code&gt; do elemento no array. O atributo &lt;code&gt;key&lt;/code&gt; é usado pelo React para identificar de forma eficiente quais itens da lista foram alterados, adicionados ou removidos quando a lista é atualizada. Dentro do elemento de lista, usamos chaves novamente para exibir o conteúdo da tarefa (&lt;code&gt;{todo}&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Por fim, exportamos o componente &lt;code&gt;TodoList&lt;/code&gt; para que ele possa ser usado em outros lugares do projeto.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;



&lt;h2&gt;
  
  
  2.2 Templates no Vue.js
&lt;/h2&gt;

&lt;p&gt;Vue.js, por outro lado, utiliza templates baseados em HTML para definir a estrutura e a aparência dos componentes. Um componente Vue.js é composto por três partes: o template, o script e o estilo. Vamos ver um exemplo de componente Vue.js que exibe uma lista de tarefas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;v-for=&lt;/span&gt;&lt;span class="s"&gt;"(todo, index) in todos"&lt;/span&gt; &lt;span class="na"&gt;:key=&lt;/span&gt;&lt;span class="s"&gt;"index"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;todo&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;todos&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="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Em Vue.js, a interface visual do componente é definida dentro da tag &lt;code&gt;&amp;lt;template&amp;gt;&lt;/code&gt;. Neste exemplo, criamos uma lista não ordenada (&lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Usamos a diretiva &lt;code&gt;v-for&lt;/code&gt; para iterar sobre o array &lt;code&gt;todos&lt;/code&gt; e criar um elemento de lista (&lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;) para cada tarefa. A diretiva &lt;code&gt;v-for&lt;/code&gt; é uma funcionalidade específica do Vue.js que permite repetir elementos com base em uma fonte de dados. Neste caso, a fonte de dados é o array &lt;code&gt;todos&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A expressão &lt;code&gt;(todo, index) in todos&lt;/code&gt; define um par de variáveis (&lt;code&gt;todo&lt;/code&gt; e &lt;code&gt;index&lt;/code&gt;) para cada elemento no array &lt;code&gt;todos&lt;/code&gt;. A variável &lt;code&gt;todo&lt;/code&gt; representa o valor do elemento atual, e &lt;code&gt;index&lt;/code&gt; representa a posição do elemento no array.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Usamos o atributo &lt;code&gt;:key&lt;/code&gt; para vincular o valor da propriedade &lt;code&gt;key&lt;/code&gt; do elemento de lista ao &lt;code&gt;index&lt;/code&gt;. A propriedade &lt;code&gt;key&lt;/code&gt; é usada pelo Vue.js para identificar de forma eficiente quais itens da lista foram alterados, adicionados ou removidos quando a lista é atualizada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Para exibir o conteúdo da tarefa, usamos a interpolação &lt;code&gt;{{ todo }}&lt;/code&gt;. A interpolação é uma funcionalidade do Vue.js que permite inserir o valor de uma variável ou expressão JavaScript diretamente no template HTML.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Na tag &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;, definimos as opções do componente. No nosso caso, especificamos a propriedade &lt;code&gt;props&lt;/code&gt;, que é um array contendo o nome das propriedades que o componente espera receber do componente pai. Neste exemplo, esperamos receber uma propriedade chamada &lt;code&gt;todos&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;



&lt;h2&gt;
  
  
  2.3 Comparação de sintaxe entre React e Vue.js
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  O JSX permite misturar JavaScript e HTML de forma mais direta, enquanto os templates do Vue.js mantêm uma separação mais clara entre a estrutura HTML e a lógica do componente.&lt;/li&gt;
&lt;li&gt;  O JSX pode ser mais familiar para desenvolvedores com experiência em JavaScript, enquanto os templates do Vue.js podem ser mais acessíveis para aqueles com experiência em HTML e CSS.&lt;/li&gt;
&lt;li&gt;  O Vue.js oferece uma sintaxe de template mais simples e declarativa, enquanto o React, com JSX, requer que os desenvolvedores usem a sintaxe do JavaScript para manipular elementos, como loops e condicionais.&lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;
  
  
  2.4 Diretivas do Vue.js e como elas se comparam ao React
&lt;/h2&gt;

&lt;p&gt;As diretivas são recursos específicos do Vue.js que permitem manipular o DOM de forma declarativa. Elas são expressas como atributos HTML personalizados que começam com o prefixo &lt;code&gt;v-&lt;/code&gt;. As diretivas podem ser comparadas ao uso de atributos especiais ou manipulação de DOM no React. Vamos explorar algumas diretivas comuns do Vue.js e como elas se comparam ao React.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2.4.1 v-if e v-else
&lt;/h3&gt;

&lt;p&gt;As diretivas &lt;code&gt;v-if&lt;/code&gt; e &lt;code&gt;v-else&lt;/code&gt; no Vue.js são usadas para renderização condicional. Elas permitem exibir ou ocultar elementos com base em uma condição. Veja um exemplo de uso das diretivas &lt;code&gt;v-if&lt;/code&gt; e &lt;code&gt;v-else&lt;/code&gt; no Vue.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;v-if=&lt;/span&gt;&lt;span class="s"&gt;"isLoggedIn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Bem-vindo, usuário!&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;v-else&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Por favor, faça login.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&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;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;isLoggedIn&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="p"&gt;};&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima, exibimos uma mensagem de boas-vindas se &lt;code&gt;isLoggedIn&lt;/code&gt; for verdadeiro e uma mensagem para fazer login se &lt;code&gt;isLoggedIn&lt;/code&gt; for falso.&lt;/p&gt;

&lt;p&gt;No React, a renderização condicional é feita com expressões JavaScript. Vamos ver um exemplo equivalente no React:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;App&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;isLoggedIn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setIsLoggedIn&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&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;isLoggedIn&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Bem&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;vindo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;usuário&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;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;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Por&lt;/span&gt; &lt;span class="nx"&gt;favor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;faça&lt;/span&gt; &lt;span class="nx"&gt;login&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="p"&gt;)}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, usamos o operador ternário (&lt;code&gt;? :&lt;/code&gt;) para renderizar condicionalmente o conteúdo com base no valor de &lt;code&gt;isLoggedIn&lt;/code&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2.4.2 v-for
&lt;/h3&gt;

&lt;p&gt;A diretiva &lt;code&gt;v-for&lt;/code&gt; no Vue.js é usada para renderizar uma lista de itens com base em uma fonte de dados. Veja um exemplo de uso da diretiva &lt;code&gt;v-for&lt;/code&gt; no Vue.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;v-for=&lt;/span&gt;&lt;span class="s"&gt;"(item, index) in items"&lt;/span&gt; &lt;span class="na"&gt;:key=&lt;/span&gt;&lt;span class="s"&gt;"index"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&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;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Item 1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Item 2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Item 3&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="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima, iteramos sobre o array &lt;code&gt;items&lt;/code&gt; usando a diretiva &lt;code&gt;v-for&lt;/code&gt; e criamos um elemento de lista para cada item.&lt;/p&gt;

&lt;p&gt;No React, a renderização de listas é feita com a função &lt;code&gt;map&lt;/code&gt;. Veja um exemplo equivalente no React:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;App&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;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Item 1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Item 2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Item 3&lt;/span&gt;&lt;span class="dl"&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;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&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;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;index&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;item&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="p"&gt;))}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ul&lt;/span&gt;&lt;span class="err"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, usamos a função &lt;code&gt;map&lt;/code&gt; para iterar sobre o array &lt;code&gt;items&lt;/code&gt; e criar um elemento de lista para cada item, assim como no exemplo do Vue.js.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2.4.3 v-model
&lt;/h3&gt;

&lt;p&gt;A diretiva &lt;code&gt;v-model&lt;/code&gt; no Vue.js é usada para vincular campos de formulário a propriedades do componente. Ela cria uma ligação bidirecional entre o campo de formulário e a propriedade do componente. Veja um exemplo de uso da diretiva &lt;code&gt;v-model&lt;/code&gt; no Vue.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&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;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="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;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima, vinculamos o campo de entrada ao valor da propriedade &lt;code&gt;message&lt;/code&gt; usando a diretiva &lt;code&gt;v-model&lt;/code&gt;. Quando o valor do campo de entrada é alterado, a propriedade &lt;code&gt;message&lt;/code&gt; é atualizada automaticamente.&lt;/p&gt;

&lt;p&gt;No React, a vinculação de campos de formulário é feita com o uso de manipuladores de eventos e o estado do componente. Veja um exemplo equivalente no React:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;App&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;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setMessage&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&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="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;setMessage&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="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&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;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, usamos o estado do componente (&lt;code&gt;useState&lt;/code&gt;) para armazenar o valor da propriedade &lt;code&gt;message&lt;/code&gt; e um manipulador de eventos &lt;code&gt;onChange&lt;/code&gt; para atualizar o valor de &lt;code&gt;message&lt;/code&gt; quando o campo de entrada é alterado.&lt;/p&gt;

&lt;p&gt;Em suma, as diretivas do Vue.js fornecem uma sintaxe declarativa para manipular o DOM e facilitar a criação e manutenção de componentes. No React, a manipulação de DOM e a renderização condicional são realizadas com expressões JavaScript e o uso de estado e manipuladores de eventos. Ambas as abordagens têm suas vantagens, e a escolha entre elas pode depender da sua preferência pessoal e experiência como desenvolvedor.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2.5 Estilos
&lt;/h2&gt;

&lt;p&gt;Ao trabalhar com estilos em React e Vue, ambos os frameworks oferecem várias abordagens para estilizar seus componentes. Vamos comparar as diferenças e semelhanças na forma como o React e o Vue.js lidam com estilos, usando exemplos práticos.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2.5.1 Estilos em React
&lt;/h3&gt;

&lt;p&gt;No React, você pode usar tanto estilos inline quanto folhas de estilo externas (CSS). Vamos examinar as duas abordagens:&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  2.5.1.1 Estilos inline
&lt;/h4&gt;

&lt;p&gt;Em React, você pode aplicar estilos inline aos componentes usando um objeto JavaScript. Os nomes das propriedades CSS são escritos em camelCase, e os valores são atribuídos como strings.&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;StyledButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&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;buttonStyle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;blue&lt;/span&gt;&lt;span class="dl"&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;white&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;10px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;borderRadius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;5px&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;return&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;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;buttonStyle&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="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;children&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;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;StyledButton&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, criamos um componente &lt;code&gt;StyledButton&lt;/code&gt; com estilos inline. Definimos um objeto chamado &lt;code&gt;buttonStyle&lt;/code&gt; contendo propriedades CSS. Em seguida, aplicamos o estilo ao elemento &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; usando o atributo &lt;code&gt;style&lt;/code&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  2.5.1.2 Tailwind CSS
&lt;/h4&gt;

&lt;p&gt;Talvez a configuração de estilos mais utilizada no React atualmente é com o framework Tailwind. O Tailwind CSS é um framework CSS de baixo nível, altamente personalizável e orientado a classes utilitárias, o que o torna uma excelente escolha para estilizar componentes React.&lt;/p&gt;

&lt;p&gt;Primeiro, instale o Tailwind CSS em seu projeto React. Você pode seguir as instruções de instalação na documentação oficial do Tailwind CSS (&lt;a href="https://tailwindcss.com/docs/installation"&gt;https://tailwindcss.com/docs/installation&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Após instalar e configurar, você pode começar a usá-lo em seus componentes. Aqui está um exemplo de um componente React estilizado com Tailwind CSS:&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&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;button&lt;/span&gt;
      &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded"&lt;/span&gt;
      &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onClick&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="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;children&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;button&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;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, criamos um componente &lt;code&gt;Button&lt;/code&gt; e aplicamos classes utilitárias do Tailwind CSS ao elemento &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;bg-blue-500&lt;/code&gt;: Define a cor de fundo do botão para um tom de azul.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hover:bg-blue-700&lt;/code&gt;: Altera a cor de fundo do botão para um tom de azul mais escuro quando o mouse está sobre ele.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;text-white&lt;/code&gt;: Define a cor do texto do botão para branco.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;font-bold&lt;/code&gt;: Aplica uma fonte em negrito ao texto do botão.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;py-2&lt;/code&gt;: Adiciona um padding vertical de 0.5rem (2 * 0.25rem) ao botão.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;px-4&lt;/code&gt;: Adiciona um padding horizontal de 1rem (4 * 0.25rem) ao botão.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rounded&lt;/code&gt;: Arredonda os cantos do botão.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As classes utilitárias do Tailwind CSS permitem que você aplique rapidamente estilos pré-definidos a seus componentes React sem escrever CSS personalizado.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  2.5.1.3 Folhas de estilo externas (CSS)
&lt;/h4&gt;

&lt;p&gt;Você também pode usar folhas de estilo externas para estilizar seus componentes React. Basta criar um arquivo CSS e importá-lo no componente.&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;// styles.css&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;background&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="nx"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;border&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="nx"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// StyledButton.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./styles.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;StyledButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&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="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;children&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;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;StyledButton&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima, criamos um arquivo CSS chamado &lt;code&gt;styles.css&lt;/code&gt; e definimos os estilos para a classe &lt;code&gt;.button&lt;/code&gt;. Em seguida, importamos a folha de estilo no arquivo &lt;code&gt;StyledButton.js&lt;/code&gt; e aplicamos a classe ao elemento &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; usando o atributo &lt;code&gt;className&lt;/code&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2.5.2 Estilos em Vue.js
&lt;/h3&gt;

&lt;p&gt;No Vue.js, você pode usar estilos inline, folhas de estilo externas e estilos de escopo (scoped styles). Vamos examinar as três abordagens:&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  2.5.2.1 Estilos inline
&lt;/h4&gt;

&lt;p&gt;Assim como no React, você pode aplicar estilos inline aos componentes Vue.js usando um objeto JavaScript.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;buttonStyle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;slot&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/slot&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/template&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&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;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;buttonStyle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;blue&lt;/span&gt;&lt;span class="dl"&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;white&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;10px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;borderRadius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;5px&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="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, criamos um componente &lt;code&gt;StyledButton&lt;/code&gt; com estilos inline. Definimos um objeto chamado &lt;code&gt;buttonStyle&lt;/code&gt; contendo propriedades CSS na função &lt;code&gt;data&lt;/code&gt;. Em seguida, aplicamos o estilo ao elemento &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; usando a diretiva &lt;code&gt;:style&lt;/code&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  2.5.2.2 Folhas de estilo externas
&lt;/h4&gt;

&lt;p&gt;Você também pode usar folhas de estilo externas para estilizar seus componentes Vue.js. Basta criar um arquivo CSS e importá-lo no componente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- StyledButton.vue --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./styles.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima, criamos um arquivo CSS chamado &lt;code&gt;styles.css&lt;/code&gt; e definimos os estilos para a classe &lt;code&gt;.button&lt;/code&gt;. Em seguida, importamos a folha de estilo no arquivo &lt;code&gt;StyledButton.vue&lt;/code&gt; e aplicamos a classe ao elemento &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; usando o atributo &lt;code&gt;class&lt;/code&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  2.5.2.3 Estilos de escopo (scoped styles)
&lt;/h4&gt;

&lt;p&gt;No Vue.js, você também pode utilizar estilos de escopo, que são estilos aplicados especificamente a um componente, sem afetar outros componentes. Para criar estilos de escopo, adicione o atributo &lt;code&gt;scoped&lt;/code&gt; à tag &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; no componente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;style&lt;/span&gt; &lt;span class="na"&gt;scoped&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;style&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, adicionamos uma tag &lt;code&gt;&amp;lt;style scoped&amp;gt;&lt;/code&gt; ao componente &lt;code&gt;StyledButton&lt;/code&gt;. Os estilos definidos nesta tag serão aplicados apenas a este componente, sem afetar outros componentes no aplicativo.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  3. Gerenciamento de estado e fluxo de dados
&lt;/h1&gt;

&lt;p&gt;Quando se trabalha com aplicações de grande escala, gerenciar o estado e o fluxo de dados entre os componentes pode ser um desafio. React e Vue.js oferecem soluções específicas para facilitar o gerenciamento de estado em suas aplicações: Redux para React e Vuex para Vue.js. Vamos examinar cada abordagem e compará-las.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  3.1 Abordagem do React com o Redux
&lt;/h2&gt;

&lt;p&gt;Redux é uma biblioteca popular de gerenciamento de estado usada com o React. Ele segue a arquitetura Flux, que consiste em ações, armazenamento (store) e redutores (reducers). Vamos examinar um exemplo simples para entender como o Redux funciona com o React.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
1 - Instale o Redux e o React-Redux em seu projeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install react-redux
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;br&gt;&lt;br&gt;
2 - Crie uma ação para alterar o estado. As ações são objetos que descrevem o que aconteceu e como o estado deve mudar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// actions/counter.js&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;increment&lt;/span&gt; &lt;span class="o"&gt;=&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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;INCREMENT&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No código acima, criamos uma função chamada &lt;code&gt;increment&lt;/code&gt; que retorna um objeto com uma propriedade &lt;code&gt;type&lt;/code&gt; cujo valor é &lt;code&gt;'INCREMENT'&lt;/code&gt;. Essa ação indica que queremos incrementar o contador.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
3 - Crie um redutor para lidar com a ação. Os redutores são funções que determinam como o estado será atualizado com base nas ações:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// reducers/counter.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;initialState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&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;counterReducer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;initialState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;action&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="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;INCREMENT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;state&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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;counterReducer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, definimos um estado inicial como &lt;code&gt;0&lt;/code&gt; e criamos um redutor chamado &lt;code&gt;counterReducer&lt;/code&gt;. O redutor verifica o tipo de ação e, se for &lt;code&gt;'INCREMENT'&lt;/code&gt;, incrementa o estado. Caso contrário, o estado permanece inalterado.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
4 - Combine redutores e crie a store. A store é um objeto que contém o estado da aplicação e permite que os componentes acessem e atualizem esse estado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// store.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;combineReducers&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;redux&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;counterReducer&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./reducers/counter&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;rootReducer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;combineReducers&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;counterReducer&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;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rootReducer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, usamos &lt;code&gt;combineReducers&lt;/code&gt; para combinar todos os redutores em um único objeto e depois usamos &lt;code&gt;createStore&lt;/code&gt; para criar a store com o redutor combinado.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
5 - Conecte o componente ao Redux:&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;// Counter.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useSelector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useDispatch&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-redux&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;increment&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./actions/counter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Counter&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;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useSelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;counter&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;dispatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useDispatch&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;div&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;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&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;h1&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;onClick&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;increment&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;Incrementar&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="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, usamos &lt;code&gt;useSelector&lt;/code&gt; para acessar o estado do contador e &lt;code&gt;useDispatch&lt;/code&gt; para disparar a ação &lt;code&gt;increment&lt;/code&gt; ao clicar no botão. Isso atualizará o estado do contador na store.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
6 - Conecte a store ao aplicativo:&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;// index.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ReactDOM&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-dom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Provider&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-redux&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./store&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Counter&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Counter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Provider&lt;/span&gt; &lt;span class="na"&gt;store&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;store&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="nc"&gt;Counter&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="nc"&gt;Provider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finalmente, usamos o componente &lt;code&gt;Provider&lt;/code&gt; do React-Redux para conectar a store ao aplicativo. Agora, o componente &lt;code&gt;Counter&lt;/code&gt; terá acesso ao estado e às ações do Redux, permitindo que ele atualize e exiba o valor do contador conforme o usuário interage com ele.&lt;/p&gt;

&lt;p&gt;Nesta subseção, mostramos como configurar o Redux em um aplicativo React para gerenciar o estado de um contador simples. Isso envolve criar ações, redutores e uma store, além de conectar o componente à store usando o &lt;code&gt;Provider&lt;/code&gt;. Isso permite que o estado seja atualizado e acessado de maneira consistente e previsível em toda a aplicação.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  3.2 Abordagem do Vue.js com o Vuex
&lt;/h2&gt;

&lt;p&gt;Vuex é uma biblioteca de gerenciamento de estado especialmente projetada para Vue.js. Ela facilita o gerenciamento de estado centralizado em aplicativos Vue, seguindo um padrão semelhante ao Flux, como o Redux no React. Vamos analisar um exemplo simples para entender como o Vuex funciona com o Vue.js.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
1 - Instale o Vuex em seu projeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install vuex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;br&gt;&lt;br&gt;
2 - Crie uma store Vuex. A store é um objeto que contém o estado da aplicação e permite que os componentes acessem e atualizem esse estado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// store.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Vue&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Vuex&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vuex&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;Vue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Vuex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Vuex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Store&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;mutations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="o"&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;span class="na"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;commit&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;increment&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="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;No código acima, definimos o estado inicial com um contador (&lt;code&gt;count&lt;/code&gt;) e criamos as mutações e ações correspondentes. As mutações são funções que modificam diretamente o estado, enquanto as ações são funções que podem conter lógica assíncrona antes de realizar uma mutação.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
3 - Conecte o componente ao Vuex:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Counter.vue --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"increment"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Incrementar&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;mapState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mapActions&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vuex&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;computed&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="nx"&gt;mapState&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;count&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;methods&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="nx"&gt;mapActions&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;increment&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="p"&gt;};&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima, usamos &lt;code&gt;mapState&lt;/code&gt; para acessar o estado do contador e &lt;code&gt;mapActions&lt;/code&gt; para mapear a ação &lt;code&gt;increment&lt;/code&gt; aos métodos do componente. Quando o botão é clicado, a ação &lt;code&gt;increment&lt;/code&gt; é chamada, o que, por sua vez, atualiza o estado do contador na store.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
4 - Conecte a store ao aplicativo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// main.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Vue&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./App.vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./store&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Vue&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;render&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;$mount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, conectamos a store ao aplicativo Vue, permitindo que o componente &lt;code&gt;Counter&lt;/code&gt; acesse o estado e as ações do Vuex.&lt;/p&gt;

&lt;p&gt;Neste exemplo, mostramos como configurar o Vuex em um aplicativo Vue.js para gerenciar o estado de um contador simples. Isso envolve criar uma store com estado, mutações e ações, além de conectar o componente à store. Isso permite que o estado seja atualizado e acessado de maneira consistente e previsível em toda a aplicação.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  4. Curva de aprendizado e documentação
&lt;/h1&gt;

&lt;p&gt;vamos comparar o nível de dificuldade para aprender React e Vue.js e analisar a qualidade e abrangência da documentação de cada um.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4.1 Nível de dificuldade para aprender React
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;O React utiliza o JSX, que mistura HTML e JavaScript no mesmo arquivo. Isso pode ser um pouco confuso no início, especialmente para aqueles que são novos no desenvolvimento web.&lt;/li&gt;
&lt;li&gt;O gerenciamento de estado, como o Redux, pode ser um pouco difícil de entender no início. No entanto, com a introdução do Hooks, o gerenciamento de estado se tornou mais fácil e mais acessível.&lt;/li&gt;
&lt;li&gt;O ecossistema do React é vasto e pode ser intimidante para iniciantes, pois há muitas bibliotecas e ferramentas disponíveis para escolher.

&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4.2 Nível de dificuldade para aprender Vue.js
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;O Vue.js usa uma abordagem mais simples e fácil de entender com a separação de HTML, JavaScript e CSS em componentes, semelhante ao desenvolvimento web tradicional.&lt;/li&gt;
&lt;li&gt;A curva de aprendizado do Vue.js é considerada mais suave em comparação com o React. Vue.js é projetado para ser progressivo, permitindo aos desenvolvedores adotar apenas as partes que eles precisam.&lt;/li&gt;
&lt;li&gt;O gerenciamento de estado no Vue.js com Vuex é mais simples em comparação ao Redux, tornando-o mais fácil de aprender e utilizar.

&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4.3 Qualidade e abrangência da documentação
&lt;/h2&gt;

&lt;p&gt;A documentação é um aspecto crucial para o aprendizado e adoção de qualquer tecnologia. Vamos comparar a qualidade e abrangência da documentação do React e do Vue.js.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4.3.1 Documentação do React
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A documentação oficial do React é extensa e detalhada, abrangendo todos os aspectos do framework. Ela também inclui guias práticos e tutoriais para ajudar os desenvolvedores a começar.&lt;/li&gt;
&lt;li&gt;A documentação é atualizada regularmente para refletir as melhores práticas e novos recursos.&lt;/li&gt;
&lt;li&gt;A comunidade React é grande e ativa, o que significa que há uma infinidade de recursos de aprendizado, como cursos, artigos e vídeos disponíveis na internet.

&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.3.2 Documentação do Vue.js
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A documentação oficial do Vue.js é conhecida por ser excepcionalmente bem escrita e fácil de entender, mesmo para iniciantes.&lt;/li&gt;
&lt;li&gt;A documentação é mantida e atualizada regularmente, garantindo que os desenvolvedores estejam sempre atualizados sobre as últimas mudanças e melhores práticas.&lt;/li&gt;
&lt;li&gt;A comunidade Vue.js, embora menor que a comunidade React, é ativa e engajada. Há muitos recursos disponíveis para aprender Vue.js, incluindo cursos, artigos e vídeos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para resumir, ambos os frameworks possuem documentação abrangente e de alta qualidade. A curva de aprendizado do Vue.js é geralmente considerada mais suave em comparação ao React. No entanto, a escolha entre React e Vue.js dependerá das preferências individuais do desenvolvedor e dos requisitos específicos do projeto.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  5. Desempenho e otimizações
&lt;/h1&gt;

&lt;p&gt;Nesta seção, vamos comparar o desempenho de React e Vue.js e explorar as otimizações disponíveis em cada framework para garantir que seu aplicativo funcione com eficiência e rapidez.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5.1 Comparação de desempenho entre React e Vue.js
&lt;/h2&gt;

&lt;p&gt;Vamos comparar detalhadamente o desempenho do React e do Vue.js. Para tornar esta comparação amigável aos iniciantes, vamos explicar os termos técnicos e fornecer exemplos sempre que possível.&lt;/p&gt;

&lt;p&gt;Antes de prosseguir, é importante lembrar que o desempenho varia dependendo de muitos fatores, como a complexidade da aplicação, a estrutura do código e a otimização. Essa comparação é baseada em aplicações típicas e pode não refletir o desempenho em todos os cenários.&lt;/p&gt;

&lt;p&gt;Vamos considerar as seguintes métricas para nossa comparação:&lt;br&gt;
1 - Tamanho do bundle&lt;br&gt;
2 - Velocidade de renderização&lt;br&gt;
3 - Uso de memória&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5.1.1 Tamanho do bundle
&lt;/h3&gt;

&lt;p&gt;O tamanho do bundle é uma medida importante para o desempenho, pois afeta o tempo de carregamento da página. Um bundle menor significa que o navegador precisa baixar menos dados para exibir a página, o que resulta em um carregamento mais rápido.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Tamanho do bundle (minificado e gzipado)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React&lt;/td&gt;
&lt;td&gt;~33 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vue.js&lt;/td&gt;
&lt;td&gt;~23 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Como mostrado na tabela acima, o Vue.js tem um tamanho de bundle menor em comparação ao React. Isso, em geral, o Vue.js proporcionará um tempo de carregamento mais rápido, especialmente em conexões lentas ou dispositivos com menor poder de processamento.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.1.2 Velocidade de renderização
&lt;/h3&gt;

&lt;p&gt;A velocidade de renderização é uma métrica importante para a experiência do usuário, pois determina o tempo necessário para que os componentes da interface sejam exibidos na tela. Vamos comparar a velocidade de renderização de ambas as bibliotecas.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Velocidade de renderização (tempo médio em ms)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React&lt;/td&gt;
&lt;td&gt;25 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vue.js&lt;/td&gt;
&lt;td&gt;20 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Os números acima são aproximados e podem variar dependendo de vários fatores, como a complexidade da aplicação e a otimização do código. No entanto, é evidente que o Vue.js oferece uma velocidade de renderização ligeiramente mais rápida em comparação ao React. Isso pode ser especialmente importante para aplicações com um grande número de componentes dinâmicos.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.1.3 Uso de memória
&lt;/h3&gt;

&lt;p&gt;O uso de memória é outra métrica importante a ser considerada, já que um uso excessivo de memória pode levar a um desempenho lento e problemas de responsividade. Vamos comparar o uso de memória do React e do Vue.js.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Uso de memória (média em MB)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React&lt;/td&gt;
&lt;td&gt;40 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vue.js&lt;/td&gt;
&lt;td&gt;35 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Os valores na tabela acima indicam o uso médio de memória para aplicações construídas com React e Vue.js. Embora ambos os frameworks gerenciem bem o uso de memória, o Vue.js apresenta um uso médio ligeiramente menor em comparação ao React. Isso pode ser benéfico para dispositivos com recursos limitados ou aplicações que exigem muita interação com o usuário.&lt;/p&gt;

&lt;p&gt;Tanto o React quanto o Vue.js são excelentes opções para o desenvolvimento de interfaces de usuário. No entanto, conforme a comparação acima mostra, o Vue.js leva uma ligeira vantagem no tamanho do bundle, velocidade de renderização e uso de memória.&lt;/p&gt;

&lt;p&gt;É importante lembrar que a escolha entre React e Vue.js deve ser baseada no contexto do projeto e nas necessidades específicas da aplicação. Além do desempenho, considere outros fatores como a curva de aprendizado, a comunidade, a disponibilidade de bibliotecas e a facilidade de integração com outras tecnologias.&lt;/p&gt;

&lt;p&gt;Assim, o Vue.js pode ser uma opção mais adequada para projetos que buscam otimizar o desempenho, especialmente em dispositivos com recursos limitados ou em conexões lentas. Por outro lado, o React é uma escolha sólida para projetos que exigem maior flexibilidade e uma ampla gama de bibliotecas e ferramentas disponíveis.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5.2 Otimizações disponíveis em cada framework
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.2.1 Otimizações no React:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;React.memo: Esta é uma técnica de otimização de desempenho que permite memorizar componentes funcionais e evitar a renderização desnecessária. É útil quando você tem componentes que renderizam dados idênticos e raramente mudam.&lt;/li&gt;
&lt;li&gt;React.lazy: Permite carregar componentes de maneira "lazy" (preguiçosa), o que significa que eles serão carregados apenas quando forem necessários. Isso melhora o desempenho, especialmente em aplicativos grandes com muitos componentes.&lt;/li&gt;
&lt;li&gt;React.PureComponent: Esta classe estende a classe React.Component e realiza uma verificação superficial dos objetos de propriedades e estados, ajudando a evitar renderizações desnecessárias e melhorando o desempenho.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5.2.2 Otimizações no Vue.js:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Componentes assíncronos: O Vue.js suporta componentes assíncronos, que são carregados sob demanda apenas quando são necessários, melhorando a velocidade de carregamento inicial do aplicativo.&lt;/li&gt;
&lt;li&gt;v-if e v-show: Estas diretivas do Vue.js permitem renderizar condicionalmente elementos no DOM. A diretiva v-if remove completamente o elemento do DOM quando a condição é falsa, enquanto a diretiva v-show apenas altera o estilo CSS para ocultar o elemento. Ambas as diretivas podem ser usadas para otimizar a renderização e melhorar o desempenho.&lt;/li&gt;
&lt;li&gt;Computed properties: As propriedades computadas no Vue.js são usadas para calcular valores derivados com base nos dados de um componente. Elas são armazenadas em cache e só são reavaliadas quando as dependências são alteradas. Isso evita a reavaliação desnecessária e melhora o desempenho.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tanto React quanto Vue.js oferecem várias técnicas de otimização para melhorar o desempenho de seus aplicativos. A escolha do framework mais adequado dependerá de fatores como a complexidade do projeto, a familiaridade com a sintaxe e as preferências pessoais. Ambos os frameworks têm uma grande comunidade e ampla documentação, o que significa que você encontrará muitos recursos e ferramentas para ajudá-lo a otimizar o desempenho do seu aplicativo, independentemente do framework escolhido.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  6. Comunidade e ecossistema
&lt;/h1&gt;

&lt;p&gt;Nesta seção, vamos explorar a comunidade e o ecossistema em torno de React e Vue.js, abordando o tamanho da comunidade, a disponibilidade de bibliotecas e plugins de terceiros e o suporte e atualizações oferecidos pelos respectivos projetos.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6.1 Comparação do tamanho da comunidade e contribuições
&lt;/h2&gt;

&lt;p&gt;A comunidade e o suporte em torno de um framework são fatores cruciais para o sucesso na adoção da tecnologia. Vamos comparar o tamanho das comunidades e contribuições para React e Vue.js.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tabela: Estatísticas da comunidade e contribuições&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Métrica&lt;/th&gt;
&lt;th&gt;React&lt;/th&gt;
&lt;th&gt;Vue.js&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Estrelas no GitHub&lt;/td&gt;
&lt;td&gt;174.000+&lt;/td&gt;
&lt;td&gt;193.000+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forks no GitHub&lt;/td&gt;
&lt;td&gt;34.000+&lt;/td&gt;
&lt;td&gt;31.000+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contribuidores no GitHub&lt;/td&gt;
&lt;td&gt;1.500+&lt;/td&gt;
&lt;td&gt;350+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Questões fechadas no Stack Overflow&lt;/td&gt;
&lt;td&gt;300.000+&lt;/td&gt;
&lt;td&gt;80.000+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Downloads mensais no NPM&lt;/td&gt;
&lt;td&gt;10.000.000+&lt;/td&gt;
&lt;td&gt;2.000.000+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Embora o React seja mais antigo e tenha uma comunidade maior, o Vue.js também tem uma comunidade ativa e crescente. As estatísticas mostram que ambos os frameworks têm um grande número de contribuidores e usuários ativos. No entanto, o React tem um número significativamente maior de questões fechadas no Stack Overflow e downloads mensais no NPM, indicando uma adoção mais ampla na comunidade de desenvolvedores.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6.2 Disponibilidade de bibliotecas e plugins de terceiros
&lt;/h2&gt;

&lt;p&gt;A disponibilidade de bibliotecas e plugins de terceiros é um aspecto essencial para a escolha de uma biblioteca ou framework para desenvolvimento web. Ambos React e Vue.js possuem uma vasta seleção de bibliotecas e plugins, mas é crucial entender as diferenças e as características que os distinguem.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.2.1 Bibliotecas React
&lt;/h3&gt;

&lt;p&gt;Graças à sua ampla adoção, a comunidade React é grande e ativa, resultando em uma enorme quantidade de bibliotecas e plugins disponíveis para facilitar o desenvolvimento de aplicações.&lt;/p&gt;

&lt;p&gt;Algumas das principais categorias de bibliotecas e plugins disponíveis para o React incluem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gerenciamento de estado: Redux, MobX, Recoil&lt;/li&gt;
&lt;li&gt;Roteamento: React Router, Reach Router&lt;/li&gt;
&lt;li&gt;Estilização e componentes de UI: Material-UI, Ant Design, Bootstrap, Chakra UI&lt;/li&gt;
&lt;li&gt;Formulários e validação: Formik, React Hook Form, Yup&lt;/li&gt;
&lt;li&gt;Testes e documentação: Jest, React Testing Library, Storybook
De acordo com o npm, o maior registro de pacotes JavaScript, existem &lt;strong&gt;mais de 80.000&lt;/strong&gt; pacotes relacionados ao React disponíveis.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.2.2 Bibliotecas Vue.js
&lt;/h3&gt;

&lt;p&gt;Ao longo dos anos, Vue.js também ganhou uma comunidade ativa e crescente, levando a um aumento significativo na disponibilidade de bibliotecas e plugins.&lt;/p&gt;

&lt;p&gt;As principais categorias de bibliotecas e plugins disponíveis para o Vue.js incluem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gerenciamento de estado: Vuex, Vue.observable&lt;/li&gt;
&lt;li&gt;Roteamento: Vue Router&lt;/li&gt;
&lt;li&gt;Estilização e componentes de UI: Vuetify, Quasar, Element UI, BootstrapVue&lt;/li&gt;
&lt;li&gt;Formulários e validação: VeeValidate, Vue Formulate&lt;/li&gt;
&lt;li&gt;Testes e documentação: Vue Test Utils, Jest, Vue Styleguidist&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O registro npm indica que existem &lt;strong&gt;mais de 30.000&lt;/strong&gt; pacotes relacionados ao Vue.js.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Considerações Finais
&lt;/h1&gt;

&lt;p&gt;Neste artigo, analisamos as principais semelhanças e diferenças entre React e Vue.js, dois dos frameworks de desenvolvimento web mais populares atualmente. Ambos possuem suas vantagens e desvantagens, e a escolha entre os dois dependerá das necessidades específicas de seu projeto. Nesta seção final, vamos resumir as principais semelhanças e diferenças entre React e Vue.js e fornecer algumas orientações sobre como escolher o melhor framework para o seu projeto.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Resumo das principais semelhanças e diferenças
&lt;/h2&gt;

&lt;p&gt;React e Vue.js compartilham várias semelhanças, como a abordagem baseada em componentes, o uso de uma árvore virtual do DOM e a reatividade do estado. No entanto, eles também apresentam algumas diferenças-chave que podem influenciar a sua escolha. Aqui está uma tabela detalhada que ilustra as principais semelhanças e diferenças entre React e Vue.js:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Característica&lt;/th&gt;
&lt;th&gt;React&lt;/th&gt;
&lt;th&gt;Vue.js&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Empresa Mantenedora&lt;/td&gt;
&lt;td&gt;Facebook&lt;/td&gt;
&lt;td&gt;Comunidade Open Source (Evan You)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lançamento&lt;/td&gt;
&lt;td&gt;2013&lt;/td&gt;
&lt;td&gt;2014&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Popularidade&lt;/td&gt;
&lt;td&gt;Muito popular (mais estrelas no GitHub)&lt;/td&gt;
&lt;td&gt;Popular (menos estrelas no GitHub)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Abordagem&lt;/td&gt;
&lt;td&gt;Baseado em componentes e biblioteca focada&lt;/td&gt;
&lt;td&gt;Framework completo e integrado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Curva de Aprendizado&lt;/td&gt;
&lt;td&gt;Moderada&lt;/td&gt;
&lt;td&gt;Mais fácil e amigável&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sintaxe&lt;/td&gt;
&lt;td&gt;JSX&lt;/td&gt;
&lt;td&gt;HTML, CSS e JavaScript (opcionalmente, JSX)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gerenciamento de Estado&lt;/td&gt;
&lt;td&gt;Redux, MobX, Context API&lt;/td&gt;
&lt;td&gt;Vuex&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;Excelente&lt;/td&gt;
&lt;td&gt;Excelente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comunidade e Ecossistema&lt;/td&gt;
&lt;td&gt;Amplo e maduro&lt;/td&gt;
&lt;td&gt;Crescente e diversificado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Empregabilidade&lt;/td&gt;
&lt;td&gt;Alta demanda no mercado&lt;/td&gt;
&lt;td&gt;Demanda crescente no mercado&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Orientação sobre como escolher entre React e Vue.js
&lt;/h2&gt;

&lt;p&gt;Para escolher entre React e Vue.js, considere os seguintes fatores com base nas necessidades específicas de seu projeto:&lt;/p&gt;

&lt;p&gt;1 - &lt;strong&gt;Curva de aprendizado&lt;/strong&gt;: Se você é iniciante e busca um framework fácil de aprender, Vue.js é a escolha mais amigável. Sua documentação é clara e abrangente, e sua sintaxe é mais próxima do HTML, CSS e JavaScript padrão.&lt;/p&gt;

&lt;p&gt;2 - &lt;strong&gt;Tamanho do projeto&lt;/strong&gt;: Se você está desenvolvendo um projeto de grande escala e precisa de um ecossistema amplo e maduro, o React pode ser mais adequado. Por outro lado, se você está trabalhando em um projeto menor ou de médio porte, Vue.js pode ser uma opção mais leve e flexível.&lt;/p&gt;

&lt;p&gt;3 - &lt;strong&gt;Empregabilidade&lt;/strong&gt;: Se você está buscando aprimorar suas habilidades para fins de empregabilidade, o React tem uma demanda maior no mercado. No entanto, o Vue.js também tem visto uma demanda crescente, especialmente em startups e empresas menores.&lt;/p&gt;

&lt;p&gt;4 - &lt;strong&gt;Integração com outras tecnologias&lt;/strong&gt;: Se você precisa integrar seu projeto com outras bibliotecas e tecnologias, o React é mais versátil e possui uma grande comunidade que pode ajudá-lo a encontrar soluções para problemas específicos. No entanto, Vue.js também tem uma comunidade crescente e diversificada, e pode ser mais fácil de integrar com tecnologias tradicionais da web.&lt;/p&gt;

&lt;p&gt;5 - &lt;strong&gt;Preferências pessoais&lt;/strong&gt;: A escolha entre React e Vue.js também pode ser uma questão de gosto pessoal. Se você prefere trabalhar com JSX e gosta da abordagem da biblioteca focada do React, esta pode ser a opção certa para você. Por outro lado, se você prefere a sintaxe mais próxima do HTML e um framework mais integrado, o Vue.js pode ser uma escolha melhor.&lt;/p&gt;

&lt;p&gt;6 - &lt;strong&gt;Suporte e manutenção&lt;/strong&gt;: Ambos os frameworks possuem uma comunidade ativa e um histórico de atualizações regulares e melhorias. No entanto, o React é mantido pelo Facebook, o que pode trazer uma sensação de maior estabilidade e apoio corporativo. Por outro lado, o Vue.js é mantido por uma comunidade open-source liderada por Evan You, o que pode ser mais atraente para desenvolvedores que preferem soluções de código aberto e comunitárias.&lt;/p&gt;

&lt;p&gt;7 - &lt;strong&gt;Performance&lt;/strong&gt;: Tanto React quanto Vue.js oferecem excelente performance, e as diferenças nesse aspecto são geralmente mínimas. No entanto, dependendo do caso de uso específico, um framework pode ter uma ligeira vantagem sobre o outro. Faça uma análise cuidadosa das necessidades de performance do seu projeto e verifique se há algum benchmark ou relato de experiência que indique qual dos dois frameworks se sairia melhor no seu cenário.&lt;/p&gt;

&lt;p&gt;Desta maneira, a escolha entre React e Vue.js dependerá das necessidades específicas do seu projeto, suas preferências pessoais e sua experiência anterior. Ambos os frameworks são excelentes opções para o desenvolvimento web moderno e oferecem uma ampla gama de recursos e benefícios. Ao levar em conta os fatores mencionados acima, você estará mais bem preparado para tomar uma decisão informada e selecionar o framework que melhor atende às necessidades do seu projeto.&lt;/p&gt;

</description>
      <category>react</category>
      <category>vue</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
    <item>
      <title>🛣O Guia Definitivo sobre Rotas com React Router</title>
      <dc:creator>Marcelo Petry</dc:creator>
      <pubDate>Thu, 02 Feb 2023 01:47:49 +0000</pubDate>
      <link>https://dev.to/mpetry/o-guia-definitivo-para-rotas-com-react-router-4n5h</link>
      <guid>https://dev.to/mpetry/o-guia-definitivo-para-rotas-com-react-router-4n5h</guid>
      <description>&lt;p&gt;Rotas em React são responsáveis por determinar como os usuários navegam pelo seu aplicativo. Quando um usuário clica em um link ou digita uma URL, a rota controla qual página do aplicativo será exibida para o usuário. Por exemplo, se você estiver desenvolvendo um aplicativo de compras on-line, poderá ter uma rota para a página inicial, uma rota para a página de categorias, uma rota para a página de produtos, uma rota para a página de carrinho de compras, etc.&lt;/p&gt;

&lt;p&gt;Ter uma estrutura de rotas clara e fácil de entender é importante porque ajuda a melhorar a navegação e a experiência do usuário. Além disso, também pode ajudar a proteger certas páginas de acesso não autorizado e garantir que o usuário seja redirecionado para a página correta após realizar determinadas ações.&lt;/p&gt;

&lt;p&gt;Felizmente, a biblioteca React Router facilita a criação de uma estrutura de rotas clara e organizada em um aplicativo React. A seguir, veremos como configurar e usar o React Router para criar uma estrutura de rotas eficiente em seu aplicativo React.&lt;/p&gt;

&lt;p&gt;Neste guia, você verá:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
 Instalação do React Router
&lt;/li&gt;
&lt;li&gt;
 Componentes Básicos do React Router
&lt;/li&gt;
&lt;li&gt;
 Hooks Básicos do React Router
&lt;/li&gt;
&lt;li&gt;
 Conceitos Adicionais sobre Rotas
&lt;/li&gt;
&lt;li&gt;
 Rotas Exatas
&lt;/li&gt;
&lt;li&gt;
 Rotas Simples
&lt;/li&gt;
&lt;li&gt;
 Parâmetros de Rotas
&lt;/li&gt;
&lt;li&gt;
 Tópicos Avançados em React Router
&lt;/li&gt;
&lt;li&gt;
 Proteção de Rotas
&lt;/li&gt;
&lt;li&gt;
 Query Strings
&lt;/li&gt;
&lt;li&gt;
 Lidando com Query Strings no React Router V6+
&lt;/li&gt;
&lt;li&gt;
 Considerações Finais &lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Instalação do React Router
&lt;/h2&gt;

&lt;p&gt;Há duas maneiras de instalar o React Router: usando npm ou yarn.&lt;/p&gt;

&lt;p&gt;Se você estiver usando npm, pode instalar o React Router digitando o seguinte comando no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="nx"&gt;react&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;dom&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você estiver usando yarn, pode instalar o React Router digitando o seguinte comando no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;yarn&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="nx"&gt;react&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;dom&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora que o React Router está instalado, podemos começar a configurá-lo.&lt;/p&gt;




&lt;h2&gt;
  
  
  Componentes Básicos do React Router
&lt;/h2&gt;

&lt;p&gt;Tomando-se como referência a última versão da biblioteca React Router nesta data (&lt;a href="https://reactrouter.com/en/main" rel="noopener noreferrer"&gt;v6.8.0&lt;/a&gt;), os principais componentes são:&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;BrowserRouter&lt;/strong&gt;: O &lt;code&gt;BrowserRouter&lt;/code&gt; é usado para fornecer a funcionalidade de roteamento ao seu aplicativo React. Ele é responsável por gerenciar as mudanças de URL e rotas na página do seu aplicativo. Quando o usuário clica em um link ou digita uma URL na barra de endereços do navegador, o BrowserRouter detecta essa mudança e faz a renderização da página correta de acordo com a rota definida.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Routes&lt;/strong&gt;: O componente &lt;code&gt;Routes&lt;/code&gt; do React Router é usado para gerenciar as rotas da aplicação. Ele é responsável por renderizar o componente correto para a URL atual da página. O componente &lt;code&gt;Routes&lt;/code&gt; precisa ser envolvido por um componente do React Router, como o &lt;code&gt;BrowserRouter&lt;/code&gt; ou &lt;code&gt;MemoryRouter&lt;/code&gt;, para funcionar.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Route&lt;/strong&gt;: O componente &lt;code&gt;Route&lt;/code&gt; é um dos componentes-chave do React Router. Ele é usado para criar rotas na sua aplicação, determinando quais componentes serão renderizados para cada URL específica.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vejamos um exemplo de como os componentes &lt;code&gt;BrowserRouter&lt;/code&gt;, &lt;code&gt;Routes&lt;/code&gt; e &lt;code&gt;Route&lt;/code&gt; podem ser usados na prática:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// Importamos o componente BrowserRouter e o componente Routes do pacote react-router-dom&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;BrowserRouter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Routes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Route&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Importamos as páginas HomePage, AboutPage e ContactPage&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;HomePage&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./pages/HomePage&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;AboutPage&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./pages/AboutPage&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ContactPage&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./pages/ContactPage&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Função principal do componente App&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&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="c1"&gt;// Envolve o componente App com o componente BrowserRouter&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;BrowserRouter&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;/* O componente Routes permite que você crie várias rotas que são renderizadas com base na URL atual */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Routes&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;/* Adiciona uma rota com o caminho exato "/", que renderiza o componente HomePage */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Route&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HomePage&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* Adiciona uma rota com o caminho "/about", que renderiza o componente AboutPage */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Route&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/about&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AboutPage&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* Adiciona uma rota com o caminho "/contact", que renderiza o componente ContactPage */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Route&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/contact&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ContactPage&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Routes&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/BrowserRouter&lt;/span&gt;&lt;span class="err"&gt;&amp;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;// Exporta o componente App como padrão&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O código acima é uma aplicação React que usa o React Router para gerenciar as rotas em seu aplicativo. Aqui está uma explicação passo a passo do código:&lt;/p&gt;

&lt;p&gt;1 - Importamos as dependências necessárias para usar o React Router. Primeiro, importamos o componente &lt;code&gt;BrowserRouter&lt;/code&gt; e o componente &lt;code&gt;Routes&lt;/code&gt; do pacote &lt;code&gt;react-router-dom&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;2 - Em seguida, importamos as páginas &lt;code&gt;HomePage&lt;/code&gt;, &lt;code&gt;AboutPage&lt;/code&gt; e &lt;code&gt;ContactPage&lt;/code&gt;. Essas são as três páginas diferentes que nossa aplicação irá exibir, dependendo da rota atual.&lt;/p&gt;

&lt;p&gt;3 - Definimos a função &lt;code&gt;App&lt;/code&gt;, que é o componente principal da nossa aplicação. Dentro dessa função, usamos o componente &lt;code&gt;BrowserRouter&lt;/code&gt;como envoltório para o resto da aplicação.&lt;/p&gt;

&lt;p&gt;4 - Dentro do componente &lt;code&gt;BrowserRouter&lt;/code&gt;, usamos o componente &lt;code&gt;Routes&lt;/code&gt;para gerenciar as rotas em nossa aplicação. O componente &lt;code&gt;Routes&lt;/code&gt; permite que você crie várias rotas que são renderizadas com base na URL&lt;br&gt;
atual.&lt;/p&gt;

&lt;p&gt;5 - Em seguida, usamos o componente &lt;code&gt;Route&lt;/code&gt; para adicionar três rotas diferentes à nossa aplicação. Cada rota é definida com uma propriedade &lt;code&gt;path&lt;/code&gt; que indica a URL a ser exibida e uma propriedade &lt;code&gt;element&lt;/code&gt; que indica o componente a ser renderizado para aquela URL. A primeira rota tem o caminho exato &lt;code&gt;/&lt;/code&gt;, que renderiza o componente &lt;code&gt;HomePage&lt;/code&gt;. A segunda rota tem o caminho &lt;code&gt;/about&lt;/code&gt;, que renderiza o componente &lt;code&gt;AboutPage&lt;/code&gt;. A terceira rota tem o caminho &lt;code&gt;/contact&lt;/code&gt;, que renderiza o componente &lt;code&gt;ContactPage&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;6 - Finalmente, exportamos o componente &lt;code&gt;App&lt;/code&gt; como padrão, permitindo que seja usado em outros arquivos da aplicação.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Switch&lt;/strong&gt;: O &lt;code&gt;Switch&lt;/code&gt; é um componente do React Router que permite que você selecione apenas uma rota para ser renderizada dentre várias rotas definidas. Isso é útil quando você tem várias rotas que compartilham um prefixo comum na URL, mas deseja mostrar apenas uma dessas rotas.
Aqui está um exemplo de código:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Switch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Route&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&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;lt;&lt;/span&gt;&lt;span class="nx"&gt;Switch&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;/* A rota "/" será renderizada se a URL atual for "/" */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Route&lt;/span&gt; &lt;span class="nx"&gt;exact&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Home&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Route&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* A rota "/about" será renderizada se a URL atual for "/about" */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Route&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/about&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;About&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Route&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* Esta é a rota "padrão" que será renderizada se nenhuma das rotas acima for combinar com a URL atual */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Route&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;NotFound&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Route&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Switch&lt;/span&gt;&lt;span class="err"&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;Neste exemplo, usamos o componente &lt;code&gt;Switch&lt;/code&gt; para envolver nossas rotas.&lt;/p&gt;

&lt;p&gt;Dentro dele, usamos o componente &lt;code&gt;Route&lt;/code&gt; para definir as rotas diferentes que o aplicativo pode ter. A propriedade &lt;code&gt;exact&lt;/code&gt; em &lt;code&gt;&amp;lt;Route exact path="/"&amp;gt;&lt;/code&gt; significa que a rota só será renderizada se a URL atual for exatamente &lt;code&gt;/&lt;/code&gt;. Se omitirmos &lt;code&gt;exact&lt;/code&gt;, a rota seria renderizada para todas as URLs que começarem com &lt;code&gt;/&lt;/code&gt;, como &lt;code&gt;/about&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Finalmente, a rota &lt;code&gt;&amp;lt;Route path="*"&amp;gt;&lt;/code&gt; é a rota padrão que será renderizada se nenhuma das outras rotas combinar com a URL atual.&lt;/p&gt;

&lt;p&gt;Quando o usuário navega no aplicativo, o endereço da URL mudará de acordo com a página em que o usuário está. O React Router usa essa URL para determinar qual rota deve ser renderizada.&lt;/p&gt;

&lt;p&gt;Se nenhuma das rotas definidas dentro do &lt;code&gt;Switch&lt;/code&gt; combinar com a URL atual, a rota padrão será renderizada. Por exemplo, se o usuário estiver na URL &lt;code&gt;/invalid&lt;/code&gt;, nenhuma das rotas definidas dentro do &lt;code&gt;Switch&lt;/code&gt; combinará com esta URL. Neste caso, a rota &lt;code&gt;&amp;lt;Route path="*"&amp;gt;&lt;/code&gt; será renderizada, mostrando o componente &lt;code&gt;NotFound&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Em outras palavras, o &lt;code&gt;Switch&lt;/code&gt; ajuda a garantir que apenas uma rota seja renderizada a qualquer momento, dependendo da URL atual.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Link&lt;/strong&gt;: O componente &lt;code&gt;Link&lt;/code&gt; do React Router é uma forma simples de criar links para outras páginas em seu aplicativo. Em vez de usar um elemento &lt;code&gt;a&lt;/code&gt; normal para navegar entre páginas, você usa o componente &lt;code&gt;Link&lt;/code&gt;, que fornece algumas vantagens, como manter o histórico do navegador e evitar recarregar a página inteira.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aqui está um exemplo de código para criar um link para a página inicial de seu aplicativo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;HomeLink&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;lt;&lt;/span&gt;&lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nx"&gt;Home&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&lt;/span&gt;&lt;span class="err"&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;Neste exemplo, estamos importando o componente &lt;code&gt;Link&lt;/code&gt; do pacote &lt;code&gt;reactrouter-dom&lt;/code&gt;. Em seguida, criamos uma função &lt;code&gt;HomeLink&lt;/code&gt; que retorna um componente &lt;code&gt;Link&lt;/code&gt;. O atributo &lt;code&gt;to&lt;/code&gt; é usado para especificar a URL para a qual o link deve levar. Finalmente, dentro do componente &lt;code&gt;Link&lt;/code&gt;, colocamos o texto que será exibido como link na página.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NavLink&lt;/strong&gt;: O &lt;code&gt;NavLink&lt;/code&gt; é um componente do React Router que permite a criação de links para outras páginas ou rotas em sua aplicação. Ele funciona de forma similar ao elemento HTML &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;, mas com algumas vantagens extras, como a capacidade de ativar estilos específicos quando o usuário está na página associada ao link. o &lt;code&gt;NavLink&lt;/code&gt; é frequentemente usado em menus, como navbars.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aqui está um exemplo de como você pode usar o &lt;code&gt;NavLink&lt;/code&gt; em um componente de menu navbar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NavLink&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Navbar&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;lt;&lt;/span&gt;&lt;span class="nx"&gt;nav&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&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;/* Cria o link Home */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;NavLink&lt;/span&gt; 
            &lt;span class="nx"&gt;exact&lt;/span&gt; 
            &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
            &lt;span class="nx"&gt;activeClassName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;selected&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nx"&gt;Home&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/NavLink&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&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;/* Cria o link About */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;NavLink&lt;/span&gt; 
            &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/about&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
            &lt;span class="nx"&gt;activeClassName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;selected&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nx"&gt;About&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/NavLink&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&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;/* Cria o link Contact */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;NavLink&lt;/span&gt; 
            &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/contact&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
            &lt;span class="nx"&gt;activeClassName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;selected&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nx"&gt;Contact&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/NavLink&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ul&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/nav&lt;/span&gt;&lt;span class="err"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Navbar&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este código cria um componente React chamado &lt;code&gt;Navbar&lt;/code&gt; que renderiza um menu de navegação. O componente usa o &lt;code&gt;NavLink&lt;/code&gt; do React Router para criar links para diferentes páginas na aplicação.&lt;/p&gt;

&lt;p&gt;A estrutura básica do componente é uma &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt; que contém uma lista &lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt; com três itens de menu, cada um contendo um link. Cada link é criado usando o componente &lt;code&gt;NavLink&lt;/code&gt;, especificando a URL a ser navegada quando o usuário clicar no link com a propriedade &lt;code&gt;to&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;A propriedade &lt;code&gt;exact&lt;/code&gt; especifica que o link deve ser uma correspondência exata com a URL, ou seja, apenas a página inicial corresponderá exatamente à URL raiz (&lt;code&gt;/&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;A propriedade &lt;code&gt;activeClassName&lt;/code&gt; especifica o nome da classe CSS que será aplicada ao link quando o usuário estiver na página associada ao link.&lt;/p&gt;

&lt;p&gt;Neste exemplo, a classe &lt;code&gt;selected&lt;/code&gt; será aplicada.&lt;/p&gt;

&lt;p&gt;Por fim, o componente é exportado como &lt;code&gt;default&lt;/code&gt; para ser usado em outros lugares da aplicação.&lt;br&gt;
&lt;br&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Navigate&lt;/strong&gt;: O componente &lt;code&gt;Navigate&lt;/code&gt; do React Router é usado para navegar entre as rotas em uma aplicação React. É uma maneira simples de mudar de página sem precisar atualizar a página inteira. Em vez disso, ele apenas atualiza a parte da página que é exibida na rota atual.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aqui está um exemplo de código que mostra como usar o &lt;code&gt;Navigate&lt;/code&gt; para navegar de uma página para outra:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Navigate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Example&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;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&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;/* Exibe o título da página atual */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Minha&lt;/span&gt; &lt;span class="nx"&gt;página&lt;/span&gt; &lt;span class="nx"&gt;atual&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&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;/* Usa o componente Navigate para navegar para a rota "/outra-página" */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Navigate&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/outra-pagina&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Ir&lt;/span&gt; &lt;span class="nx"&gt;para&lt;/span&gt; &lt;span class="nx"&gt;outra&lt;/span&gt; &lt;span class="nx"&gt;página&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Navigate&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&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;Neste exemplo, estamos importando o componente &lt;code&gt;Navigate&lt;/code&gt; do pacote &lt;code&gt;react-router-dom&lt;/code&gt;. Em seguida, estamos criando uma função &lt;code&gt;Example&lt;/code&gt; que retorna um elemento &lt;code&gt;div&lt;/code&gt; com um cabeçalho e um botão.&lt;/p&gt;

&lt;p&gt;Quando o usuário clicar no botão, o componente &lt;code&gt;Navigate&lt;/code&gt; será acionado e a rota será alterada para &lt;code&gt;/outra-pagina&lt;/code&gt;. Isso significa que a página será atualizada com o conteúdo da nova rota, sem atualizar a página inteira.&lt;/p&gt;

&lt;p&gt;Estes foram apenas alguns dos componentes básicos mais utilizados da biblioteca React Router. Não deixe de acessar os documentos oficiais para conhecer os demais componentes e suas funcionalidades: &lt;a href="https://reactrouter.com/en/main" rel="noopener noreferrer"&gt;https://reactrouter.com/en/main&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Hooks Básicos do React Router
&lt;/h2&gt;

&lt;p&gt;Agora, exploraremos alguns dos hooks mais populares da biblioteca React Router e como eles podem ser usados para melhorar a funcionalidade e a experiência do usuário em sua aplicação.&lt;/p&gt;

&lt;p&gt;Hooks são uma funcionalidade no React que permitem que você compartilhe lógica de estado entre componentes sem ter que escrever componentes de classe. No React Router, os hooks permitem que você acesse e manipule informações da rota em sua aplicação, como a URL atual, o histórico de navegação e os parâmetros da rota. Eles são uma maneira fácil e poderosa de adicionar funcionalidade à sua aplicação.&lt;/p&gt;

&lt;p&gt;Quando se trata de definir rotas em sua aplicação, é importante escolher a abordagem certa para atender às suas necessidades. Você pode usar um componente como &lt;code&gt;Route&lt;/code&gt; ou &lt;code&gt;Switch&lt;/code&gt; para definir rotas, ou pode usar um hook como &lt;code&gt;useRoutes&lt;/code&gt; para renderizar rotas condicionalmente. A escolha entre um componente e um hook depende da complexidade de suas rotas e da funcionalidade que você precisa adicionar à sua aplicação. Abaixo, vamos explorá-los em detalhes.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;useRoutes&lt;/strong&gt;: O hook &lt;code&gt;useRoutes&lt;/code&gt; do React Router é usado para renderizar rotas condicionalmente com base nas condições fornecidas. É uma alternativa ao uso de &lt;code&gt;Route&lt;/code&gt; e &lt;code&gt;Switch&lt;/code&gt; para definir rotas em sua aplicação.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aqui está um exemplo de como usar o hook &lt;code&gt;useRoutes&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useRoutes&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-router-dom&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;routes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="c1"&gt;// Rota para a página inicial&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;element&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Home&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="c1"&gt;// Rota para a página de login&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/login&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;element&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Login&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="c1"&gt;// Rota condicional para o dashboard&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="sr"&gt;dashboard/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;element&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;isLoggedIn&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Dashboard&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Redirect&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/login&lt;/span&gt;&lt;span class="dl"&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="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Obtém o resultado da rota atual&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;routeResult&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRoutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Renderiza o resultado da rota atual&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&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;routeResult&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, o hook &lt;code&gt;useRoutes&lt;/code&gt; é usado para renderizar diferentes componentes dependendo da URL atual. Temos três rotas definidas em &lt;code&gt;routes&lt;/code&gt;: uma para a página inicial (&lt;code&gt;"/"&lt;/code&gt;), uma para a página de login (&lt;code&gt;"/login"&lt;/code&gt;) e uma para o dashboard (&lt;code&gt;"/dashboard"&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;A rota para o dashbaord é condicional: se a variável &lt;code&gt;isLoggedIn&lt;/code&gt; for verdadeira, o usuário será redirecionado para o dashboard, caso contrário, será redirecionado para a página de login.&lt;/p&gt;

&lt;p&gt;O resultado do hook &lt;code&gt;useRoutes&lt;/code&gt; é atribuído à variável &lt;code&gt;routeResult&lt;/code&gt; e, em seguida, renderizado na tela usando &lt;code&gt;{routeResult}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Este exemplo mostra como o hook &lt;code&gt;useRoutes&lt;/code&gt; pode ser usado para adicionar funcionalidade condicional à sua aplicação, permitindo que você defina rotas de maneira fácil e eficiente.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;useParams&lt;/strong&gt;: O hook &lt;code&gt;useParams&lt;/code&gt; é um hook do React Router que permite acessar os parâmetros da URL da rota atual. Ele retorna um objeto que contém as chaves e valores dos parâmetros da URL.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por exemplo, se você tiver uma rota com a URL &lt;code&gt;/users/:id&lt;/code&gt;, você pode usar o hook &lt;code&gt;useParams&lt;/code&gt; para acessar o valor do ID do usuário.&lt;/p&gt;

&lt;p&gt;Veja abaixo um exemplo de como usar o hook &lt;code&gt;useParams&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useParams&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UserDetail&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Usa o hook useParams para acessar os parâmetros da URL&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;id&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useParams&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;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Detalhes&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="nx"&gt;usuário&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&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;A primeira linha importa o hook &lt;code&gt;useParams&lt;/code&gt; do pacote &lt;code&gt;react-router-dom&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A função &lt;code&gt;UserDetail&lt;/code&gt; é um componente React que será renderizado quando a URL da rota corresponder a uma rota que inclui um parâmetro, como &lt;code&gt;/usuarios/:id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Dentro da função &lt;code&gt;UserDetail&lt;/code&gt;, o hook &lt;code&gt;useParams&lt;/code&gt; é chamado usando &lt;code&gt;const { id } = useParams()&lt;/code&gt;. Este hook retorna um objeto que contém as chaves e valores dos parâmetros da URL. No caso deste exemplo, o objeto terá uma chave &lt;code&gt;id&lt;/code&gt; e um valor que corresponde ao ID do usuário passado na URL.&lt;/p&gt;

&lt;p&gt;O componente &lt;code&gt;UserDetail&lt;/code&gt; renderiza um elemento &lt;code&gt;div&lt;/code&gt; que contém um cabeçalho &lt;code&gt;h1&lt;/code&gt; que exibe o texto "Detalhes do usuário" seguido pelo valor do ID do usuário acessado pelo hook &lt;code&gt;useParams&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Por exemplo, se a URL da rota for &lt;code&gt;/usuarios/123&lt;/code&gt;, o componente &lt;code&gt;UserDetail&lt;/code&gt; renderizará o seguinte HTML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Detalhes&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="nx"&gt;usuário&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;useLocation&lt;/strong&gt;: O hook &lt;code&gt;useLocation&lt;/code&gt; permite que você acesse informações sobre a URL atualmente exibida no navegador. É uma forma de ter informações sobre a rota que o usuário está visualizando no momento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vejamos um exemplo de como ele pode ser útil:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useLocation&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ScrollToTopOnMount&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;pathname&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useLocation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// sempre que a rota muda, faça o scroll da página para o topo&lt;/span&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="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scrollTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&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="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&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;Neste exemplo, estamos usando &lt;code&gt;useLocation&lt;/code&gt; para acessar o &lt;code&gt;pathname&lt;/code&gt; da rota atual. Quando o &lt;code&gt;pathname&lt;/code&gt; muda, o &lt;code&gt;useEffect&lt;/code&gt; é executado e faz o scroll da página para o topo. Isso garante que ao mudar de rota, o usuário sempre comece vendo o topo da página, independentemente de onde estivesse na página anterior.&lt;/p&gt;

&lt;p&gt;Outro exemplo importante para entendermos o &lt;code&gt;useLocation&lt;/code&gt; no React Router seria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useLocation&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;HighlightActiveNavLink&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Acessa informações sobre a URL atual usando o hook useLocation&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useLocation&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;lt;&lt;/span&gt;&lt;span class="nx"&gt;nav&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;'&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="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Home&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/about&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;'&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="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/about&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;About&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/contact&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;'&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="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/contact&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Contact&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ul&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/nav&lt;/span&gt;&lt;span class="err"&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;Aqui, estamos usando o hook &lt;code&gt;useLocation&lt;/code&gt; para acessar informações sobre a URL atual. Em seguida, estamos comparando o valor da propriedade &lt;code&gt;pathname&lt;/code&gt; da variável &lt;code&gt;location&lt;/code&gt; com diferentes rotas para verificar qual deles é a rota atual. Finalmente, estamos adicionando uma classe &lt;code&gt;active&lt;/code&gt; ao item de menu correto para destacá-lo visualmente como o link ativo.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;useNavigate&lt;/strong&gt;: O hook &lt;code&gt;useNavigate&lt;/code&gt; é usado no React Router para navegar programaticamente entre as rotas de uma aplicação. Em vez de clicar em um link para mudar de página, você pode usar o hook &lt;code&gt;useNavigate&lt;/code&gt; para mudar de página a partir de um componente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por exemplo, imagine que você tenha um formulário de contato em sua aplicação e, após o usuário enviar o formulário, você gostaria de redirecioná-lo para uma página de agradecimento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useNavigate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ContactForm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Importa o hook `useNavigate` para poder navegar para outras páginas&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;navigate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useNavigate&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="nx"&gt;event&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;event&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="c1"&gt;// Aqui você pode adicionar a lógica para enviar o formulário ao seu back-end&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;

    &lt;span class="c1"&gt;// Depois de enviar o formulário com sucesso, navegue para a página de agradecimento&lt;/span&gt;
    &lt;span class="nf"&gt;navigate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/obrigado&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;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="nx"&gt;onSubmit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&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;/* Seu formulário de contato aqui */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;submit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Enviar&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/form&lt;/span&gt;&lt;span class="err"&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;Neste exemplo, usamos o hook &lt;code&gt;useNavigate&lt;/code&gt; para importar a função &lt;code&gt;navigate&lt;/code&gt;. Em seguida, quando o usuário submete o formulário, chamamos a função &lt;code&gt;navigate&lt;/code&gt; e passamos a URL para a página de agradecimento, que é &lt;code&gt;'/obrigado'&lt;/code&gt; neste exemplo.&lt;/p&gt;

&lt;p&gt;Isso fará com que o usuário seja redirecionado para a página de agradecimento após o envio bem-sucedido do formulário.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;useHistory&lt;/strong&gt;: O hook &lt;code&gt;useHistory&lt;/code&gt; do React Router nos permite ter acesso ao objeto &lt;code&gt;history&lt;/code&gt; da nossa aplicação, o que significa que podemos navegar para diferentes páginas sem precisar usar links ou botões. Esse hook é muito útil quando queremos navegar para outra página de forma programática, ou seja, a partir de uma ação do usuário ou de algum evento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos ver um exemplo de como podemos utilizar o &lt;code&gt;useHistory&lt;/code&gt; para navegar para uma página de detalhes a partir de um componente de listagem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useHistory&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ProductList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Acessamos o objeto history com o hook useHistory&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useHistory&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handleClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Usamos o método push do objeto history para navegar para outra página&lt;/span&gt;
    &lt;span class="nx"&gt;history&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/products/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Produto&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Produto&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Produto&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ul&lt;/span&gt;&lt;span class="err"&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;Aqui, o hook &lt;code&gt;useHistory&lt;/code&gt; é usado para acessar o objeto &lt;code&gt;history&lt;/code&gt;, que permite navegar entre as páginas da aplicação.&lt;/p&gt;

&lt;p&gt;1 - Primeiramente, importamos o hook &lt;code&gt;useHistory&lt;/code&gt; do pacote &lt;code&gt;react-router-dom&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;2 - Em seguida, criamos uma função chamada &lt;code&gt;ProductList&lt;/code&gt;, que será o nosso componente de lista de produtos.&lt;/p&gt;

&lt;p&gt;3 - Dentro desta função, usamos o hook &lt;code&gt;useHistory&lt;/code&gt; para acessar o objeto &lt;code&gt;history&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;4 - Criamos uma função chamada &lt;code&gt;handleClick&lt;/code&gt;, que será chamada quando o usuário clicar em um produto na lista.&lt;/p&gt;

&lt;p&gt;5 - A função &lt;code&gt;handleClick&lt;/code&gt; usa o método &lt;code&gt;push&lt;/code&gt; do objeto &lt;code&gt;history&lt;/code&gt; para navegar para a página de detalhes do produto. O método &lt;code&gt;push&lt;/code&gt; recebe como argumento o caminho da página para onde queremos navegar, no formato &lt;code&gt;/products/{id}&lt;/code&gt;, onde &lt;code&gt;{id}&lt;/code&gt; é o ID do produto que o usuário clicou.&lt;/p&gt;

&lt;p&gt;6 - Por fim, retornamos uma lista de elementos HTML &lt;code&gt;li&lt;/code&gt; que representam os produtos. Cada elemento tem um &lt;code&gt;onClick&lt;/code&gt; que chama a função &lt;code&gt;handleClick&lt;/code&gt; passando o ID do produto.&lt;/p&gt;

&lt;p&gt;Dessa forma, apesar da navegação ser acionada ao clique do usuário, a troca de páginas é mais automatizada, já que o clique no link do produto está sendo tratado dentro do componente, ao invés de ser feito diretamente na página HTML.&lt;/p&gt;

&lt;p&gt;Isso significa que é possível colocar lógicas dentro do componente que determinem para onde o usuário deve ser direcionado de acordo com certas condições, antes de redirecioná-lo.&lt;/p&gt;

&lt;p&gt;Para compreendermos melhor, vamos ver mais um exemplo no qual o &lt;code&gt;useHistory&lt;/code&gt; é comumente usado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useHistory&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Login&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Acessamos o objeto history com o hook useHistory&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useHistory&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Mantemos o estado do formulário de login&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;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUsername&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;password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setPassword&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="c1"&gt;// Função chamada quando o formulário é enviado&lt;/span&gt;
  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handleSubmit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;event&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="c1"&gt;// Aqui você pode colocar o código para autenticar o usuário&lt;/span&gt;
    &lt;span class="c1"&gt;// Suponha que o usuário está autenticado&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isAuthenticated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&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;isAuthenticated&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Navegamos para a página inicial se o usuário for autenticado&lt;/span&gt;
      &lt;span class="nx"&gt;history&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&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="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;lt;&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="nx"&gt;onSubmit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;
        &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setUsername&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
        &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Nome de usuário&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;
        &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setPassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
        &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Senha&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;submit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Entrar&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/form&lt;/span&gt;&lt;span class="err"&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;Neste exemplo, quando o usuário preenche o formulário de login e clica no botão &lt;code&gt;Entrar&lt;/code&gt;, a função &lt;code&gt;handleSubmit&lt;/code&gt; é chamada. Nela, fazemos a validação de autenticação do usuário (neste caso, supomos que ele está autenticado). &lt;/p&gt;

&lt;p&gt;Se o usuário for autenticado, usamos o método &lt;code&gt;push&lt;/code&gt; do objeto &lt;code&gt;history&lt;/code&gt; para navegar para a página inicial (&lt;code&gt;/&lt;/code&gt;). Dessa forma, a navegação é acionada programaticamente sem a interação do usuário com um link ou botão específico.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;p&gt;Nós vimos apenas alguns dos hooks disponíveis no React Router, mas há muito mais a ser explorado. Para saber mais sobre os outros hooks e como eles podem ser usados em seus projetos, visite a documentação oficial no link: &lt;a href="https://reactrouter.com/en/main" rel="noopener noreferrer"&gt;https://reactrouter.com/en/main&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Conceitos Adicionais sobre Rotas
&lt;/h2&gt;

&lt;p&gt;Agora que já temos uma noção básica dos principais hooks e componentes em rotas de aplicativos React, não podemos deixar de conhecer alguns conceitos essenciais antes de avançarmos.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Rotas Exatas
&lt;/h3&gt;

&lt;p&gt;As rotas exatas são aquelas que correspondem exatamente à URL que você especificou. Por exemplo, se você tem uma rota definida como &lt;code&gt;/sobre&lt;/code&gt;, então somente a URL &lt;code&gt;/sobre&lt;/code&gt; corresponderá a esta rota. Se alguém acessar &lt;code&gt;/sobre/mais-informacoes&lt;/code&gt;, ele não será direcionado para esta rota.&lt;/p&gt;

&lt;p&gt;Para criar uma rota exata, você pode usar o método &lt;code&gt;exact&lt;/code&gt; na sua definição de rota:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Route&lt;/span&gt; &lt;span class="nx"&gt;exact&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/sobre&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;AboutPage&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;h3&gt;
  
  
  Rotas Simples
&lt;/h3&gt;

&lt;p&gt;As rotas simples, por outro lado, são mais flexíveis e podem corresponder a qualquer URL que comece com o padrão que você especificou. Por exemplo, se você tem uma rota definida como &lt;code&gt;/sobre&lt;/code&gt;, então tanto a URL &lt;code&gt;/sobre&lt;/code&gt; quanto &lt;code&gt;/sobre/mais-informacoes&lt;/code&gt; corresponderão a esta rota.&lt;/p&gt;

&lt;p&gt;Para criar uma rota simples, você não precisa usar o método &lt;code&gt;exact&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Route&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/sobre&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;AboutPage&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;h3&gt;
  
  
  Parâmetros de Rotas
&lt;/h3&gt;

&lt;p&gt;Às vezes, você pode querer que a sua rota corresponda a uma URL que inclua informações adicionais, como o ID de um usuário ou o nome de um produto. Neste caso, você pode usar parâmetros de rota.&lt;/p&gt;

&lt;p&gt;Por exemplo, você pode criar uma rota que corresponda a URL &lt;code&gt;/produto/:id&lt;/code&gt;, onde &lt;code&gt;:id&lt;/code&gt; representa um parâmetro que pode ser qualquer valor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Route&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/produto/:id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;ProductPage&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, se alguém acessar a URL &lt;code&gt;/produto/123&lt;/code&gt;, ele será direcionado para a página do produto com ID 123. Você pode acessar o valor desse parâmetro na sua página de destino usando o objeto &lt;code&gt;props&lt;/code&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Tópicos Avançados em React Router
&lt;/h1&gt;

&lt;p&gt;Agora que você já possui uma compreensão básica dos componentes, hooks e conceitos do React Router, está na hora de explorar alguns tópicos avançados. Nesta seção, você aprenderá sobre proteção de rotas e como trabalhar com query strings no React Router.&lt;/p&gt;

&lt;p&gt;A proteção de rotas é uma funcionalidade importante para garantir que somente usuários autorizados acessem certas áreas de seu aplicativo. Além disso, você também aprenderá sobre query strings, que permitem que você passe informações adicionais na URL. Finalmente, você descobrirá como lidar com query strings no React Router V6+.&lt;/p&gt;

&lt;p&gt;Com estes conhecimentos, você estará pronto para construir aplicativos ainda mais avançados e funcionais com o React Router. Vamos começar!&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Proteção de Rotas
&lt;/h2&gt;

&lt;p&gt;Em algumas situações, queremos restringir o acesso a algumas páginas do aplicativo para usuários não autorizados. Para fazer isso, podemos criar rotas "privadas", por exemplo, usando o recurso "routes" do React Router versão 6 em diante para proteger suas rotas.&lt;/p&gt;

&lt;p&gt;Para proteger uma rota, você precisa criar uma função que verifica se o usuário está autenticado e, se não estiver, redireciona-o para uma página de login. Aqui está um exemplo de código de uma função de verificação de autenticação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isAuthenticated&lt;/span&gt; &lt;span class="o"&gt;=&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;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;null&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;A função &lt;code&gt;isAuthenticated&lt;/code&gt; verifica se o usuário está autenticado ou não. Ele faz isso verificando se existe um token armazenado no &lt;code&gt;localStorage&lt;/code&gt; do navegador.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;localStorage&lt;/code&gt; é uma API de armazenamento de dados que permite armazenar dados no navegador de forma persistente, mesmo depois que a página é fechada. Nesse caso, a função está verificando se existe um item chamado "token" no &lt;code&gt;localStorage&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Se o item "token" existir, significa que o usuário está autenticado e a função retorna &lt;code&gt;true&lt;/code&gt;. Se o item "token" não existir, significa que o usuário não está autenticado e a função retorna &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Em seguida, você pode usar essa função na sua rota para protegê-la. Aqui está um exemplo de como fazer isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;navigate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@reach/router&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;PrivateRoute&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;rest&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;isAuthenticated&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;navigate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/login&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&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;lt;&lt;/span&gt;&lt;span class="nx"&gt;Route&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;rest&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;children&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Route&lt;/span&gt;&lt;span class="err"&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;Este código cria um componente chamado &lt;code&gt;PrivateRoute&lt;/code&gt; que é usado para proteger rotas na aplicação.&lt;/p&gt;

&lt;p&gt;O componente importa a função &lt;code&gt;navigate&lt;/code&gt; do pacote &lt;code&gt;@reach/router&lt;/code&gt;. Essa função é usada para navegar para outra rota da aplicação.&lt;/p&gt;

&lt;p&gt;A função &lt;code&gt;PrivateRoute&lt;/code&gt; tem dois parâmetros: &lt;code&gt;children&lt;/code&gt; e &lt;code&gt;rest&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;children&lt;/code&gt; representa o conteúdo da rota protegida e &lt;code&gt;rest&lt;/code&gt; representa todos os outros parâmetros da rota, como &lt;code&gt;path&lt;/code&gt;, &lt;code&gt;exact&lt;/code&gt;, etc.&lt;/p&gt;

&lt;p&gt;Dentro da função &lt;code&gt;PrivateRoute&lt;/code&gt;, há uma verificação se o usuário está autenticado ou não, usando a função &lt;code&gt;isAuthenticated&lt;/code&gt;. Se o usuário não estiver autenticado, a função &lt;code&gt;navigate&lt;/code&gt; é usada para navegar para a rota "/login". Nesse caso, a função &lt;code&gt;PrivateRoute&lt;/code&gt; retorna &lt;code&gt;null&lt;/code&gt;, o que significa que nenhum conteúdo será renderizado na tela.&lt;/p&gt;

&lt;p&gt;Se o usuário estiver autenticado, a função &lt;code&gt;PrivateRoute&lt;/code&gt; retorna uma &lt;code&gt;Route&lt;/code&gt; com todos os parâmetros da rota original (&lt;code&gt;rest&lt;/code&gt;) e o conteúdo da rota protegida (&lt;code&gt;children&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Agora, você pode usar o componente "PrivateRoute" em vez de "Route" em sua aplicação para proteger uma rota específica.&lt;/p&gt;

&lt;p&gt;Aqui está um exemplo de como fazer isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;PrivateRoute&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./PrivateRoute&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&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;lt;&lt;/span&gt;&lt;span class="nx"&gt;Routes&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PrivateRoute&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dashboard&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Dashboard&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Route&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;login&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Login&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Routes&lt;/span&gt;&lt;span class="err"&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;Este código é um exemplo de como usar o componente &lt;code&gt;PrivateRoute&lt;/code&gt; na sua aplicação.&lt;/p&gt;

&lt;p&gt;A função &lt;code&gt;App&lt;/code&gt; é o componente principal da aplicação. Ela retorna um componente &lt;code&gt;Routes&lt;/code&gt; com as rotas da aplicação.&lt;/p&gt;

&lt;p&gt;Há duas rotas definidas: &lt;code&gt;dashboard&lt;/code&gt; e &lt;code&gt;login&lt;/code&gt;. A rota &lt;code&gt;dashboard&lt;/code&gt; é protegida usando o componente &lt;code&gt;PrivateRoute&lt;/code&gt;. Isso significa que somente usuários autenticados poderão acessar a rota &lt;code&gt;dashboard&lt;/code&gt;. Se o usuário não estiver autenticado, será redirecionado para a rota &lt;code&gt;login&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A rota &lt;code&gt;login&lt;/code&gt; não está protegida e pode ser acessada por qualquer usuário, independentemente de seu estado de autenticação.&lt;/p&gt;

&lt;p&gt;Em suma, proteger rotas no React Router versão 6 é fácil usando apenas o componente "route" e a função "navigate". Você pode criar um componente personalizado, como "PrivateRoute", para proteger suas rotas e garantir que apenas usuários autenticados tenham acesso a elas.&lt;/p&gt;

&lt;p&gt;Alem dessa, existem várias outras maneiras de se criar proteção de rotas com o React Router. Caso queira saber mais, recomendo o artigo &lt;a href="https://dev.to/iamandrewluca/private-route-in-react-router-v6-lg5"&gt;Private Route in react-router v6&lt;/a&gt; de André Luca.&lt;/p&gt;




&lt;h2&gt;
  
  
  Query Strings
&lt;/h2&gt;

&lt;p&gt;Uma query string é uma parte opcional de uma URL que contém informações adicionais para o servidor. Ela é composta por pares de chave-valor separados por caracteres especiais, como "&amp;amp;", ";" ou "?".&lt;/p&gt;

&lt;p&gt;A query string é enviada para o servidor como parte da requisição HTTP. O servidor pode usar essas informações para determinar como processar a requisição e retornar uma resposta adequada. Por exemplo, a query string pode fornecer informações de pesquisa, filtros de resultados de pesquisa, preferências de usuário, entre outros.&lt;/p&gt;

&lt;p&gt;Por exemplo, na URL "&lt;a href="https://twitter.com/search?q=Newcastle&amp;amp;src=trend_click&amp;amp;vertical=trends" rel="noopener noreferrer"&gt;https://twitter.com/search?q=Newcastle&amp;amp;src=trend_click&amp;amp;vertical=trends&lt;/a&gt;", as strings "?" e "&amp;amp;" são usadas para separar as informações adicionais na query string da URL.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A string "?" marca o início da query string. Tudo após o "?" é considerado parte da query string.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A string "&amp;amp;" é usada para separar diferentes pares de chave-valor na query string. Cada par de chave-valor é separado pelo caractere "&amp;amp;".&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"/search" é o caminho para a página específica dentro do domínio.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"q=Newcastle" é o primeiro par de chave-valor na query string. "q" é a chave que representa o termo de pesquisa e "Newcastle" é o valor desse termo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"src=trend_click" é o segundo par de chave-valor na query string. "src" é a chave e "trend_click" é o valor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"vertical=trends" é o terceiro par de chave-valor na query string. "vertical" é a chave e "trends" é o valor.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em síntese, a URL completa fornece informações para o back-end sobre o que o usuário está procurando no site do Twitter, bem como informações adicionais sobre a origem da pesquisa e o contexto da pesquisa.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Lidando com Query Strings no React Router V6+
&lt;/h3&gt;

&lt;p&gt;No React Router v6, você pode usar query strings em suas rotas com ajuda do módulo &lt;code&gt;URLSearchParams&lt;/code&gt; e &lt;code&gt;useSearchParams&lt;/code&gt;. URLSearchParams é uma classe que facilita o trabalho de trabalhar com query strings na URL, permitindo a você extrair as informações da query string de forma simples e eficiente.&lt;/p&gt;

&lt;p&gt;Use o hook &lt;code&gt;useSearchParams&lt;/code&gt; para acessar as informações da query string na sua aplicação. Este hook retorna um objeto com as informações da query string, onde você pode obter os valores usando a sintaxe de objeto, como &lt;code&gt;searchParams.get('key1')&lt;/code&gt;. Além disso, você pode usar o método &lt;code&gt;set()&lt;/code&gt; do objeto &lt;code&gt;searchParams&lt;/code&gt; para definir ou atualizar os valores na query string.&lt;/p&gt;

&lt;p&gt;Aqui está um exemplo de como você pode usar query strings com o hook &lt;code&gt;useSearchParams&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useLocation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useSearchParams&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useNavigate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;SearchPage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Pega a localização atual da URL&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useLocation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Pega os parâmetros da query string&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;searchParams&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useSearchParams&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Busca o valor do parâmetro "q" na query string ou inicializa com uma string vazia&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;searchQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;searchParams&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;q&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Gerencia o estado do valor do input de busca&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;searchInput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setSearchInput&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="nx"&gt;searchQuery&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Pega a função navigate para navegar para outra página&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;navigate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useNavigate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Manipula o envio do formulário de busca&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="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&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="c1"&gt;// Previne o comportamento padrão de submit do formulário&lt;/span&gt;
    &lt;span class="nx"&gt;event&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="c1"&gt;// Define o valor do parâmetro "q" na query string&lt;/span&gt;
    &lt;span class="nx"&gt;searchParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;q&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;searchInput&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Navega para a página atual, adicionando os parâmetros da query string&lt;/span&gt;
    &lt;span class="nf"&gt;navigate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;?&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;searchParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&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;lt;&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="nx"&gt;onSubmit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;
        &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;searchInput&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setSearchInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
      &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;submit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Buscar&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/form&lt;/span&gt;&lt;span class="err"&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;Este código cria uma página de busca que permite ao usuário digitar uma consulta e enviá-la. Aqui estão as coisas importantes que estão acontecendo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Usamos &lt;code&gt;useLocation&lt;/code&gt; e &lt;code&gt;useSearchParams&lt;/code&gt; do pacote &lt;code&gt;react-router-dom&lt;/code&gt; para obter informações sobre a localização atual da página (incluindo a query string) e trabalhar com os parâmetros da query string.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Usamos &lt;code&gt;useState&lt;/code&gt; para gerenciar o estado do valor do input de busca. Isso permite que o usuário digite algo na caixa de busca e que esse valor seja armazenado para que possamos usá-lo quando o usuário clicar em "Buscar".&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Usamos &lt;code&gt;useNavigate&lt;/code&gt; para obter a função &lt;code&gt;navigate&lt;/code&gt; que nos permite navegar para outra página.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Temos uma função &lt;code&gt;handleSubmit&lt;/code&gt; que é chamada quando o usuário envia o formulário de busca. Essa função define o valor do parâmetro "q" na query string usando &lt;code&gt;searchParams.set&lt;/code&gt; e, em seguida, usa &lt;code&gt;navigate&lt;/code&gt; para navegar para a página atual, adicionando os parâmetros da query string.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Finalmente, retornamos um formulário que tem um input para digitar a consulta e um botão "Buscar" que, quando clicado, chama a função &lt;code&gt;handleSubmit&lt;/code&gt;. O estado atual do input de busca é atualizado a cada vez que o usuário digita algo na caixa, graças ao &lt;code&gt;onChange&lt;/code&gt; no input.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este código modifica a query string da URL atual quando o formulário é enviado. A query string é a parte da URL após o símbolo de &lt;code&gt;?&lt;/code&gt; e é composta por pares de chave e valor (por exemplo, &lt;code&gt;chave=valor&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Quando o formulário é enviado, o evento &lt;code&gt;submit&lt;/code&gt; é manipulado pela função &lt;code&gt;handleSubmit&lt;/code&gt;. Nesta função, o valor do input de busca é definido como o valor do parâmetro &lt;code&gt;q&lt;/code&gt; na query string usando o método &lt;code&gt;set&lt;/code&gt; do objeto &lt;code&gt;searchParams&lt;/code&gt;. Em seguida, a função navigate é usada para navegar para a página atual, adicionando a query string modificada à URL.&lt;/p&gt;

&lt;p&gt;Por exemplo, se a URL atual for &lt;code&gt;www.example.com/search&lt;/code&gt;, após o envio do formulário com o valor de busca &lt;code&gt;react&lt;/code&gt;, a URL será alterada para &lt;code&gt;www.example.com/search?q=react&lt;/code&gt;. A query string &lt;code&gt;?q=react&lt;/code&gt; representa a chave &lt;code&gt;q&lt;/code&gt; com o valor &lt;code&gt;react&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Existem diversas formas de manipular query strings com a biblioteca React Router. Para saber mais, acesse a documentação oficial em &lt;a href="https://reactrouter.com/en/main" rel="noopener noreferrer"&gt;https://reactrouter.com/en/main&lt;/a&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Considerações Finais
&lt;/h1&gt;

&lt;p&gt;Parabéns por chegar até aqui! Você agora tem uma compreensão sólida do React Router e como ele pode ser usado para gerenciar rotas em seu aplicativo React. Desde a instalação até os conceitos avançados, você aprendeu como usar os componentes e hooks básicos do React Router, trabalhar com parâmetros de rotas, proteger suas rotas e lidar com query strings.&lt;/p&gt;

&lt;p&gt;Com este conhecimento, você pode construir aplicativos React mais avançados e ricos em funcionalidades. Continue aprendendo e experimentando com o React Router para se tornar um profissional ainda mais capacitado.&lt;/p&gt;

&lt;p&gt;Em conclusão, o React Router é uma ferramenta poderosa para gerenciar as rotas em seu aplicativo React. Seguindo este guia, você agora tem a base necessária para criar aplicativos com uma navegação clara e fácil de usar.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>management</category>
      <category>discuss</category>
    </item>
    <item>
      <title>⚛Os 10 React Hooks Mais Úteis: 07 - useMemo⚛</title>
      <dc:creator>Marcelo Petry</dc:creator>
      <pubDate>Thu, 05 Jan 2023 15:45:02 +0000</pubDate>
      <link>https://dev.to/mpetry/os-10-react-hooks-mais-uteis-07-usememo-cpi</link>
      <guid>https://dev.to/mpetry/os-10-react-hooks-mais-uteis-07-usememo-cpi</guid>
      <description>&lt;p&gt;&lt;em&gt;Este é o sétimo artigo de uma série de 10, que explica de forma simplificada e com exemplos, os react hooks mais utilizados em programação.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;O React hook &lt;code&gt;useMemo&lt;/code&gt; é útil para otimizar o desempenho de um componente armazenando o resultado de funções intensivas em recursos de maneira a evitar o recálculo desnecessário em atualizações futuras do componente.&lt;/p&gt;

&lt;p&gt;Por exemplo, se você tiver uma função que percorre toda uma grande lista de itens e filtra essa lista com base em alguns critérios, essa função pode ser considerada um cálculo intensivo, pois ela pode levar um tempo considerável para ser executada, dependendo do tamanho da lista.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;useMemo&lt;/code&gt; permite que você armazene o resultado de uma expressão e evite que ela seja recalculada se os valores nessa expressão não mudarem.&lt;/p&gt;

&lt;p&gt;A sintaxe do &lt;code&gt;useMemo&lt;/code&gt; é a seguinte:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fztk32b3knwqfq6ysm4if.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fztk32b3knwqfq6ysm4if.png" alt="Image description" width="800" height="138"&gt;&lt;/a&gt;&lt;br&gt;
Nessa estrutura, &lt;code&gt;valorMemorizado&lt;/code&gt; é o valor retornado pelo &lt;code&gt;useMemo&lt;/code&gt;, que é o resultado da expressão passada como primeiro argumento (&lt;code&gt;expressãoACalcular&lt;/code&gt;). &lt;/p&gt;

&lt;p&gt;O segundo argumento é um array de dependências (&lt;code&gt;[dependência1, dependência2]&lt;/code&gt;) que indica quais valores são utilizados pela expressão para ser calculada. Se algum desses valores mudar, o &lt;code&gt;useMemo&lt;/code&gt; chamará a expressão novamente e armazenará o novo resultado. Se nenhum desses valores mudar, o &lt;code&gt;useMemo&lt;/code&gt; retornará o valor armazenado anteriormente, evitando assim o cálculo desnecessário.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Quando deve-se utilizá-lo?
&lt;/h1&gt;

&lt;p&gt;Antes de tudo, é importante lembrar que o código não deve depender de &lt;code&gt;useMemo&lt;/code&gt;. Em outras palavras, você deve ser capaz de substituir chamadas a &lt;code&gt;useMemo&lt;/code&gt; por chamadas de função diretas e não alterar o comportamento da aplicação, exceto o desempenho. A forma mais fácil de fazer isso é escrever o código sem &lt;code&gt;useMemo&lt;/code&gt; primeiro e adicioná-lo conforme necessário.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  UseMemo() na Prática
&lt;/h1&gt;

&lt;p&gt;No nosso primeiro exemplo, usamos o hook &lt;code&gt;useMemo()&lt;/code&gt; para otimizar o desempenho da aplicação (to do list):&lt;br&gt;
&lt;em&gt;&lt;code&gt;(Acompanhe em "Show files&amp;gt;src&amp;gt;App.jsx")&lt;/code&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@MarceloPetry/useMemo-Filter-List?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;Aqui, o &lt;code&gt;useMemo&lt;/code&gt; permite que você faça uma memorização de um valor computado e apenas recalcule esse valor se alguma das suas dependências mudar.&lt;/p&gt;

&lt;p&gt;No código específico desse to do list, o &lt;code&gt;useMemo&lt;/code&gt; está sendo usado para criar uma lista filtrada de tarefas (&lt;code&gt;filteredTasks&lt;/code&gt;) a partir da lista de tarefas (&lt;code&gt;tasks&lt;/code&gt;). A lista filtrada é criada usando um filtro (&lt;code&gt;showCompleted&lt;/code&gt;) que determina se as tarefas concluídas devem ser incluídas na lista ou não.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;useMemo&lt;/code&gt; é chamado com uma função de callback e um array de dependências. A função de callback é executada somente se alguma das dependências mudar. Nesse caso, as dependências são &lt;code&gt;showCompleted&lt;/code&gt; e &lt;code&gt;tasks&lt;/code&gt;. Isso significa que a lista filtrada só será recalculada se o filtro ou a lista de tarefas mudar, o que pode otimizar o desempenho da aplicação, especialmente em casos em que a criação da lista filtrada é um processo custoso em termos de tempo ou recursos. Isso é especialmente importante em aplicações que precisam lidar com grandes quantidades de dados ou que são usadas em dispositivos com menor poder de processamento.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Hook useMemo em consulta de API
&lt;/h2&gt;

&lt;p&gt;Outro exemplo comum de uso do &lt;code&gt;useMemo&lt;/code&gt; é em conjunto com o &lt;code&gt;useEffect&lt;/code&gt; para evitar que uma função seja recriada a cada renderização. Digamos que você tenha um componente que faz uma chamada ajax para buscar dados de uma API e exibe os dados em uma tabela. Você pode usar o &lt;code&gt;useMemo&lt;/code&gt; para armazenar a função de busca em cache e evitar que ela seja recriada toda vez que o componente é renderizado. Acompanhe: &lt;br&gt;
&lt;em&gt;&lt;code&gt;(Acompanhe em "Show files&amp;gt;src&amp;gt;App.jsx")&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;


&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@MarceloPetry/Movies-Data-Table-with-useMemo?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;O código acima representa um componente do React que permite ao usuário pesquisar por filmes e exibir os resultados da pesquisa em uma tabela.&lt;/p&gt;

&lt;p&gt;Neste exemplo, o hook &lt;code&gt;useMemo&lt;/code&gt; é utilizado para otimizar a performance da aplicação.&lt;/p&gt;

&lt;p&gt;1 - Primeiro, o código importa o arquivo &lt;code&gt;App.css&lt;/code&gt; e os Hooks &lt;code&gt;useState&lt;/code&gt;, &lt;code&gt;useMemo&lt;/code&gt; e &lt;code&gt;useEffect&lt;/code&gt; do React;&lt;/p&gt;

&lt;p&gt;2 - Em seguida, o código define a função &lt;code&gt;App&lt;/code&gt;, que é um componente do React;&lt;/p&gt;

&lt;p&gt;3 - Dentro da função &lt;code&gt;App&lt;/code&gt;, o código usa o &lt;code&gt;useState&lt;/code&gt; três vezes para inicializar três estados: &lt;code&gt;searchTerm&lt;/code&gt;, &lt;code&gt;movies&lt;/code&gt; e &lt;code&gt;trendingMovies&lt;/code&gt;;&lt;/p&gt;

&lt;p&gt;4 - O código então define a função &lt;code&gt;fetchMovies&lt;/code&gt; para buscar filmes da API do The Movie Database (TMDb) usando o termo de pesquisa atual. A função &lt;code&gt;fetchTrendingMovies&lt;/code&gt; é definida de maneira semelhante, mas busca os filmes mais populares da semana;&lt;/p&gt;

&lt;p&gt;5 - O código usa o &lt;code&gt;useEffect&lt;/code&gt; para garantir que a função &lt;code&gt;fetchMovies&lt;/code&gt; ou &lt;code&gt;fetchTrendingMovies&lt;/code&gt; seja chamada quando o termo de pesquisa ou o componente for atualizado. Se o termo de pesquisa estiver vazio, a função &lt;code&gt;fetchTrendingMovies&lt;/code&gt; é chamada, caso contrário, a função &lt;code&gt;fetchMovies&lt;/code&gt; é chamada;&lt;/p&gt;

&lt;p&gt;6 - O código usa o &lt;code&gt;useMemo&lt;/code&gt; para filtrar o array de filmes baseado no termo de pesquisa atual. Isso é feito para evitar que o array seja filtrado toda vez que o componente é renderizado. A função &lt;code&gt;fetchData&lt;/code&gt; é criada apenas uma vez e armazenada na memória pelo &lt;code&gt;useMemo&lt;/code&gt;. Isso significa que, ao invés de criar uma nova função toda vez que o componente é renderizado, a mesma função é reutilizada, o que pode melhorar significativamente o desempenho da aplicação em casos em que a função é chamada com frequência;&lt;/p&gt;

&lt;p&gt;7 - Por fim, o código retorna um elemento JSX que renderiza uma tabela de filmes. Se o termo de pesquisa estiver vazio, a tabela exibe os filmes mais populares da semana. Caso contrário, a tabela exibe os filmes filtrados pelo termo de pesquisa.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  UseMemo em formulário de Login
&lt;/h2&gt;

&lt;p&gt;O React hook &lt;code&gt;useMemo&lt;/code&gt; pode ser útil em um componente de formulário de login, no qual seja preciso melhoras de performance. Veja o exemplo:&lt;br&gt;
&lt;em&gt;&lt;code&gt;(Acompanhe em "Show files&amp;gt;src&amp;gt;App.jsx")&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;


&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@MarceloPetry/Login-Form-with-useMemo?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;O código acima é um formulário de login que permite que o usuário insira um nome de usuário e senha e, em seguida, envie os dados para a função &lt;code&gt;onSubmit&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O formulário usa os hooks &lt;code&gt;useState&lt;/code&gt; do React para gerenciar o estado dos campos de entrada de nome de usuário e senha e de uma mensagem de erro que pode ser exibida.&lt;/p&gt;

&lt;p&gt;O hook &lt;code&gt;useMemo&lt;/code&gt; é usado para criar uma memória cache da variável &lt;code&gt;isFormValid&lt;/code&gt;. Essa variável é um booleano que indica se os campos de nome de usuário e senha estão preenchidos.&lt;/p&gt;

&lt;p&gt;A função de callback passada para o &lt;code&gt;useMemo&lt;/code&gt; retorna &lt;code&gt;true&lt;/code&gt; se o tamanho de &lt;code&gt;username&lt;/code&gt; for maior que zero e o tamanho de &lt;code&gt;password&lt;/code&gt; for maior que zero. Caso contrário, ela retorna &lt;code&gt;false&lt;/code&gt;. O &lt;code&gt;useMemo&lt;/code&gt; aceita um segundo argumento, que é uma lista de dependências.&lt;/p&gt;

&lt;p&gt;Isso significa que a função de callback só será chamada novamente se algum dos valores dessa lista mudar. No caso do código acima, a função de callback só será chamada novamente se o valor de &lt;code&gt;username&lt;/code&gt; ou &lt;code&gt;password&lt;/code&gt; mudar.&lt;/p&gt;

&lt;p&gt;Isso é útil porque a função de callback pode ser intensiva em termos de processamento e não precisamos recalculá-la toda vez que o componente é renderizado. Ao invés disso, podemos usar a memória cache fornecida pelo &lt;code&gt;useMemo&lt;/code&gt; para evitar recálculos desnecessários e melhorar a performance do componente.&lt;/p&gt;

&lt;p&gt;A função &lt;code&gt;handleSubmit&lt;/code&gt; é chamada quando o formulário é enviado e impede o envio padrão do formulário. Se o formulário for válido (ou seja, se os campos de nome de usuário e senha estiverem preenchidos), a função &lt;code&gt;onSubmit&lt;/code&gt; é chamada com os valores de &lt;code&gt;username&lt;/code&gt; e &lt;code&gt;password&lt;/code&gt;. Caso contrário, uma mensagem de erro é exibida.&lt;/p&gt;

&lt;p&gt;O código também renderiza dois botões: um para enviar o formulário e outro para entrar com o Google. O primeiro botão é desabilitado se o formulário não for válido. O segundo botão inclui um ícone de login do Google.&lt;/p&gt;




&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;p&gt;O hook &lt;code&gt;useMemo&lt;/code&gt; do React permite que você crie uma memória cache de valores computados em um componente. Isso pode ser útil para evitar recalculos desnecessários e melhorar a performance do seu projeto React.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;useMemo&lt;/code&gt; é recomendado para uso em casos em que a computação de um valor pode ser intensiva em termos de processamento e não precisa ser recalculada toda vez que o componente é renderizado. Em vez disso, o valor pode ser armazenado em cache e somente recalculado quando alguma de suas dependências mudar.&lt;/p&gt;

&lt;p&gt;No geral, o uso do &lt;code&gt;useMemo&lt;/code&gt; pode ajudar a otimizar a performance de uma aplicação React, especialmente em componentes que são renderizados frequentemente ou que realizam cálculos complexos. &lt;/p&gt;

&lt;p&gt;No entanto, é importante lembrar de usá-lo com moderação, pois criar muitas memórias cache pode resultar em um aumento no uso de memória e pode comprometer a performance em vez de melhorá-la.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://marcelopetry.com" rel="noopener noreferrer"&gt;marcelopetry.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>emptystring</category>
    </item>
    <item>
      <title>JS map(), filter() e reduce() em React</title>
      <dc:creator>Marcelo Petry</dc:creator>
      <pubDate>Wed, 04 Jan 2023 00:59:13 +0000</pubDate>
      <link>https://dev.to/mpetry/js-map-filter-e-reduce-em-react-2o5c</link>
      <guid>https://dev.to/mpetry/js-map-filter-e-reduce-em-react-2o5c</guid>
      <description>&lt;p&gt;&lt;strong&gt;Map&lt;/strong&gt;, &lt;strong&gt;Filter&lt;/strong&gt; e &lt;strong&gt;Reduce&lt;/strong&gt; são funções de alta ordem que são amplamente utilizadas em aplicações JavaScript, incluindo aplicações React.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Map&lt;/strong&gt; é usado para iterar sobre um array e transformar cada elemento do array em alguma outra coisa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filter&lt;/strong&gt; é usado para iterar sobre um array e remover elementos que não atendem a um determinado critério.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reduce&lt;/strong&gt; é usado para iterar sobre um array e reduzi-lo a um único valor, com base em uma função de acumulação fornecida.&lt;/p&gt;

&lt;p&gt;Essas funções são muito úteis quando se deseja realizar transformações ou operações em conjuntos de dados, pois permitem fazer isso de maneira concisa e legível. Elas também são muito populares no React devido ao seu uso em conjunto com o paradigma de programação funcional, que é amplamente utilizado no React.&lt;/p&gt;

&lt;p&gt;No React, essas funções são usadas principalmente para se trabalhar com componentes baseados em dados, já que é comum precisar exibir ou manipular dados provenientes de fontes externas em aplicações web.&lt;/p&gt;




&lt;h1&gt;
  
  
  Map()
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Map&lt;/strong&gt; é uma função de &lt;strong&gt;alta ordem&lt;/strong&gt; que itera sobre um array e aplica uma função de transformação a cada elemento do array. Ela retorna um novo array com os elementos transformados.&lt;/p&gt;

&lt;p&gt;A sintaxe da função &lt;code&gt;map&lt;/code&gt; é a seguinte:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fip6pznle3d4o82zd9odo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fip6pznle3d4o82zd9odo.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No React, a função &lt;code&gt;map&lt;/code&gt; é muito utilizada para renderizar elementos de lista. Por exemplo, digamos que você tenha um array com uma lista de nomes e deseja exibi-los em um componente de lista. Você pode usar a função &lt;code&gt;map&lt;/code&gt; para iterar sobre esse array e retornar um array de elementos &lt;code&gt;JSX&lt;/code&gt; para cada nome:&lt;br&gt;
&lt;em&gt;&lt;code&gt;(Acompanhe em "Show files&amp;gt;src&amp;gt;App.jsx")&lt;/code&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@MarceloPetry/map-Names-List-React?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;Neste exemplo, a função &lt;code&gt;map&lt;/code&gt; itera sobre o array de posts e retorna um elemento &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; para cada nome. Cada elemento é preenchido com o nome e é dado uma &lt;code&gt;key&lt;/code&gt; única com base no próprio nome.&lt;/p&gt;

&lt;p&gt;Outra forma muito empregada de &lt;code&gt;map&lt;/code&gt; em React é na iteração sobre um &lt;strong&gt;array de objetos&lt;/strong&gt;. No exemplo abaixo, a função &lt;code&gt;map&lt;/code&gt; é usada em um componente React para renderizar uma lista de produtos com seus nomes e preços:&lt;br&gt;
&lt;em&gt;&lt;code&gt;(Acompanhe em "Show files&amp;gt;src&amp;gt;App.jsx")&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;


&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@MarceloPetry/map-Products?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;1 - A função &lt;code&gt;App&lt;/code&gt; é um componente React que renderiza uma lista de produtos;&lt;/p&gt;

&lt;p&gt;2 - Dentro da função &lt;code&gt;App&lt;/code&gt;, uma constante chamada &lt;code&gt;products&lt;/code&gt; é declarada com um array de objetos, cada um representando um produto com um ID, nome, preço e emoji;&lt;/p&gt;

&lt;p&gt;3 - A função &lt;code&gt;App&lt;/code&gt; retorna um elemento &lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt; que contém uma lista de elementos &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;;&lt;/p&gt;

&lt;p&gt;4 - A função &lt;code&gt;map()&lt;/code&gt; é usada para percorrer cada item no array &lt;code&gt;products&lt;/code&gt; e retornar um elemento &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; para cada um; O argumento da função &lt;code&gt;map()&lt;/code&gt; é uma função anônima que recebe um parâmetro &lt;code&gt;product&lt;/code&gt; e retorna o elemento &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; para esse produto;&lt;/p&gt;

&lt;p&gt;5 - O elemento &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; retornado pelo &lt;code&gt;map()&lt;/code&gt; inclui um elemento &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; com a classe "card" que contém informações sobre o produto, incluindo o emoji, o nome e o preço;&lt;/p&gt;

&lt;p&gt;6 - O atributo &lt;code&gt;key&lt;/code&gt; é usado para identificar de forma única cada elemento &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; e é importante para otimizar o desempenho do React;&lt;/p&gt;

&lt;p&gt;7 - O atributo &lt;code&gt;style&lt;/code&gt; é usado para remover o marcador padrão dos elementos &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; e substituí-lo por um estilo &lt;code&gt;list-style-type: none&lt;/code&gt;;&lt;/p&gt;

&lt;p&gt;8 - A função &lt;code&gt;App&lt;/code&gt; é exportada para ser usada em outro arquivo.&lt;/p&gt;

&lt;p&gt;É importante notar que cada elemento gerado pelo map deve ter uma propriedade &lt;code&gt;key&lt;/code&gt; única, pois isso é necessário para o React realizar &lt;strong&gt;otimizações de performance&lt;/strong&gt; em sua renderização.&lt;/p&gt;




&lt;h1&gt;
  
  
  Filter()
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;Filter()&lt;/code&gt; é uma função de array que permite filtrar elementos de um array baseado em um determinado critério. No contexto do React, você pode usar a função &lt;code&gt;filter()&lt;/code&gt; para filtrar elementos de um array de dados antes de renderizá-los em uma lista.&lt;/p&gt;

&lt;p&gt;A sintaxe da função &lt;code&gt;filter()&lt;/code&gt; é a seguinte:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwkynj48nagqt5f2zlqlv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwkynj48nagqt5f2zlqlv.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O primeiro argumento da função &lt;code&gt;filter()&lt;/code&gt; é uma função de callback que é chamada para cada elemento do array. Essa função de callback deve retornar &lt;code&gt;true&lt;/code&gt; se o elemento atual deve ser incluído no novo array ou &lt;code&gt;false&lt;/code&gt; se o elemento atual deve ser ignorado.&lt;/p&gt;

&lt;p&gt;O segundo argumento opcional da função &lt;code&gt;filter()&lt;/code&gt; é o valor de &lt;code&gt;this&lt;/code&gt; a ser usado dentro da função de callback.&lt;/p&gt;

&lt;p&gt;Veja na prática com um simples exemplo abaixo, no qual utilizamos a função &lt;code&gt;filter()&lt;/code&gt; para retornar somente as pessoas maiores de idade em uma lista:&lt;br&gt;
&lt;em&gt;&lt;code&gt;(Acompanhe em "Show files&amp;gt;src&amp;gt;App.jsx")&lt;/code&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@MarceloPetry/filter-Age?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;O código mostra uma lista de pessoas, com seus respectivos nomes e idades. A função &lt;code&gt;filter()&lt;/code&gt; é utilizada para selecionar apenas as pessoas que são maiores de 18 anos. Isso é feito através da verificação da idade de cada pessoa, e aquelas que possuem idade maior ou igual a 18 são adicionadas em um novo array, que é chamado de "maiores".&lt;/p&gt;

&lt;p&gt;Em seguida, a função &lt;code&gt;map()&lt;/code&gt; é usada para renderizar cada pessoa selecionada pelo &lt;code&gt;filter()&lt;/code&gt;. Cada pessoa é mostrada em um elemento &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; dentro de uma lista &lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;, e cada &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; possui um elemento &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; com a classe &lt;code&gt;card&lt;/code&gt;. Dentro do &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;, há um título com o nome da pessoa e um parágrafo com sua idade.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
Abaixo, usamos o mesmo exemplo da lista de produtos em &lt;code&gt;map()&lt;/code&gt;, porém, para filtrar somente os produtos com preço maior ou igual ao definido pelo usuário com no &lt;code&gt;input&lt;/code&gt;:&lt;br&gt;
&lt;em&gt;&lt;code&gt;(Acompanhe em "Show files&amp;gt;src&amp;gt;App.jsx")&lt;/code&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@MarceloPetry/Filter-with-Products?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;1 - O componente &lt;code&gt;App&lt;/code&gt; importa o módulo &lt;code&gt;useState&lt;/code&gt; do React, que permite gerenciar o estado de um componente;&lt;/p&gt;

&lt;p&gt;2 - A constante &lt;code&gt;valor&lt;/code&gt; e a função &lt;code&gt;setValor&lt;/code&gt; são criadas pelo useState, que inicialmente possui o valor "";&lt;/p&gt;

&lt;p&gt;3 - A constante &lt;code&gt;products&lt;/code&gt; é criada com um array de objetos que representam produtos. Cada produto possui um id, nome, preço e emoji;&lt;/p&gt;

&lt;p&gt;4 - A constante &lt;code&gt;expensiveProducts&lt;/code&gt; é criada pelo método filter(), que recebe como parâmetro uma função anônima que possui um argumento &lt;code&gt;product&lt;/code&gt;. Esse argumento representa cada produto do array &lt;code&gt;products&lt;/code&gt; e a função verifica se o preço desse produto é maior ou igual ao valor atual de &lt;code&gt;valor&lt;/code&gt;. Os produtos que passam nessa verificação são adicionados em &lt;code&gt;expensiveProducts&lt;/code&gt;;&lt;/p&gt;

&lt;p&gt;5 - O componente App possui um input que é vinculado ao estado &lt;code&gt;valor&lt;/code&gt; através do atributo &lt;code&gt;value&lt;/code&gt; e da função &lt;code&gt;onChange&lt;/code&gt;. Quando o usuário digita algo no input, o estado &lt;code&gt;valor&lt;/code&gt; é atualizado com o novo valor digitado;&lt;/p&gt;

&lt;p&gt;6 - A lista &lt;code&gt;ul&lt;/code&gt; é renderizada com a função &lt;code&gt;map()&lt;/code&gt;, que recebe como parâmetro uma função anônima que possui um argumento &lt;code&gt;product&lt;/code&gt;. Esse argumento representa cada produto de &lt;code&gt;expensiveProducts&lt;/code&gt; e a função retorna um elemento &lt;code&gt;li&lt;/code&gt; com uma div &lt;code&gt;card&lt;/code&gt; que possui o emoji, nome e preço do produto;&lt;/p&gt;

&lt;p&gt;7 - O componente &lt;code&gt;App&lt;/code&gt; é exportado para ser utilizado em outro lugar da aplicação.&lt;/p&gt;




&lt;h1&gt;
  
  
  Reduce()
&lt;/h1&gt;

&lt;p&gt;O método &lt;code&gt;reduce()&lt;/code&gt; é uma função de alta ordem que recebe um &lt;strong&gt;acumulador&lt;/strong&gt; e um &lt;strong&gt;valor atual&lt;/strong&gt; como argumentos e &lt;strong&gt;retorna um único valor&lt;/strong&gt;. É aplicado ao React para agregar todos os elementos de um array em um único elemento.&lt;/p&gt;

&lt;p&gt;Aqui está a sintaxe básica da função &lt;code&gt;reduce&lt;/code&gt;:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmso622yq0deyrknuvfam.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmso622yq0deyrknuvfam.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
O valor inicial é opcional e é o valor inicial do acumulador. Se não for fornecido, o primeiro elemento do array será usado como valor inicial.&lt;/p&gt;

&lt;p&gt;Para entender melhor o funcionamento dessa função, veja o exemplo abaixo:&lt;br&gt;
&lt;em&gt;&lt;code&gt;(Acompanhe em "Show files&amp;gt;src&amp;gt;App.jsx")&lt;/code&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@MarceloPetry/reduce-accumulator?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;No código acima, a função &lt;code&gt;App()&lt;/code&gt; é um componente React que retorna um elemento &lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt; que contém dois elementos &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;. O primeiro elemento &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; exibe uma string estática e o segundo elemento &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; exibe o resultado da soma dos elementos de um array de números inteiros.&lt;/p&gt;

&lt;p&gt;O array de números é declarado como uma constante chamada &lt;code&gt;numbers&lt;/code&gt; e é inicializada com os valores 1, 2, 3, 4 e 5. A soma dos elementos do array é calculada usando a função &lt;code&gt;reduce()&lt;/code&gt; e armazenada na constante &lt;code&gt;sum&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A função &lt;code&gt;reduce()&lt;/code&gt; é chamada no array &lt;code&gt;numbers&lt;/code&gt; e recebe como argumento uma função de acumulação que soma o acumulador atual (&lt;code&gt;accumulator&lt;/code&gt;) com o valor atual da iteração (&lt;code&gt;currentValue&lt;/code&gt;). O valor inicial do acumulador é 0.&lt;/p&gt;

&lt;p&gt;A função &lt;code&gt;reduce()&lt;/code&gt; itera sobre todos os elementos do array &lt;code&gt;numbers&lt;/code&gt; e retorna o valor total, que é armazenado na constante &lt;code&gt;sum&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Por fim, o componente &lt;code&gt;App&lt;/code&gt; é exportado para ser usado em outros locais do projeto. Quando o componente é renderizado, os elementos &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; são exibidos na tela, exibindo a string estática e o resultado da soma dos elementos do array.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
Vamos avançar um pouco mais?&lt;br&gt;
No próximo exemplo, utilizamos a função &lt;code&gt;reduce()&lt;/code&gt; com React hooks para calcular o preço total dos itens em um carrinho de compras:&lt;br&gt;
&lt;em&gt;&lt;code&gt;(Acompanhe em "Show files&amp;gt;src&amp;gt;App.jsx")&lt;/code&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@MarceloPetry/Reduce-ex2?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;O código acima é uma implementação de um carrinho de compras em React.&lt;br&gt;
Ele permite que o usuário adicione ou remova itens do carrinho e exibe o valor total do carrinho.&lt;br&gt;
Ele começa importando alguns módulos e criando uma função &lt;code&gt;App&lt;/code&gt;, que é o componente principal. Dentro da função &lt;code&gt;App&lt;/code&gt;, são declaradas duas variáveis de estado: &lt;code&gt;cart&lt;/code&gt; e &lt;code&gt;total&lt;/code&gt;. &lt;code&gt;cart&lt;/code&gt; é um array de objetos que representam itens adicionados ao carrinho de compras e &lt;code&gt;total&lt;/code&gt; é um número que representa o valor total do carrinho.&lt;br&gt;
O hook &lt;code&gt;useEffect&lt;/code&gt; é então usado para definir um efeito que será executado sempre que o valor de &lt;code&gt;cart&lt;/code&gt; for atualizado. O efeito consiste em chamar a função &lt;code&gt;reduce()&lt;/code&gt; em &lt;code&gt;cart&lt;/code&gt; para calcular o valor total do carrinho. O valor total é então atualizado usando a função &lt;code&gt;setTotal&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O código percorre cada item do carrinho (representado por &lt;code&gt;currentValue&lt;/code&gt;) e acumula o valor total (representado por &lt;code&gt;accumulator&lt;/code&gt;) usando a fórmula &lt;code&gt;accumulator + currentValue.price * currentValue.quantity&lt;/code&gt;. Isso significa que o valor total é a soma dos preços dos itens multiplicados pela quantidade de cada item.&lt;br&gt;
A função &lt;code&gt;reduce()&lt;/code&gt; é chamada com dois argumentos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Uma função reducer que especifica como o valor acumulado deve ser atualizado com o valor atual;&lt;/li&gt;
&lt;li&gt;Um valor inicial para o acumulador. No código acima, o valor inicial é 0.
Quando a função &lt;code&gt;reduce()&lt;/code&gt; é chamada, ela retorna o valor final acumulado após todos os elementos do array terem sido processados. Esse valor é então atribuído à variável &lt;code&gt;newTotal&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O componente também define duas funções: &lt;code&gt;handleAddToCart&lt;/code&gt; e &lt;code&gt;handleRemoveFromCart&lt;/code&gt;. A função &lt;code&gt;handleAddToCart&lt;/code&gt; é chamada quando o usuário clica em um dos botões "Adicionar" e adiciona o item correspondente ao carrinho de compras. Se o item já existir no carrinho, sua quantidade é atualizada. Caso contrário, um novo item é adicionado ao carrinho. A função &lt;code&gt;handleRemoveFromCart&lt;/code&gt; é chamada quando o usuário clica no botão "Remover" e remove o item correspondente do carrinho.&lt;br&gt;
Por fim, o componente renderiza uma lista de itens no carrinho, exibindo cada item com seu nome, preço e quantidade. Também é exibido o valor total do carrinho e os botões "Adicionar" para cada tipo de item.&lt;/p&gt;

&lt;p&gt;Obrigado se você acompanhou até aqui! Espero que isso tenha ajudado a esclarecer a função reduce e o seu uso.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://marcelopetry.com" rel="noopener noreferrer"&gt;marcelopetry.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>⚛Os 10 React Hooks Mais Úteis: 06 - useCallback⚛</title>
      <dc:creator>Marcelo Petry</dc:creator>
      <pubDate>Sun, 01 Jan 2023 23:04:59 +0000</pubDate>
      <link>https://dev.to/mpetry/os-10-react-hooks-mais-uteis-06-usecallback-4di</link>
      <guid>https://dev.to/mpetry/os-10-react-hooks-mais-uteis-06-usecallback-4di</guid>
      <description>&lt;p&gt;&lt;em&gt;Este é o sexto artigo de uma série de 10, que explica de forma simplificada e com exemplos, os react hooks mais utilizados em programação.&lt;/em&gt;&lt;br&gt;
&lt;br&gt;&lt;br&gt;
O &lt;code&gt;useCallback&lt;/code&gt; é um hook do React que retorna uma função memorizada. Isso significa que a função &lt;strong&gt;só é recriada quando uma de suas dependências mudar.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Caso contrário, a mesma instância de função é retornada em todas as chamadas.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;useCallback&lt;/code&gt; é útil quando você tem um componente que precisa passar uma função para um componente filho ou para uma função de gancho, mas quer evitar que a função seja recriada toda vez que o componente pai é renderizado. Isso pode ajudar a &lt;strong&gt;evitar o ciclo de atualização de componentes indesejado&lt;/strong&gt; e &lt;strong&gt;aumentar a performance de sua aplicação&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Como usar o useCallback
&lt;/h2&gt;

&lt;p&gt;Aqui está um exemplo da funcionalidade do &lt;code&gt;useCallback&lt;/code&gt;:&lt;br&gt;
&lt;em&gt;&lt;code&gt;(Acompanhe em "Show files&amp;gt;src&amp;gt;App.jsx")&lt;/code&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@MarceloPetry/Contador-useCallback?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;O código acima é de uma função chamada &lt;code&gt;App&lt;/code&gt; que usa o hook &lt;code&gt;useState&lt;/code&gt; para gerenciar o estado de uma variável chamada &lt;code&gt;count&lt;/code&gt;. Ele também cria duas funções memorizadas usando o hook &lt;code&gt;useCallback: increment&lt;/code&gt; e &lt;code&gt;reset&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;A função &lt;code&gt;increment&lt;/code&gt; é criada usando o &lt;code&gt;useCallback&lt;/code&gt; com uma lista de dependências contendo apenas a variável &lt;code&gt;count&lt;/code&gt;. Isso significa que a função só será recriada quando o valor de &lt;code&gt;count&lt;/code&gt; mudar. A função &lt;code&gt;increment&lt;/code&gt; é usada como um manipulador de cliques para um botão e, quando clicada, incrementa o valor de &lt;code&gt;count&lt;/code&gt; em 1. &lt;/p&gt;

&lt;p&gt;A função &lt;code&gt;reset&lt;/code&gt; é criada de maneira semelhante, usando o &lt;code&gt;useCallback&lt;/code&gt; com uma lista de dependências contendo apenas a variável &lt;code&gt;count&lt;/code&gt;. Isso significa que a função só será recriada quando o valor de &lt;code&gt;count&lt;/code&gt; mudar. A função &lt;code&gt;reset&lt;/code&gt; é usada como um manipulador de cliques para outro botão e, quando clicada, define o valor de &lt;code&gt;count&lt;/code&gt; como 0. &lt;/p&gt;

&lt;p&gt;O objetivo do &lt;code&gt;useCallback&lt;/code&gt; é garantir que as funções &lt;code&gt;increment&lt;/code&gt; e &lt;code&gt;reset&lt;/code&gt; sejam criadas &lt;strong&gt;apenas quando necessário&lt;/strong&gt;, evitando que elas sejam recriadas toda vez que o componente é renderizado. Isso pode ajudar a &lt;strong&gt;evitar o ciclo de atualização de componentes indesejado&lt;/strong&gt; e &lt;strong&gt;aumentar a performance de sua aplicação&lt;/strong&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Filtro de lista com useCallback em React
&lt;/h3&gt;

&lt;p&gt;Um uso comum do &lt;code&gt;useCallback&lt;/code&gt; é no caso em que você tem uma lista e pretende realizar uma busca instantânea nos items dessa lista.&lt;/p&gt;

&lt;p&gt;O exemplo abaixo demonstra como implementar um filtro de lista de Pokémons através desse hook:&lt;br&gt;
&lt;em&gt;&lt;code&gt;(Acompanhe em "Show files&amp;gt;src&amp;gt;App.jsx")&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;


&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@MarceloPetry/Filter-with-useCallback?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;1 - A primeira chamada a &lt;code&gt;useState&lt;/code&gt; inicializa a variável de estado &lt;code&gt;users&lt;/code&gt; com uma lista de objetos de Pokémon e retorna essa lista e a função &lt;code&gt;setUsers&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;2 - &lt;code&gt;useState&lt;/code&gt; é chamado novamente para inicializar a variável de estado &lt;code&gt;filter&lt;/code&gt; com uma string vazia e retornar essa string e a função &lt;code&gt;setFilter&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;3 - A função &lt;code&gt;handleFilterChange&lt;/code&gt; é criada usando &lt;code&gt;useCallback&lt;/code&gt; e só será recriada se o valor de &lt;code&gt;filter&lt;/code&gt; mudar. A função &lt;code&gt;handleFilterChange&lt;/code&gt; é chamada como um manipulador de evento &lt;code&gt;onChange&lt;/code&gt; de entrada e atualiza o valor de &lt;code&gt;filter&lt;/code&gt; com o valor da entrada.&lt;/p&gt;

&lt;p&gt;4 - &lt;code&gt;useCallback&lt;/code&gt; é chamado novamente para criar a função &lt;code&gt;filteredUsers&lt;/code&gt;, que filtra a lista de pokémons (users) com base no valor de &lt;code&gt;filter&lt;/code&gt;. A função &lt;code&gt;filteredUsers&lt;/code&gt; só será recriada se o valor de &lt;code&gt;users&lt;/code&gt; ou &lt;code&gt;filter&lt;/code&gt; mudar. &lt;/p&gt;

&lt;p&gt;5 - O componente &lt;code&gt;App&lt;/code&gt; renderiza uma entrada de pesquisa, um botão de reset de filtro e o componente filho &lt;code&gt;ChildComponent&lt;/code&gt;. O valor atual de &lt;code&gt;filter&lt;/code&gt; é passado como o valor da entrada de pesquisa e a função &lt;code&gt;handleFilterChange&lt;/code&gt; é passada como o manipulador de evento &lt;code&gt;onChange&lt;/code&gt;. O componente filho é passado a função &lt;code&gt;filteredUsers&lt;/code&gt; como uma propriedade, que é usada para renderizar uma lista de cards de Pokémon filtrados. &lt;/p&gt;

&lt;p&gt;6 - O componente filho &lt;code&gt;ChildComponent&lt;/code&gt; renderiza uma lista de cards de Pokémon usando a propriedade &lt;code&gt;users&lt;/code&gt;, que é uma função de callback passada pelo componente pai. Cada card é composto por uma foto do Pokemon correspondente e seu nome. A foto é exibida através de uma tag &lt;code&gt;img&lt;/code&gt; e a URL da imagem é obtida da propriedade &lt;code&gt;image&lt;/code&gt; do objeto Pokémon. O nome do Pokémon é exibido através de uma tag &lt;code&gt;p&lt;/code&gt;. Cada card é exibido em uma lista através de uma tag &lt;code&gt;li&lt;/code&gt;. Quando o usuário digita algum valor no input de busca, a função &lt;code&gt;handleFilterChange&lt;/code&gt; é chamada para atualizar o valor do filtro. A função &lt;code&gt;filteredUsers&lt;/code&gt;, que é criada com o &lt;code&gt;useCallback&lt;/code&gt;, é usada para filtrar a lista de Pokémons com base no valor atual do filtro.&lt;/p&gt;

&lt;p&gt;7 - A lista de Pokémons filtrados é passada como propriedade para o componente filho &lt;code&gt;ChildComponent&lt;/code&gt; e é exibida através de uma lista. Ao clicar no botão "Reset filter", o filtro é resetado para vazio, exibindo novamente todos os Pokémons.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Hook useCallback para evitar a recriação de funções em componentes React
&lt;/h2&gt;

&lt;p&gt;O hook &lt;code&gt;useCallback&lt;/code&gt; do React permite que uma função seja retornada de forma &lt;strong&gt;imutável&lt;/strong&gt;, &lt;strong&gt;evitando sua recriação&lt;/strong&gt; a cada renderização do componente pai. Isso pode ser útil em situações em que uma função é passada como propriedade para um componente filho e pode &lt;strong&gt;melhorar a performance da aplicação&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Abaixo, temos um exemplo de código que evita a recriação de funções, o qual continua no caso anterior (lista com pokémons):&lt;br&gt;
&lt;em&gt;&lt;code&gt;(Acompanhe em "Show files&amp;gt;src&amp;gt;App.jsx")&lt;/code&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@MarceloPetry/Detail-Expand-Pkmn-with-useCallback?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;1 - &lt;code&gt;import "./App.css"&lt;/code&gt; importa o arquivo de estilo &lt;code&gt;App.css&lt;/code&gt; para o componente &lt;code&gt;App&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;2 - &lt;code&gt;import { useState, useCallback } from "react"&lt;/code&gt; importa os hooks &lt;code&gt;useState&lt;/code&gt; e &lt;code&gt;useCallback&lt;/code&gt; do pacote &lt;code&gt;react&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;3 - &lt;code&gt;function App()&lt;/code&gt; define o componente &lt;code&gt;App&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;4 - &lt;code&gt;const [selectedType, setSelectedType] = useState(null)&lt;/code&gt; define o estado &lt;code&gt;selectedType&lt;/code&gt; como &lt;code&gt;null&lt;/code&gt; e uma função &lt;code&gt;setSelectedType&lt;/code&gt; para atualizar o estado. &lt;/p&gt;

&lt;p&gt;5 - &lt;code&gt;const [pokemons, setPokemons] = useState([{ id: 1, name: "Abra", type: "psychic" }, { id: 2, name: "Bellsprout", type: "grass" }, { id: 3, name: "Chansey", type: "normal" }])&lt;/code&gt; define o estado &lt;code&gt;pokemons&lt;/code&gt; como um array de objetos e uma função &lt;code&gt;setPokemons&lt;/code&gt; para atualizar o estado. &lt;/p&gt;

&lt;p&gt;6 - &lt;code&gt;const handleSelectType = useCallback((type) =&amp;gt; { setSelectedType(type) }, [selectedType])&lt;/code&gt; cria uma função de callback chamada &lt;code&gt;handleSelectType&lt;/code&gt; usando &lt;code&gt;useCallback&lt;/code&gt;. A função atualiza o estado &lt;code&gt;selectedType&lt;/code&gt; com o argumento &lt;code&gt;type&lt;/code&gt; passado para ela. O segundo argumento para &lt;code&gt;useCallback&lt;/code&gt; é um array de dependências, no caso apenas o valor de &lt;code&gt;selectedType&lt;/code&gt;. Isso significa que, se o valor de &lt;code&gt;selectedType&lt;/code&gt; não mudar, a mesma instância de &lt;code&gt;handleSelectType&lt;/code&gt; será retornada e pode ser reutilizada sem que o componente seja renderizado novamente. &lt;/p&gt;

&lt;p&gt;7 - &lt;code&gt;return (...)&lt;/code&gt; retorna JSX que renderiza uma lista de Pokemon e um componente &lt;code&gt;DetailsComponent&lt;/code&gt;, se &lt;code&gt;selectedType&lt;/code&gt; tiver um valor. &lt;/p&gt;

&lt;p&gt;8 - &lt;code&gt;function DetailsComponent({ selectedType })&lt;/code&gt; define o componente &lt;code&gt;DetailsComponent&lt;/code&gt; que recebe &lt;code&gt;selectedType&lt;/code&gt; como um prop. &lt;/p&gt;

&lt;p&gt;9 - &lt;code&gt;return &amp;lt;div className="type"&amp;gt; Pokemon do tipo: {selectedType}&lt;br&gt;
&lt;/code&gt; retorna JSX que renderiza o texto "Pokemon do tipo: [selectedType]". &lt;/p&gt;

&lt;p&gt;10 - &lt;code&gt;export default App&lt;/code&gt; exporta o componente &lt;code&gt;App&lt;/code&gt; para ser usado em outros arquivos.&lt;/p&gt;

&lt;p&gt;Em resumo, o &lt;code&gt;useCallback&lt;/code&gt; no código acima é usado para criar uma função de callback chamada &lt;code&gt;handleSelectType&lt;/code&gt; que é passada como um prop para um componente filho.&lt;/p&gt;

&lt;p&gt;Quando os argumentos passados para &lt;code&gt;useCallback&lt;/code&gt; (no caso, apenas o valor de &lt;code&gt;selectedType&lt;/code&gt;) não mudam, a mesma instância de &lt;code&gt;handleSelectType&lt;/code&gt; é retornada e pode ser reutilizada pelo componente filho sem que ele seja renderizado novamente. Isso pode ser útil para evitar que um componente filho seja renderizado desnecessariamente, pois a função de callback não mudou.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O hook &lt;code&gt;useCallback&lt;/code&gt; do React é uma ferramenta útil para &lt;strong&gt;evitar a recriação de funções a cada renderização&lt;/strong&gt; de um componente, o que garante uma &lt;strong&gt;melhor performance&lt;/strong&gt; à aplicação.&lt;/p&gt;

&lt;p&gt;Além disso, ao retornar uma função imutável, o &lt;code&gt;useCallback&lt;/code&gt; garante que a função passada como propriedade para um componente filho não mude a cada renderização do componente pai, o que pode ser apropriado em casos em que seja importante garantir a consistência do comportamento da função.&lt;/p&gt;

&lt;p&gt;Em suma, o hook &lt;code&gt;useCallback&lt;/code&gt; é uma ferramenta valiosa para &lt;strong&gt;garantir a eficiência e otimização&lt;/strong&gt; de aplicações React.&lt;/p&gt;

</description>
      <category>career</category>
      <category>writing</category>
      <category>contentwriting</category>
    </item>
    <item>
      <title>⚛ React Lifecycle 🔃</title>
      <dc:creator>Marcelo Petry</dc:creator>
      <pubDate>Fri, 30 Dec 2022 00:46:28 +0000</pubDate>
      <link>https://dev.to/mpetry/react-lifecycle-a87</link>
      <guid>https://dev.to/mpetry/react-lifecycle-a87</guid>
      <description>&lt;p&gt;O conhecimento sobre o ciclo de vida (ou &lt;em&gt;lifecycle&lt;/em&gt;) de um componente React é &lt;strong&gt;frequentemente solicitado em entrevistas&lt;/strong&gt; de emprego para desenvolvedores, pois é um conceito fundamental para entender como o React funciona e como otimizar o desempenho de um aplicativo.&lt;/p&gt;

&lt;p&gt;Os métodos do ciclo de vida permitem que você execute código em &lt;strong&gt;momentos específicos&lt;/strong&gt; durante o processo de renderização de um componente, como antes de ele ser &lt;strong&gt;montado&lt;/strong&gt;, &lt;strong&gt;atualizado&lt;/strong&gt; ou &lt;strong&gt;desmontado&lt;/strong&gt;. Isso é importante para garantir que o componente se comporte da forma esperada e para &lt;strong&gt;evitar atualizações desnecessárias&lt;/strong&gt;, o que pode ajudar a melhorar o desempenho do aplicativo.&lt;/p&gt;

&lt;p&gt;Além disso, os métodos do ciclo de vida também permitem que você interaja com outros sistemas, como o DOM ou APIs externas, de forma mais eficiente, pois você pode controlar quando essas interações acontecem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbusuhuzo09rqdrd375ro.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbusuhuzo09rqdrd375ro.png" alt="3 Estágios React Lifecycle" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Interaja com esse diagrama &lt;a href="https://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Abaixo veremos os três estágios do ciclo de vida de um componente em React: &lt;strong&gt;(1)montagem&lt;/strong&gt;, &lt;strong&gt;(2)atualização&lt;/strong&gt; e &lt;strong&gt;(3)desmontagem&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Montagem
&lt;/h2&gt;

&lt;p&gt;O estágio de montagem é a primeira fase do ciclo de vida de um componente em React. Ele &lt;strong&gt;começa quando o componente é criado&lt;/strong&gt; e &lt;strong&gt;termina quando o componente é inserido na árvore de componentes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Durante o estágio de montagem, o componente passa pelos seguintes métodos do ciclo de vida:&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  1.1 constructor( )
&lt;/h2&gt;

&lt;p&gt;O método &lt;code&gt;constructor&lt;/code&gt; é um método especial em uma classe em JavaScript que é chamado quando uma nova instância da classe é criada. No React, o método &lt;code&gt;constructor&lt;/code&gt; é &lt;strong&gt;chamado quando um componente é criado&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A sintaxe do método &lt;code&gt;constructor&lt;/code&gt; é a seguinte:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff75geoi4o9pv2lm9nmog.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff75geoi4o9pv2lm9nmog.png" alt="Image description" width="701" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O método &lt;code&gt;constructor&lt;/code&gt; recebe um parâmetro &lt;code&gt;props&lt;/code&gt;, que é um objeto que contém as propriedades enviadas para o componente.&lt;/p&gt;

&lt;p&gt;O método &lt;code&gt;constructor&lt;/code&gt; é utilizado para inicializar o estado do componente e para vincular métodos de instância ao próprio componente. Por exemplo, você pode utilizar o método &lt;code&gt;constructor&lt;/code&gt; para definir o estado inicial de um componente ou para vincular um método de instância ao evento &lt;code&gt;onClick&lt;/code&gt; de um botão.&lt;/p&gt;

&lt;p&gt;Aqui está um exemplo de como o método &lt;code&gt;constructor&lt;/code&gt; pode ser utilizado em um componente React &lt;code&gt;(Files&amp;gt;src&amp;gt;App.jsx)&lt;/code&gt;:&lt;/p&gt;


&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@MarceloPetry/constructor?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;Neste exemplo, o método &lt;code&gt;constructor&lt;/code&gt; é utilizado para inicializar o estado &lt;code&gt;count&lt;/code&gt; com o valor &lt;code&gt;0&lt;/code&gt; e para vincular o método &lt;code&gt;handleClick&lt;/code&gt; ao evento &lt;code&gt;onClick&lt;/code&gt; do botão. Quando o botão é clicado, o método &lt;code&gt;handleClick&lt;/code&gt; é&lt;br&gt;
chamado e atualiza o estado do componente, fazendo com que o componente seja renderizado novamente com o novo valor do estado &lt;code&gt;count&lt;/code&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  1.2 render( )
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;O método render() é o único método obrigatório em um class-component. (reactjs.org)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O método &lt;code&gt;render&lt;/code&gt; é um dos métodos mais importantes do ciclo de vida de um componente em React, pois é nele que o componente é renderizado na tela. Quando o método render é chamado, &lt;strong&gt;o componente gera o HTML&lt;/strong&gt; que será exibido para o usuário e &lt;strong&gt;o envia para o DOM&lt;/strong&gt; para ser renderizado.&lt;/p&gt;

&lt;p&gt;A sintaxe do método &lt;code&gt;render&lt;/code&gt; é a seguinte:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftc3apr4ludlbo3bsemw1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftc3apr4ludlbo3bsemw1.png" alt="Image description" width="741" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O método &lt;code&gt;render&lt;/code&gt; deve sempre retornar um único elemento React, que pode ser um elemento HTML ou outro componente. &lt;br&gt;
Aqui está um exemplo de um componente em React que utiliza o método &lt;code&gt;render&lt;/code&gt; para gerar o HTML que será renderizado:&lt;br&gt;
&lt;em&gt;&lt;code&gt;(Acompanhe em "Show files&amp;gt;src&amp;gt;App.jsx")&lt;/code&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@MarceloPetry/render?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;Neste exemplo, o componente &lt;code&gt;MyComponent&lt;/code&gt; tem um estado chamado &lt;code&gt;name&lt;/code&gt;, que é inicializado com o valor "John" no método &lt;code&gt;constructor&lt;/code&gt;. O método &lt;code&gt;render&lt;/code&gt; é então chamado para gerar o HTML que será renderizado pelo componente. No caso, o método &lt;code&gt;render&lt;/code&gt; retorna um elemento &lt;code&gt;div&lt;/code&gt; que contém um título e um parágrafo, ambos utilizando o valor do estado name para exibir o nome do usuário.&lt;/p&gt;

&lt;p&gt;Quando o componente é renderizado, o HTML gerado pelo método render será exibido para o usuário, como mostrado abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvtnv2ew7wpq2yqagyss1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvtnv2ew7wpq2yqagyss1.png" alt="Image description" width="662" height="343"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  1.3 componentDidMount( )
&lt;/h2&gt;

&lt;p&gt;O método &lt;code&gt;componentDidMount()&lt;/code&gt; é um método do ciclo de vida de um componente em React que é chamado imediatamente após um componente ser montado (inserido na árvore de componentes). Ele é chamado apenas uma vez na vida de um componente e é a primeira oportunidade que o componente tem de interagir com o DOM e outros sistemas.&lt;/p&gt;

&lt;p&gt;A sintaxe do método &lt;code&gt;componentDidMount&lt;/code&gt; é a seguinte:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffmze52gv24rg4sinj48p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffmze52gv24rg4sinj48p.png" alt="Image description" width="701" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O método &lt;code&gt;componentDidMount&lt;/code&gt; é chamado imediatamente após o método &lt;code&gt;render&lt;/code&gt; do componente.&lt;/p&gt;

&lt;p&gt;Ele é útil para realizar operações que precisam ser executadas &lt;strong&gt;após o componente ser renderizado&lt;/strong&gt;, como &lt;strong&gt;fazer solicitações HTTP&lt;/strong&gt;, &lt;strong&gt;configurar eventos de DOM&lt;/strong&gt; ou &lt;strong&gt;iniciar animações&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Por exemplo, você pode utilizar o método &lt;code&gt;componentDidMount&lt;/code&gt; para fazer uma solicitação HTTP para obter os dados de um servidor e atualizar o estado do componente com os dados retornados.&lt;/p&gt;

&lt;p&gt;Aqui está um exemplo de como esse método pode ser utilizado em um componente React:&lt;br&gt;
&lt;em&gt;&lt;code&gt;(Acompanhe em "Show files&amp;gt;src&amp;gt;App.jsx")&lt;/code&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@MarceloPetry/componentDidMount?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;No código acima, o componente &lt;code&gt;MyComponent&lt;/code&gt; é criado usando a classe &lt;code&gt;React.Component&lt;/code&gt; do React. Ele possui um construtor que inicializa o estado inicial do componente com um objeto vazio chamado &lt;code&gt;data&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O método &lt;code&gt;componentDidMount&lt;/code&gt; é chamado imediatamente após o método &lt;code&gt;render&lt;/code&gt; do componente. Isso significa que, quando o método &lt;code&gt;componentDidMount&lt;/code&gt; é chamado, o componente já foi renderizado e inserido na árvore de componentes.&lt;/p&gt;

&lt;p&gt;No método &lt;code&gt;componentDidMount&lt;/code&gt;, uma solicitação HTTP é feita para a API da CoinGecko para obter os dados do Bitcoin. Quando a resposta é recebida, o método &lt;code&gt;then&lt;/code&gt; é chamado com a resposta e o método &lt;code&gt;json&lt;/code&gt; é usado para converter a resposta em um objeto JavaScript. Em seguida, o método&lt;br&gt;
&lt;code&gt;setState&lt;/code&gt; é chamado para atualizar o estado do componente com os dados retornados pela API.&lt;/p&gt;

&lt;p&gt;O método &lt;code&gt;render&lt;/code&gt; é chamado para renderizar o componente com o preço atual do Bitcoin em dólares. Se o estado &lt;code&gt;data&lt;/code&gt; do componente tiver um valor, o preço atual do Bitcoin é exibido. Se o estado &lt;code&gt;data&lt;/code&gt; for nulo, a mensagem&lt;br&gt;
"Loading..." é exibida.&lt;/p&gt;


&lt;h2&gt;
  
  
  2. Atualização
&lt;/h2&gt;

&lt;p&gt;O estágio de atualização do ciclo de vida de um componente em React ocorre quando o componente é &lt;strong&gt;atualizado com novas propriedades ou estado&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Durante o estágio de &lt;strong&gt;atualização&lt;/strong&gt;, o componente passa pelos seguintes &lt;strong&gt;métodos do ciclo de vida&lt;/strong&gt;:&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2.1 render( )
&lt;/h2&gt;

&lt;p&gt;O mesmo método &lt;code&gt;render&lt;/code&gt; do estágio de montagem é chamado quando o componente é atualizado com &lt;strong&gt;novas propriedades&lt;/strong&gt; ou &lt;strong&gt;estado&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Aqui está um exemplo de um componente em React que usa o esse método para refletir as alterações na interface do usuário:&lt;br&gt;
&lt;em&gt;&lt;code&gt;(Acompanhe em "Show files&amp;gt;src&amp;gt;App.jsx")&lt;/code&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@MarceloPetry/render-method?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;Neste exemplo, o componente &lt;code&gt;MyComponent&lt;/code&gt; tem um estado chamado &lt;code&gt;age&lt;/code&gt;, que é inicializado com a propriedade &lt;code&gt;initialAge&lt;/code&gt; passada como propriedade para o componente. Ele também tem um método &lt;code&gt;handleAgeClick&lt;/code&gt;, que é chamado quando o usuário clica no botão "Adicionar ano". Quando o método é chamado, ele atualiza o estado &lt;code&gt;age&lt;/code&gt; do componente com o valor atual da idade mais um.&lt;/p&gt;

&lt;p&gt;O método &lt;code&gt;componentDidUpdate&lt;/code&gt; é chamado sempre que o componente é atualizado, o que ocorre quando o componente é renderizado pela primeira vez ou quando ocorre uma mudança nas propriedades ou estado do componente. Neste caso, o método é usado para imprimir uma mensagem no console quando a propriedade name ou o estado age do componente são alterados.&lt;/p&gt;

&lt;p&gt;Por fim, o método &lt;code&gt;render&lt;/code&gt; é chamado para renderizar o componente com as novas propriedades ou estado. Ele retorna um elemento &lt;code&gt;div&lt;/code&gt; que exibe o nome e a idade do componente, bem como um botão que, quando clicado, aumenta a idade do componente em um ano.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2.2 componentDidUpdate( )
&lt;/h2&gt;

&lt;p&gt;O método &lt;code&gt;componentDidUpdate&lt;/code&gt; é um método do ciclo de vida de um componente em React que é chamado imediatamente após o método &lt;code&gt;render&lt;/code&gt; quando o componente é atualizado, ou seja, quando há uma &lt;strong&gt;mudança nas propriedades ou estado do componente&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Esse método é útil para realizar operações que precisam ser executadas após o componente ser atualizado, como fazer &lt;strong&gt;solicitações HTTP&lt;/strong&gt;, &lt;strong&gt;atualizar o DOM&lt;/strong&gt; de forma eficiente, etc.&lt;/p&gt;

&lt;p&gt;Esse método é chamado com dois parâmetros: os &lt;strong&gt;valores das propriedades&lt;/strong&gt; e &lt;strong&gt;estado do componente antes da atualização&lt;/strong&gt; (&lt;code&gt;prevProps&lt;/code&gt; e &lt;code&gt;prevState&lt;/code&gt;) e o objeto &lt;code&gt;snapshot&lt;/code&gt;, que é um valor opcional que pode ser passado pelo método &lt;code&gt;getSnapshotBeforeUpdate&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Aqui está um exemplo de um componente em React que usa o método &lt;code&gt;componentDidUpdate&lt;/code&gt; para atualizar o gráfico de um dashboard quando os dados são alterados:&lt;br&gt;
&lt;em&gt;&lt;code&gt;(Acompanhe em "Show files&amp;gt;src&amp;gt;App.jsx")&lt;/code&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@MarceloPetry/componentDidUpdate?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;No código acima, o método &lt;code&gt;componentDidUpdate&lt;/code&gt; é chamado sempre que o componente é atualizado.&lt;/p&gt;

&lt;p&gt;Ao método &lt;code&gt;componentDidUpdate&lt;/code&gt; são passados dois parâmetros: &lt;code&gt;prevProps&lt;/code&gt; e &lt;code&gt;prevState&lt;/code&gt;, que são as propriedades e o estado do componente imediatamente antes da atualização. Isso permite que o componente compare as propriedades e o estado atuais com os valores anteriores e, se necessário, execute alguma ação.&lt;/p&gt;

&lt;p&gt;No caso do código acima, o método &lt;code&gt;componentDidUpdate&lt;/code&gt; é utilizado para verificar se a propriedade data do componente foi alterada. Se a propriedade data for diferente da propriedade data do componente anterior &lt;code&gt;(prevProps.data !== this.props.data)&lt;/code&gt;, o método &lt;code&gt;updateChart&lt;/code&gt; é chamado.&lt;/p&gt;

&lt;p&gt;Em suma, o método &lt;code&gt;componentDidUpdate&lt;/code&gt; é usado no código acima para detectar alterações nas propriedades do componente e, quando isso ocorre, chamar o método &lt;code&gt;updateChart&lt;/code&gt; para atualizar o gráfico com os novos dados.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Desmontagem: componentWillUnmount( )
&lt;/h2&gt;

&lt;p&gt;O estágio de desmontagem é o último estágio do ciclo de vida de um componente em React. Ele ocorre quando o componente &lt;strong&gt;é removido da árvore&lt;/strong&gt; de componentes.&lt;/p&gt;

&lt;p&gt;Atualmente, o React tem apenas um método interno que é chamado quando um componente é desmontado: &lt;code&gt;componentWillUnmount&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O método &lt;code&gt;componentWillUnmount&lt;/code&gt; é chamado imediatamente antes de um componente ser desmontado e destruído. Ele é usado para &lt;strong&gt;limpar qualquer lógica ou recursos&lt;/strong&gt; que o componente possa ter usado durante o seu ciclo de vida. Alguns exemplos comuns de uso do &lt;code&gt;componentWillUnmount&lt;/code&gt; incluem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desinscrever-se de eventos de mouse ou teclado;&lt;/li&gt;
&lt;li&gt;Cancelar solicitações HTTP pendentes;&lt;/li&gt;
&lt;li&gt;Remover elementos de DOM criados durante o ciclo de vida do componente;&lt;/li&gt;
&lt;li&gt;Limpar temporizadores ou intervalos de tempo criados pelo componente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Abaixo, temos um caso comum de uso do &lt;code&gt;componentWillUnmount&lt;/code&gt; para cancelar &lt;em&gt;event listeners&lt;/em&gt; ou outras operações assíncronas que foram iniciadas no &lt;code&gt;componentDidMount&lt;/code&gt;:&lt;br&gt;
&lt;em&gt;&lt;code&gt;(Acompanhe em "Show files&amp;gt;src&amp;gt;App.jsx")&lt;/code&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@MarceloPetry/componentWillUnmount?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;No exemplo acima, o método &lt;code&gt;componentWillUnmount&lt;/code&gt; é usado para cancelar um intervalo de tempo criado pelo método &lt;code&gt;setInterval&lt;/code&gt;. Quando o componente é desmontado, o intervalo é cancelado, evitando que ele continue a ser executado e consumindo recursos desnecessariamente.&lt;/p&gt;

&lt;p&gt;É importante lembrar de que o método &lt;code&gt;componentWillUnmount&lt;/code&gt; é chamado apenas uma vez, imediatamente antes do componente ser destruído, portanto não é possível atualizar o estado do componente neste método. Além disso, não é possível usar o &lt;code&gt;setState&lt;/code&gt; neste método, pois o componente já está prestes a ser destruído e não será renderizado novamente.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://marcelopetry.com" rel="noopener noreferrer"&gt;marcelopetry.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>emptystring</category>
    </item>
    <item>
      <title>⚛Os 10 React Hooks Mais Úteis: 05 - useReducer⚛</title>
      <dc:creator>Marcelo Petry</dc:creator>
      <pubDate>Wed, 28 Dec 2022 20:41:27 +0000</pubDate>
      <link>https://dev.to/mpetry/os-10-react-hooks-mais-uteis-05-usereducer-f9j</link>
      <guid>https://dev.to/mpetry/os-10-react-hooks-mais-uteis-05-usereducer-f9j</guid>
      <description>&lt;p&gt;&lt;em&gt;Este é o quinto artigo de uma série de 10, que explica de forma simplificada e com exemplos, os react hooks mais utilizados em programação.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;O &lt;code&gt;useReducer&lt;/code&gt; é um hook do React que permite &lt;strong&gt;gerenciar o estado&lt;/strong&gt; de um componente de forma semelhante ao reducer do &lt;a href="https://www.geeksforgeeks.org/introduction-to-react-redux/"&gt;Redux&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;useReducer&lt;/code&gt; é útil quando você precisa gerenciar um &lt;a href="https://medium.com/edonec/state-in-react-an-overview-a182675cee2c"&gt;estado&lt;/a&gt; &lt;strong&gt;mais complexo&lt;/strong&gt; ou compartilhado por vários componentes em sua aplicação. Ele também pode ser uma alternativa mais eficiente ao &lt;code&gt;useState&lt;/code&gt; em casos em que o estado depende de valores anteriores, pois o &lt;code&gt;useReducer&lt;/code&gt; &lt;strong&gt;só requer que você forneça o próximo estado&lt;/strong&gt;, em vez de todo o estado atual. &lt;/p&gt;

&lt;p&gt;O primeiro parâmetro do &lt;code&gt;useReducer&lt;/code&gt; é o reducer, que é uma função que recebe o &lt;a href="https://medium.com/edonec/state-in-react-an-overview-a182675cee2c"&gt;estado&lt;/a&gt; atual e uma ação como entrada e retorna o próximo estado. O reducer é responsável por atualizar o estado de acordo com a ação fornecida. Ele é geralmente escrito como um &lt;em&gt;switch statement&lt;/em&gt; que verifica o tipo da ação e retorna o próximo estado de acordo com a ação correspondente. &lt;/p&gt;

&lt;p&gt;O segundo parâmetro do &lt;code&gt;useReducer&lt;/code&gt; é o estado inicial, que é o valor inicial do estado do componente. Ele é passado como o primeiro argumento para o reducer quando o componente é montado pela primeira vez. Ao chamar o &lt;code&gt;useReducer&lt;/code&gt;, o hook retorna um par de valores: &lt;strong&gt;o estado atual&lt;/strong&gt; e a &lt;strong&gt;função de dispatch&lt;/strong&gt;. O estado atual é o valor atual do estado do componente, que é atualizado pelo reducer sempre que uma ação é despachada. A função de dispatch é usada para despachar uma ação para o reducer, o que atualiza o estado do componente.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Empregos do useReducer
&lt;/h1&gt;

&lt;p&gt;Entenda o funcionamento do react hook &lt;code&gt;useReducer&lt;/code&gt; com os exemplos abaixo.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Contador com useReducer
&lt;/h2&gt;

&lt;p&gt;Acompanhe abaixo no arquivo &lt;code&gt;Files&amp;gt;src&amp;gt;App.jsx&lt;/code&gt; o exemplo de um contador simples sobre o uso desse hook:&lt;/p&gt;


&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@MarceloPetry/useReducer-Counter?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;1 - &lt;code&gt;import { useReducer } from "react"&lt;/code&gt;: este comando importa o hook &lt;code&gt;useReducer&lt;/code&gt; do módulo &lt;code&gt;react&lt;/code&gt;. &lt;br&gt;
2 - &lt;code&gt;function reducer(state, action)&lt;/code&gt;: esta é uma função chamada reducer, que recebe dois argumentos: &lt;code&gt;state&lt;/code&gt; e &lt;code&gt;action&lt;/code&gt;. &lt;br&gt;
3 - &lt;code&gt;switch (action.type)&lt;/code&gt;: neste trecho, o valor do atributo &lt;code&gt;type&lt;/code&gt; da ação é usado para escolher qual ação será realizada. &lt;br&gt;
4 - &lt;code&gt;case "increment"&lt;/code&gt;: se o valor do atributo &lt;code&gt;type&lt;/code&gt; da ação for "increment", será executado o código abaixo deste case. &lt;br&gt;
5 - &lt;code&gt;return { count: state.count + 1 }&lt;/code&gt;: este comando retorna um novo objeto com o valor de &lt;code&gt;count&lt;/code&gt; incrementado em 1 em relação ao valor atual. &lt;br&gt;
6 - &lt;code&gt;case "decrement"&lt;/code&gt;: se o valor do atributo &lt;code&gt;type&lt;/code&gt; da ação for "decrement", será executado o código abaixo deste case. &lt;br&gt;
7 - &lt;code&gt;return { count: state.count - 1 }&lt;/code&gt;: este comando retorna um novo objeto com o valor de &lt;code&gt;count&lt;/code&gt; decrementado em 1 em relação ao valor atual. &lt;br&gt;
8 - &lt;code&gt;default&lt;/code&gt;: se o valor do atributo &lt;code&gt;type&lt;/code&gt; da ação não for reconhecido pelos cases acima, será executado o código abaixo deste default. &lt;br&gt;
9 - &lt;code&gt;throw new Error()&lt;/code&gt;: este comando lança uma exceção, interrompendo a execução do código. &lt;br&gt;
10 - &lt;code&gt;function Counter()&lt;/code&gt;: esta é uma função que retorna um componente do React. &lt;br&gt;
11 - &lt;code&gt;const [state, dispatch] = useReducer(reducer, { count: 0 })&lt;/code&gt;: este comando usa o hook &lt;code&gt;useReducer&lt;/code&gt; para gerenciar o estado do componente. O primeiro argumento é o reducer definido anteriormente, e o segundo é o estado inicial, um objeto com o valor de &lt;code&gt;count&lt;/code&gt; igual a 0. O &lt;code&gt;useReducer&lt;/code&gt; retorna um array com dois elementos: o primeiro é o estado atual, e o segundo é uma função chamada &lt;code&gt;dispatch&lt;/code&gt;, que permite disparar uma ação para o reducer. &lt;br&gt;
12 - &lt;code&gt;dispatch({ type: "increment" })}&amp;gt;+&lt;/code&gt;: este é um botão que, quando clicado, dispara uma ação de tipo "increment" para o reducer usando a função &lt;code&gt;dispatch&lt;/code&gt;.&lt;br&gt;
13 - &lt;code&gt;dispatch({ type: "decrement" })}&amp;gt;-&lt;/code&gt;: este é um botão que, quando clicado, dispara uma ação de tipo "decrement" para o reducer usando a função &lt;code&gt;dispatch&lt;/code&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Hook useReducer aplicado à lista de tarefas
&lt;/h2&gt;

&lt;p&gt;No exemplo abaixo, o componente &lt;code&gt;Files&amp;gt;src&amp;gt;App.jsx&lt;/code&gt; exibe uma lista de tarefas, um formulário para adicionar novas tarefas e botões para marcar tarefas como concluídas ou removê-las. Acompanhe:&lt;/p&gt;


&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@MarceloPetry/useReducer-Tasks-List?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;1 - &lt;code&gt;React&lt;/code&gt; e &lt;code&gt;useReducer&lt;/code&gt; são importados do pacote &lt;code&gt;react&lt;/code&gt;.&lt;br&gt;
2 - &lt;code&gt;initialState&lt;/code&gt; é uma constante que armazena um array vazio, que será o estado inicial do componente. &lt;br&gt;
3 - &lt;code&gt;reducer&lt;/code&gt; é uma função que recebe o estado atual e uma ação como argumentos e retorna um novo estado. Ela possui um switch case com três casos possíveis, correspondentes às ações "ADD_TASK", "TOGGLE_TASK" e "REMOVE_TASK". &lt;br&gt;
4 - &lt;code&gt;TaskList&lt;/code&gt; é uma função que retorna um componente React. Ela utiliza o hook &lt;code&gt;useReducer&lt;/code&gt; para gerenciar o estado do componente, passando como primeiro argumento a função &lt;code&gt;reducer&lt;/code&gt; e como segundo argumento o estado inicial, armazenado na constante &lt;code&gt;initialState&lt;/code&gt;.&lt;br&gt;
5 - &lt;code&gt;handleSubmit&lt;/code&gt; é uma função que é chamada quando o formulário é submetido. Ela previne o comportamento padrão de recarregar a página e envia uma ação do tipo "ADD_TASK" com o texto digitado no campo de input como payload. Ela também limpa o campo de input. &lt;br&gt;
6 - &lt;code&gt;handleToggleTask&lt;/code&gt; é uma função que é chamada quando o checkbox de uma tarefa é clicado. Ela envia uma ação do tipo "TOGGLE_TASK" com o id da tarefa como payload. &lt;br&gt;
7 - &lt;code&gt;handleRemoveTask&lt;/code&gt; é uma função que é chamada quando o botão "Remove" de uma tarefa é clicado. Ela envia uma ação do tipo "REMOVE_TASK" com o id da tarefa como payload. &lt;br&gt;
8 - O componente é retornado com um formulário para adicionar uma nova tarefa, uma lista de tarefas e, para cada tarefa, um checkbox para marcar como concluída e um botão para remover. Cada tarefa possui o texto da descrição e o id como chave única. &lt;br&gt;
9 - O componente é exportado para que possa ser utilizado em outros arquivos.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Hook useReducer em Formulário de Nome/E-mail
&lt;/h2&gt;

&lt;p&gt;Outro exemplo para compreendermos o &lt;code&gt;useReducer&lt;/code&gt; é no caso em que precisamos manipular os dados de um formulário em nosso aplicativo. O reducer define o que acontece com o estado quando as ações são emitidas e usamos o gancho para controlar o estado inicial. Depois, temos campos de entrada que emitem ações para o nosso reducer e um botão de redefinição para redefinir os dados do formulário. Veja em &lt;code&gt;Files&amp;gt;src&amp;gt;App.jsx&lt;/code&gt;:&lt;/p&gt;


&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@MarceloPetry/MailandName-Form-useReducer?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;1 - &lt;code&gt;import React, { useReducer } from 'react';&lt;/code&gt;: Essa linha importa o React e o hook &lt;code&gt;useReducer&lt;/code&gt; do pacote react. &lt;br&gt;
2 - &lt;code&gt;const initialState = { formData: { name: '', email: '' } };&lt;/code&gt;: Essa constante define o estado inicial do componente como um objeto que contém um objeto aninhado chamado &lt;code&gt;formData&lt;/code&gt;, que, por sua vez, contém os campos de formulário &lt;code&gt;name&lt;/code&gt; e &lt;code&gt;email&lt;/code&gt; inicializados como strings vazias. &lt;br&gt;
3 - &lt;code&gt;function reducer(state, action) { ... }&lt;/code&gt;: Essa função é o reducer que será usado pelo hook &lt;code&gt;useReducer&lt;/code&gt;. Ele recebe dois argumentos: o estado atual e uma ação. A função verifica o tipo de ação e, em seguida, retorna um novo estado de acordo. &lt;br&gt;
4 - &lt;code&gt;const [state, dispatch] = useReducer(reducer, initialState);&lt;/code&gt;: Essa linha usa o hook &lt;code&gt;useReducer&lt;/code&gt; para gerenciar o estado do componente. Ela recebe dois argumentos: o reducer e o estado inicial. Em seguida, ela desestrutura o valor retornado pelo hook em duas variáveis: o estado atual e uma função chamada &lt;code&gt;dispatch&lt;/code&gt;, que pode ser usada para enviar ações para o reducer. &lt;br&gt;
5 - &lt;code&gt;const handleUpdateFormData = formData =&amp;gt; dispatch({ type: 'UPDATE_FORM_DATA', formData });&lt;/code&gt;: Essa função é um manipulador de eventos que é chamado quando os campos de formulário são alterados. Ele recebe um objeto &lt;code&gt;formData&lt;/code&gt; como argumento e usa a função &lt;code&gt;dispatch&lt;/code&gt; para enviar uma ação do tipo &lt;code&gt;UPDATE_FORM_DATA&lt;/code&gt; para o reducer, passando o objeto &lt;code&gt;formData&lt;/code&gt; como um segundo argumento.&lt;br&gt;
6 - &lt;code&gt;const handleResetFormData = () =&amp;gt; dispatch({ type: 'RESET_FORM_DATA'});&lt;/code&gt;: Essa função é um manipulador de eventos que é chamado quando o botão "Reset" é clicado. Ele usa a função &lt;code&gt;dispatch&lt;/code&gt; para enviar uma ação do tipo &lt;code&gt;RESET_FORM_DATA&lt;/code&gt; para o reducer.&lt;br&gt;
7 - &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt;: Essa é a tag principal do formulário.&lt;br&gt;
8 - &lt;code&gt;&amp;lt;input type="text" name="name" value={state.formData.name} placeholder="Enter Your Name" onChange={e =&amp;gt; handleUpdateFormData({[e.target.name]: e.target.value })} /&amp;gt;&lt;/code&gt;: Essa é uma entrada de texto para o campo de nome. Ela recebe o valor atual do campo de nome doestado através da propriedade &lt;code&gt;value&lt;/code&gt;, e usa o manipulador de eventos &lt;code&gt;handleUpdateFormData&lt;/code&gt; para atualizar o estado quando o campo é alterado.&lt;br&gt;
9 - &lt;code&gt;handleUpdateFormData({ [e.target.name]: e.target.value })} /&amp;gt;&lt;/code&gt;: este é um elemento de entrada HTML que representa um campo de formulário para o usuário inserir o endereço de e-mail. Quando o usuário digita um valor no campo, a função &lt;code&gt;handleUpdateFormData&lt;/code&gt; é chamada para atualizar os dados do formulário. &lt;br&gt;
10 - &lt;code&gt;Reset&lt;/code&gt;: este é um elemento de botão HTML que tem um evento &lt;code&gt;onClick&lt;/code&gt; que chama a função &lt;code&gt;handleResetFormData&lt;/code&gt; quando o botão é clicado. Isso faz com que os dados do formulário sejam redefinidos para seus valores iniciais. &lt;br&gt;
11 - &lt;code&gt;export default App;&lt;/code&gt;: este código exporta o componente &lt;code&gt;App&lt;/code&gt; para que ele possa ser usado em outros arquivos.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  4. Formulário de busca com useReducer
&lt;/h2&gt;

&lt;p&gt;Neste exemplo, testaremos o hook &lt;code&gt;useReducer&lt;/code&gt; em um componente de formulário de busca. Acompanhe pelo &lt;code&gt;Files&amp;gt;src&amp;gt;App.jsx&lt;/code&gt;:&lt;/p&gt;


&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@MarceloPetry/Search-Form-useReducer?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;1 - &lt;code&gt;import React, { useReducer } from 'react';&lt;/code&gt;: Importa o módulo &lt;code&gt;react&lt;/code&gt; e a função &lt;code&gt;useReducer&lt;/code&gt; do módulo &lt;code&gt;react&lt;/code&gt;. &lt;br&gt;
2 - &lt;code&gt;import './App.css'&lt;/code&gt;: Importa o arquivo de estilos &lt;code&gt;App.css&lt;/code&gt; para o componente &lt;code&gt;App&lt;/code&gt;. &lt;br&gt;
3 - &lt;code&gt;const initialState = { query: '', results: [] };&lt;/code&gt;: Define o estado inicial do componente &lt;code&gt;App&lt;/code&gt;, contendo um objeto com as propriedades &lt;code&gt;query&lt;/code&gt; e &lt;code&gt;results&lt;/code&gt;. A propriedade &lt;code&gt;query&lt;/code&gt; armazena a string de pesquisa atual, enquanto a propriedade &lt;code&gt;results&lt;/code&gt; armazena os resultados da pesquisa. &lt;br&gt;
4 - &lt;code&gt;const reducer = (state, action) =&amp;gt; {...}&lt;/code&gt;: Define uma função reducer que recebe um estado atual e uma ação e retorna um novo estado. A função reducer é usada pelo &lt;code&gt;useReducer&lt;/code&gt; para atualizar o estado do componente. &lt;br&gt;
5 - &lt;code&gt;const App = () =&amp;gt; {...}&lt;/code&gt;: Define o componente &lt;code&gt;App&lt;/code&gt; como uma função. &lt;br&gt;
6 - &lt;code&gt;const [state, dispatch] = useReducer(reducer, initialState);&lt;/code&gt;: Chama a função &lt;code&gt;useReducer&lt;/code&gt; passando a função reducer e o estado inicial como argumentos. A função &lt;code&gt;useReducer&lt;/code&gt; retorna um array com o estado atual e uma função &lt;code&gt;dispatch&lt;/code&gt; que pode ser usada para disparar ações para a função reducer. O estado atual é armazenado na variável &lt;code&gt;state&lt;/code&gt;, enquanto a função &lt;code&gt;dispatch&lt;/code&gt; é armazenada na variável &lt;code&gt;dispatch&lt;/code&gt;.&lt;br&gt;
7 - &lt;code&gt;const handleInputChange = e =&amp;gt; {...};&lt;/code&gt;: Define uma função &lt;code&gt;handleInputChange&lt;/code&gt; que é chamada toda vez que o usuário altera o valor do input de pesquisa. A função dispara uma ação &lt;code&gt;UPDATE_QUERY&lt;/code&gt; para a função reducer, passando o valor atual do input como argumento.&lt;br&gt;
8 - &lt;code&gt;const handleSearch = () =&amp;gt; {...};&lt;/code&gt;: Define uma função &lt;code&gt;handleSearch&lt;/code&gt; que é chamada toda vez que o usuário clica no botão "Search". A função simula uma chamada a uma API, gerando alguns resultados de pesquisa fictícios e disparando uma ação &lt;code&gt;UPDATE_RESULTS&lt;/code&gt; para a função reducer, passando os resultados como argumento. &lt;br&gt;
9 - &lt;code&gt;const handleReset = () =&amp;gt; {...};&lt;/code&gt;: Define uma função &lt;code&gt;handleReset&lt;/code&gt; que é chamada toda vez que o usuário clica no botão "Reset". A função dispara uma ação &lt;code&gt;RESET&lt;/code&gt; para a função reducer, reinicializando o estado do componente para o estado inicial. &lt;br&gt;
10 - &lt;code&gt;return (...)&lt;/code&gt;: Retorna o elemento JSX que representa o componente &lt;code&gt;App&lt;/code&gt;. O elemento inclui um input de texto que exibe o valor da propriedade &lt;code&gt;query&lt;/code&gt; do estado atual e chama a função &lt;code&gt;handleInputChange&lt;/code&gt; toda vez que o valor é alterado. Também inclui dois botões que chamam as funções &lt;code&gt;handleSearch&lt;/code&gt; e &lt;code&gt;handleReset&lt;/code&gt; quando clicados. Por fim, o elemento inclui um conjunto de elementos &lt;code&gt;div&lt;/code&gt; que exibem os resultados da pesquisa armazenados na propriedade &lt;code&gt;results&lt;/code&gt; do estado atual.&lt;/p&gt;




&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;p&gt;O &lt;code&gt;useReducer&lt;/code&gt; é um hook do React que permite que um componente gerencie seu próprio estado de maneira semelhante ao padrão reducer de uma aplicação Redux. &lt;/p&gt;

&lt;p&gt;Ao invés de armazenar o estado diretamente no componente, o estado é armazenado em uma função &lt;code&gt;reducer&lt;/code&gt;, que toma o estado atual e uma ação como argumentos e retorna o próximo estado da aplicação. Isso permite que a lógica de atualização do estado seja centralizada e &lt;strong&gt;facilita o gerenciamento de mudanças de estado complexas&lt;/strong&gt; em componentes. &lt;/p&gt;

&lt;p&gt;Além disso, o uso do &lt;code&gt;useReducer&lt;/code&gt; pode tornar o código mais legível, pois a lógica de atualização do estado é isolada em uma única função, em vez de espalhada por todo o componente. &lt;/p&gt;

&lt;p&gt;No entanto, é importante lembrar de que o &lt;code&gt;useReducer&lt;/code&gt; não é a solução ideal para todos os casos e deve ser usado com moderação, considerando as necessidades específicas da sua aplicação.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://marcelopetry.com"&gt;marcelopetry.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>⚛Os 10 React Hooks Mais Úteis: 04 - useRef⚛</title>
      <dc:creator>Marcelo Petry</dc:creator>
      <pubDate>Mon, 26 Dec 2022 21:48:17 +0000</pubDate>
      <link>https://dev.to/mpetry/os-10-react-hooks-mais-uteis-04-useref-4kbi</link>
      <guid>https://dev.to/mpetry/os-10-react-hooks-mais-uteis-04-useref-4kbi</guid>
      <description>&lt;p&gt;&lt;em&gt;Este é o quarto artigo de uma série de 10, que explica de forma simplificada e com exemplos, os react hooks mais utilizados em programação.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;O hook &lt;code&gt;useRef&lt;/code&gt; é muito útil para criar uma &lt;strong&gt;referência a um elemento DOM&lt;/strong&gt; ou &lt;strong&gt;a um valor&lt;/strong&gt; dentro de um &lt;a href="https://dev.to/mpetry/componentes-funcionais-e-de-classe-em-react-150c"&gt;componente funcional&lt;/a&gt;. Ele é frequentemente usado para acessar elementos DOM ou para armazenar valores que &lt;strong&gt;não precisam ser renderizados novamente&lt;/strong&gt; quando o componente é atualizado.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Aplicabilidades do useRef
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Armazenar uma referência a um elemento DOM:
&lt;/h2&gt;

&lt;p&gt;Aqui está um exemplo de código de como o &lt;code&gt;useRef&lt;/code&gt; pode ser usado para armazenar uma referência a um elemento DOM:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F932kjq2lxx8tq0nhf0dr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F932kjq2lxx8tq0nhf0dr.png" alt="Image description" width="800" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neste exemplo, o &lt;code&gt;useRef&lt;/code&gt; é usado para &lt;strong&gt;criar uma referência&lt;/strong&gt; ao elemento &lt;code&gt;input&lt;/code&gt;. A referência é armazenada na variável &lt;code&gt;inputElement&lt;/code&gt;. Em seguida, a referência é passada para o atributo &lt;code&gt;ref&lt;/code&gt; do elemento &lt;code&gt;input&lt;/code&gt; usando o sintaxe &lt;code&gt;ref={inputElement}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Quando o botão é clicado, a função &lt;code&gt;handleButtonClick&lt;/code&gt; é chamada. Ela usa a propriedade &lt;code&gt;current&lt;/code&gt; da referência para acessar o elemento &lt;code&gt;input&lt;/code&gt; e chama o método &lt;code&gt;focus&lt;/code&gt; nele. Isso faz com que o cursor de entrada de texto seja colocado no elemento &lt;code&gt;input&lt;/code&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Emprego do useRef em um elemento de lista
&lt;/h3&gt;

&lt;p&gt;O caso abaixo mostra como usar o hook &lt;code&gt;useRef&lt;/code&gt; para &lt;strong&gt;armazenar uma referência a um elemento de lista&lt;/strong&gt; e &lt;strong&gt;adicionar itens dinamicamente&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fygjokod1vkxxhshdpgem.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fygjokod1vkxxhshdpgem.png" alt="Image description" width="800" height="912"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1 - O hook &lt;code&gt;useRef&lt;/code&gt; é importado do módulo &lt;code&gt;react&lt;/code&gt;, assim como o hook &lt;code&gt;useState&lt;/code&gt;. &lt;br&gt;
2 - A função &lt;code&gt;MyListComponent&lt;/code&gt; é criada, que renderiza o elemento de lista e um botão. &lt;br&gt;
3 - Dentro da função, é criada uma nova referência usando o hook &lt;code&gt;useRef&lt;/code&gt; e a armazena na variável &lt;code&gt;listRef&lt;/code&gt;. O argumento inicial &lt;code&gt;null&lt;/code&gt; é passado para a função &lt;code&gt;useRef&lt;/code&gt;. &lt;br&gt;
4 - O hook &lt;code&gt;useState&lt;/code&gt; é usado para armazenar os itens da lista na variável &lt;code&gt;items&lt;/code&gt;. &lt;br&gt;
5 - A referência é passada para o atributo &lt;code&gt;ref&lt;/code&gt; do elemento de lista usando a sintaxe &lt;code&gt;ref={listRef}&lt;/code&gt;. Isso faz com que a instância do elemento seja armazenada na propriedade &lt;code&gt;current&lt;/code&gt; da referência. &lt;br&gt;
6 - A função &lt;code&gt;handleButtonClick&lt;/code&gt; é criada para adicionar um novo item à lista e atualizar o scroll da lista para a última posição quando o botão é clicado. Ela usa o hook &lt;code&gt;useState&lt;/code&gt; para adicionar um novo item à lista e atualiza a propriedade &lt;code&gt;scrollTop&lt;/code&gt; da propriedade &lt;code&gt;current&lt;/code&gt; da referência &lt;code&gt;listRef&lt;/code&gt; para a altura total da lista usando a propriedade &lt;code&gt;scrollHeight&lt;/code&gt;. &lt;br&gt;
7 - O elemento de lista e o botão são renderizados no retorno da função. Quando o botão é clicado, a função &lt;code&gt;handleButtonClick&lt;/code&gt; é chamada e um novo item é adicionado à lista e o scroll da lista é atualizado para a última posição.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Hook useRef em Dropdown de menu suspenso
&lt;/h3&gt;

&lt;p&gt;Imagine que você tenha um componente &lt;code&gt;Dropdown&lt;/code&gt; que renderiza um menu suspenso com uma lista de opções. Você pode usar o &lt;code&gt;useRef&lt;/code&gt; para armazenar uma referência ao elemento &lt;code&gt;ul&lt;/code&gt; que representa o menu suspenso e, em seguida, usar essa referência para controlar a exibição do menu suspenso através da alteração da propriedade &lt;code&gt;display&lt;/code&gt; do estilo do elemento:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh9k89y32b7pqw8mlgb3m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh9k89y32b7pqw8mlgb3m.png" alt="Image description" width="800" height="1005"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1 - O componente &lt;code&gt;Dropdown&lt;/code&gt; recebe um array de opções como propriedade. &lt;br&gt;
2 - O componente usa o &lt;code&gt;useRef&lt;/code&gt; para criar uma referência ao elemento &lt;code&gt;ul&lt;/code&gt; que representa o menu suspenso. Essa referência é armazenada na variável &lt;code&gt;dropdownEl&lt;/code&gt;. &lt;br&gt;
3 - O componente define uma função de manipulador de evento chamada &lt;code&gt;handleToggleDropdown&lt;/code&gt; que é chamada quando o botão "Menu suspenso" é clicado. Essa função verifica o valor da propriedade &lt;code&gt;display&lt;/code&gt; do elemento &lt;code&gt;ul&lt;/code&gt; e altera esse valor para "block" ou "none", dependendo do seu estado atual. &lt;br&gt;
4 - O componente renderiza um botão com o texto "Menu suspenso" e um elemento &lt;code&gt;ul&lt;/code&gt; com as opções passadas como propriedade. O elemento &lt;code&gt;ul&lt;/code&gt; é passado a referência criada pelo &lt;code&gt;useRef&lt;/code&gt; através do atributo &lt;code&gt;ref&lt;/code&gt; e é inicialmente oculto com a propriedade &lt;code&gt;display&lt;/code&gt; definida como "none". Quando o botão é clicado, a função &lt;code&gt;handleToggleDropdown&lt;/code&gt; é chamada e altera a propriedade &lt;code&gt;display&lt;/code&gt; do elemento &lt;code&gt;ul&lt;/code&gt;, exibindo ou ocultando o menu suspenso.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Armazenar uma referência a um valor
&lt;/h3&gt;

&lt;p&gt;O hook &lt;code&gt;useRef&lt;/code&gt; pode ser usado para armazenar uma referência a um valor em um &lt;a href="https://dev.to/mpetry/componentes-funcionais-e-de-classe-em-react-150c"&gt;componente funcional&lt;/a&gt; do React.&lt;/p&gt;

&lt;p&gt;Ele é útil para armazenar valores que &lt;strong&gt;não mudam frequentemente&lt;/strong&gt;, como referências a elementos do DOM, mas também pode ser usado para armazenar qualquer tipo de valor.&lt;/p&gt;

&lt;p&gt;Por exemplo, imagine que você tenha um formulário em uma aplicação React e deseja obter o valor do &lt;code&gt;input&lt;/code&gt; quando o usuário submete o formulário:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4tn2nbyj5h4ymkjo3u9m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4tn2nbyj5h4ymkjo3u9m.png" alt="Image description" width="800" height="1121"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1 - O componente de formulário é criado usando a função &lt;code&gt;Form&lt;/code&gt;. &lt;br&gt;
2 - Dentro da função &lt;code&gt;Form&lt;/code&gt;, é criada uma referência ao elemento de input usando a função &lt;code&gt;useRef&lt;/code&gt;. A referência é inicializada com o valor &lt;code&gt;null&lt;/code&gt;. &lt;br&gt;
3 - É definida uma função de manipulador de envio, que é chamada quando o formulário é submetido. A função chama &lt;code&gt;event.preventDefault()&lt;/code&gt; para evitar que a página seja recarregada pelo navegador. &lt;br&gt;
4 - A função de manipulador de envio obtém o valor do elemento de input usando &lt;code&gt;inputEl.current.value&lt;/code&gt;. &lt;br&gt;
5 - A função de manipulador de envio chama a função &lt;code&gt;submitForm&lt;/code&gt; com o valor do input como argumento. &lt;br&gt;
6 - O componente é renderizado como um elemento &lt;code&gt;form&lt;/code&gt; do HTML, com um manipulador de envio atribuído ao atributo &lt;code&gt;onSubmit&lt;/code&gt;. Ele também renderiza um elemento &lt;code&gt;label&lt;/code&gt; e um elemento &lt;code&gt;input&lt;/code&gt; como filhos do elemento de formulário, além de um botão de envio. &lt;br&gt;
7 - Quando o usuário preenche o campo de entrada e clica no botão de envio, o componente obtém o valor do campo de entrada e chama a função &lt;code&gt;submitForm&lt;/code&gt; com esse valor como argumento.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Armazenar referência a um objeto de websocket
&lt;/h3&gt;

&lt;p&gt;O &lt;code&gt;useRef&lt;/code&gt; é útil para &lt;strong&gt;armazenar valores&lt;/strong&gt; que não precisam ser renderizados novamente quando o componente é atualizado. Por exemplo, você pode usar o &lt;code&gt;useRef&lt;/code&gt; para armazenar uma referência a um objeto de &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/API/WebSocket#:~:text=O%20objeto%20WebSocket%20prov%C3%AA%20uma,de%20dados%20atrav%C3%A9s%20dessa%20conex%C3%A3o." rel="noopener noreferrer"&gt;websocket&lt;/a&gt;, como este:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmeoquaptiqfhgacosuir.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmeoquaptiqfhgacosuir.png" alt="Image description" width="800" height="967"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1 - Neste exemplo, o hook &lt;code&gt;useRef&lt;/code&gt; é usado para criar uma referência para o objeto &lt;code&gt;WebSocket&lt;/code&gt;. A referência é armazenada na variável &lt;code&gt;socketRef&lt;/code&gt;.&lt;br&gt;
2 - Em seguida, o hook &lt;code&gt;useEffect&lt;/code&gt; é usado duas vezes para configurar e limpar o objeto &lt;code&gt;WebSocket&lt;/code&gt;. A primeira vez, o &lt;code&gt;useEffect&lt;/code&gt; é usado para criar um novo objeto &lt;code&gt;WebSocket&lt;/code&gt; quando o componente é montado. A segunda vez, o &lt;code&gt;useEffect&lt;/code&gt; é usado para fechar o objeto &lt;code&gt;WebSocket&lt;/code&gt; quando o componente é desmontado.&lt;br&gt;
3 - Por fim, uma função &lt;code&gt;sendMessage&lt;/code&gt; é criada que usa a referência para enviar mensagens pelo &lt;code&gt;WebSocket&lt;/code&gt;. O componente renderiza um botão que, quando clicado, chama a função &lt;code&gt;sendMessage&lt;/code&gt; para enviar uma mensagem pelo &lt;code&gt;WebSocket&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O hook &lt;code&gt;useRef&lt;/code&gt; é útil neste exemplo porque permite armazenar a referência ao objeto &lt;code&gt;WebSocket&lt;/code&gt; de forma que ela não seja atualizada quando o componente é atualizado. Isso é útil porque o objeto &lt;code&gt;WebSocket&lt;/code&gt; não precisa ser recriado toda vez que o componente é renderizado novamente. Em vez disso, ele pode ser acessado diretamente através da referência armazenada no &lt;code&gt;useRef&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Armazenar uma referência a uma instância de um componente de terceiros:
&lt;/h2&gt;

&lt;p&gt;O hook &lt;code&gt;useRef&lt;/code&gt; também pode ser usado para &lt;strong&gt;armazenar uma referência a uma instância de um componente de terceiros&lt;/strong&gt; em um componente funcional do React.&lt;/p&gt;

&lt;p&gt;Alguns exemplos de componentes de terceiros cujos métodos podem ser acessados usando o &lt;code&gt;useRef&lt;/code&gt; incluem &lt;strong&gt;bibliotecas de mapas&lt;/strong&gt;, &lt;strong&gt;bibliotecas de gráficos&lt;/strong&gt;, &lt;strong&gt;bibliotecas de edição de texto&lt;/strong&gt;, entre outros.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Hook useRef para acessar a instância de um componente de mapa
&lt;/h3&gt;

&lt;p&gt;O exemplo abaixo mostra como usar o hook &lt;code&gt;useRef&lt;/code&gt; para armazenar uma referência a uma instância de um componente de mapa de terceiros, neste caso o componente &lt;code&gt;GoogleMap&lt;/code&gt;:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5qz8qvptmjk50751ztfz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5qz8qvptmjk50751ztfz.png" alt="Image description" width="800" height="715"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1 - O hook &lt;code&gt;useRef&lt;/code&gt; é importado do módulo &lt;code&gt;react&lt;/code&gt; e o componente &lt;code&gt;GoogleMap&lt;/code&gt; é importado de uma biblioteca de mapas. &lt;br&gt;
2 - A função &lt;code&gt;MyMapComponent&lt;/code&gt; é criada, que renderiza o componente &lt;code&gt;GoogleMap&lt;/code&gt; e um botão. &lt;br&gt;
3 - Dentro da função, é criada uma nova referência usando o hook &lt;code&gt;useRef&lt;/code&gt; e a armazena na variável &lt;code&gt;mapRef&lt;/code&gt;. O argumento inicial &lt;code&gt;null&lt;/code&gt; é passado para a função &lt;code&gt;useRef&lt;/code&gt;. &lt;br&gt;
4 - A referência é passada para o atributo &lt;code&gt;ref&lt;/code&gt; do componente &lt;code&gt;GoogleMap&lt;/code&gt; usando a sintaxe &lt;code&gt;ref={mapRef}&lt;/code&gt;. Isso faz com que a instância do componente seja armazenada na propriedade &lt;code&gt;current&lt;/code&gt; da referência. &lt;br&gt;
5 - A função &lt;code&gt;handleButtonClick&lt;/code&gt; é criada para recentralizar o mapa quando o botão é clicado. Ela usa a propriedade &lt;code&gt;current&lt;/code&gt; da referência &lt;code&gt;mapRef&lt;/code&gt; para acessar o método &lt;code&gt;recenter&lt;/code&gt; do componente de mapa e passa as coordenadas de latitude e longitude como argumento. &lt;br&gt;
6 - O componente &lt;code&gt;GoogleMap&lt;/code&gt; e o botão são renderizados no retorno da função. Quando o botão é clicado, a função &lt;code&gt;handleButtonClick&lt;/code&gt; é chamada e o mapa é recentralizado nas coordenadas especificadas.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. useRef para acessar bilbiotecas de gráficos
&lt;/h3&gt;

&lt;p&gt;O modelo abaixo mostra como usar o hook &lt;code&gt;useRef&lt;/code&gt; para armazenar uma referência a uma instância de um &lt;strong&gt;componente de gráfico&lt;/strong&gt; de terceiros, neste caso o componente &lt;code&gt;Chart&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8uxgay3dhfwe6fyhk1lo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8uxgay3dhfwe6fyhk1lo.png" alt="Image description" width="800" height="840"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1 - O hook &lt;code&gt;useRef&lt;/code&gt; é importado do módulo &lt;code&gt;react&lt;/code&gt; e o componente &lt;code&gt;Chart&lt;/code&gt; é importado de uma biblioteca de gráficos.&lt;br&gt;
2 - A função &lt;code&gt;MyChartComponent&lt;/code&gt; é criada, que renderiza o componente &lt;code&gt;Chart&lt;/code&gt; e um botão. &lt;br&gt;
3 - Dentro da função, é criada uma nova referência usando o hook &lt;code&gt;useRef&lt;/code&gt; e a armazena na variável &lt;code&gt;chartRef&lt;/code&gt;. O argumento inicial &lt;code&gt;null&lt;/code&gt; é passado para a função &lt;code&gt;useRef&lt;/code&gt;. &lt;br&gt;
4 - A referência é passada para o atributo &lt;code&gt;ref&lt;/code&gt; do componente &lt;code&gt;Chart&lt;/code&gt; usando a sintaxe &lt;code&gt;ref={chartRef}&lt;/code&gt;. Isso faz com que a instância do componente seja armazenada na propriedade &lt;code&gt;current&lt;/code&gt; da referência. &lt;br&gt;
5 - A função &lt;code&gt;handleButtonClick&lt;/code&gt; é criada para atualizar os dados do gráfico quando o botão é clicado. Ela usa a propriedade &lt;code&gt;current&lt;/code&gt; da referência &lt;code&gt;chartRef&lt;/code&gt; para acessar o método &lt;code&gt;update&lt;/code&gt; do componente de gráfico e passa um novo conjunto de dados como argumento. &lt;br&gt;
6 - O componente &lt;code&gt;Chart&lt;/code&gt; e o botão são renderizados no retorno da função. Quando o botão é clicado, a função &lt;code&gt;handleButtonClick&lt;/code&gt; é chamada e os dados do gráfico são atualizados com os novos valores.&lt;br&gt;
&lt;br&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  3. Hook useRef para armazenar uma referência a um componente de edição de texto
&lt;/h3&gt;

&lt;p&gt;Ainda, podemos utilizar o &lt;code&gt;useRef&lt;/code&gt; para &lt;strong&gt;armazenar uma referência a uma instância de um componente de edição de texto de terceiros&lt;/strong&gt;, neste caso o componente &lt;code&gt;Quill&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4tpy19h89ailq3mbj8kv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4tpy19h89ailq3mbj8kv.png" alt="Image description" width="800" height="705"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1 - O hook &lt;code&gt;useRef&lt;/code&gt; é importado do módulo &lt;code&gt;react&lt;/code&gt; e o componente &lt;code&gt;Quill&lt;/code&gt; é importado de uma biblioteca de edição de texto. &lt;br&gt;
2 - A função &lt;code&gt;MyEditorComponent&lt;/code&gt; é criada, que renderiza o componente &lt;code&gt;Quill&lt;/code&gt; e um botão. &lt;br&gt;
3 - Dentro da função, é criada uma nova referência usando o hook &lt;code&gt;useRef&lt;/code&gt; e a armazena na variável &lt;code&gt;editorRef&lt;/code&gt;. O argumento inicial &lt;code&gt;null&lt;/code&gt; é passado para a função &lt;code&gt;useRef&lt;/code&gt;. &lt;br&gt;
4 - A referência é passada para o atributo &lt;code&gt;ref&lt;/code&gt; do componente &lt;code&gt;Quill&lt;/code&gt; usando a sintaxe &lt;code&gt;ref={editorRef}&lt;/code&gt;. Isso faz com que a instância do componente seja armazenada na propriedade &lt;code&gt;current&lt;/code&gt; da referência.&lt;br&gt;
5 - A função &lt;code&gt;handleButtonClick&lt;/code&gt; é criada para limpar o conteúdo do editor quando o botão é clicado. Ela usa a propriedade &lt;code&gt;current&lt;/code&gt; da referência &lt;code&gt;editorRef&lt;/code&gt; para acessar o método &lt;code&gt;setText&lt;/code&gt; do componente de edição de texto e passa uma string vazia como argumento. &lt;br&gt;
6 - O componente &lt;code&gt;Quill&lt;/code&gt; e o botão são renderizados no retorno da função.&lt;/p&gt;




&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;p&gt;O &lt;code&gt;useRef&lt;/code&gt; é um hook do React que permite armazenar uma referência a um valor. Ele é útil para armazenar valores que não mudam frequentemente, como referências a elementos do DOM, mas também pode ser usado para armazenar qualquer tipo de valor. O &lt;code&gt;useRef&lt;/code&gt; é um jeito conveniente de acessar elementos do DOM em uma aplicação React e pode ser usado em conjunto com outros hooks, como o &lt;code&gt;useEffect&lt;/code&gt;, para realizar tarefas em resposta a mudanças no estado ou propriedades de um componente. &lt;/p&gt;

&lt;p&gt;Um dos usos mais comuns do &lt;code&gt;useRef&lt;/code&gt; é para acessar valores de elementos do DOM em uma aplicação React. Por exemplo, o &lt;code&gt;useRef&lt;/code&gt; pode ser usado para obter o valor de um campo de entrada em um formulário ou para obter a altura ou largura de um elemento na página. Além disso, o &lt;code&gt;useRef&lt;/code&gt; pode ser usado para armazenar instâncias de objetos de terceiros, como bibliotecas de mapas ou gráficos, e acessar os métodos e propriedades desses objetos.&lt;/p&gt;

&lt;p&gt;A importância do &lt;code&gt;useRef&lt;/code&gt; reside em sua capacidade de fornecer acesso a valores que não são gerenciados pelo estado do React ou pelas props de um componente. Isso é especialmente útil em situações em que você deseja acessar ou alterar valores em resposta a eventos ou mudanças no estado do componente, mas não quer renderizar o componente novamente quando esses valores mudam.&lt;/p&gt;

&lt;p&gt;Portanto, o &lt;code&gt;useRef&lt;/code&gt; é uma ferramenta útil para acessar e armazenar valores em uma aplicação React e pode ser usado em conjunto com outros hooks para realizar tarefas em resposta a mudanças no estado ou propriedades de um componente. Ao usar o &lt;code&gt;useRef&lt;/code&gt;, é importante lembrar de atribuir a referência ao atributo &lt;code&gt;ref&lt;/code&gt; do elemento ao qual você deseja ter acesso e lembrar de usar &lt;code&gt;.current&lt;/code&gt; para acessar o valor armazenado na referência.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://marcelopetry.com" rel="noopener noreferrer"&gt;marcelopetry.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>bitcoin</category>
      <category>cryptocurrency</category>
    </item>
    <item>
      <title>⚛Os 10 React Hooks Mais Úteis: 03 - useContext⚛</title>
      <dc:creator>Marcelo Petry</dc:creator>
      <pubDate>Sat, 24 Dec 2022 03:13:04 +0000</pubDate>
      <link>https://dev.to/mpetry/os-10-react-hooks-mais-uteis-03-usecontext-469f</link>
      <guid>https://dev.to/mpetry/os-10-react-hooks-mais-uteis-03-usecontext-469f</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdyp1oqx4hrtcmssczr0v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdyp1oqx4hrtcmssczr0v.png" alt="Image description" width="800" height="402"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Este é o terceiro artigo de uma série de 10, que explica de forma simplificada e com exemplos, os react hooks mais utilizados em programação.&lt;/em&gt;&lt;br&gt;
&lt;br&gt;&lt;br&gt;
O &lt;code&gt;useContext&lt;/code&gt; é um hook do React que permite acessar o contexto de um componente de forma fácil e simples. Ele é muito útil quando precisamos &lt;strong&gt;compartilhar informações entre componentes&lt;/strong&gt; de forma acessível e sem precisar passar manualmente por todos os componentes intermediários.&lt;br&gt;
Para usar o &lt;code&gt;useContext&lt;/code&gt;, primeiro precisamos criar um contexto. Isso é feito usando a função &lt;code&gt;createContext&lt;/code&gt;:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6hu910w2uiwet992yijf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6hu910w2uiwet992yijf.png" alt="Image description" width="800" height="276"&gt;&lt;/a&gt;&lt;br&gt;
Aqui, criamos um contexto chamado &lt;code&gt;MyContext&lt;/code&gt;. Ele vai nos permitir compartilhar informações entre componentes.&lt;/p&gt;

&lt;p&gt;Em seguida, precisamos fornecer o contexto para os componentes que precisam acessá-lo. Isso é feito usando o componente &lt;code&gt;Provider&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fse9c98uc6c4okypg9t73.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fse9c98uc6c4okypg9t73.png" alt="Image description" width="800" height="739"&gt;&lt;/a&gt;&lt;br&gt;
Agora, estamos passando o objeto &lt;code&gt;value&lt;/code&gt; para o contexto usando o &lt;code&gt;Provider&lt;/code&gt;. Qualquer componente que esteja dentro do &lt;code&gt;Provider&lt;/code&gt; terá acesso ao contexto.&lt;/p&gt;

&lt;p&gt;Para acessar o contexto em um componente, usamos o hook &lt;code&gt;useContext&lt;/code&gt;:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwinl3bln6cmupt4hjkau.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwinl3bln6cmupt4hjkau.png" alt="Image description" width="800" height="429"&gt;&lt;/a&gt;&lt;br&gt;
Nexte exemplo, estamos usando o &lt;code&gt;useContext&lt;/code&gt; para acessar o contexto criado anteriormente. O valor retornado pelo &lt;code&gt;useContext&lt;/code&gt; é o mesmo valor passado para o &lt;code&gt;Provider&lt;/code&gt; (no caso, o objeto &lt;code&gt;value&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Então, o exemplo completo seria:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6cylj5wak69tnj0segpd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6cylj5wak69tnj0segpd.png" alt="Image description" width="800" height="1005"&gt;&lt;/a&gt;&lt;br&gt;
O código acima cria um contexto chamado &lt;code&gt;MyContext&lt;/code&gt; usando a função &lt;code&gt;createContext&lt;/code&gt; do React. Em seguida, o contexto é fornecido para os componentes que precisam acessá-lo usando o componente &lt;code&gt;Provider&lt;/code&gt;. Por fim, o contexto é acessado em um componente usando o hook &lt;code&gt;useContext&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Na função &lt;code&gt;App&lt;/code&gt;, criamos um objeto chamado &lt;code&gt;value&lt;/code&gt; com uma propriedade &lt;code&gt;foo&lt;/code&gt;. Em seguida, passamos o objeto &lt;code&gt;value&lt;/code&gt; para o contexto usando o &lt;code&gt;Provider&lt;/code&gt;. Qualquer componente que esteja dentro do &lt;code&gt;Provider&lt;/code&gt; terá acesso ao contexto. No caso, estamos renderizando um componente chamado &lt;code&gt;MyComponent&lt;/code&gt; dentro do &lt;code&gt;Provider&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Na função &lt;code&gt;MyComponent&lt;/code&gt;, usamos o hook &lt;code&gt;useContext&lt;/code&gt; para acessar o contexto criado anteriormente. O valor retornado pelo &lt;code&gt;useContext&lt;/code&gt; é o mesmo valor passado para o &lt;code&gt;Provider&lt;/code&gt; (no caso, o objeto &lt;code&gt;value&lt;/code&gt;). Em seguida, retornamos um elemento &lt;code&gt;div&lt;/code&gt; com o valor da propriedade &lt;code&gt;foo&lt;/code&gt; do objeto &lt;code&gt;value&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Em resumo, esse código permite compartilhar informações entre componentes de forma acessível e sem precisar passar manualmente por todos os componentes intermediários usando o contexto e o &lt;code&gt;useContext&lt;/code&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Aplicabilidades do useContext
&lt;/h1&gt;



&lt;h2&gt;
  
  
  Compartilhar um tema entre componentes
&lt;/h2&gt;

&lt;p&gt;Imagine que você tem um aplicativo que tem um tema dark e light e você quer permitir que o usuário altere o tema. Você pode criar um contexto chamado &lt;code&gt;ThemeContext&lt;/code&gt; que armazena o tema atual (dark ou light) e uma função para alterar o tema. Em seguida, você pode usar o hook &lt;code&gt;useContext&lt;/code&gt; para ler o valor do contexto e a função para alterar o tema em qualquer componente filho que precisa acessar essas informações. Veja:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjx3k81hpt88xttvqhuby.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjx3k81hpt88xttvqhuby.png" alt="Image description" width="800" height="952"&gt;&lt;/a&gt;&lt;br&gt;
1 - O código começa importando os módulos &lt;code&gt;createContext&lt;/code&gt;, &lt;code&gt;useContext&lt;/code&gt; e &lt;code&gt;useState&lt;/code&gt; do React;&lt;br&gt;
2 - Em seguida, é criado um contexto chamado &lt;code&gt;ThemeContext&lt;/code&gt; usando &lt;code&gt;createContext&lt;/code&gt;;&lt;br&gt;
3 - O componente &lt;code&gt;ThemeProvider&lt;/code&gt; é criado e usa o hook &lt;code&gt;useState&lt;/code&gt; para gerenciar o estado do tema atual (dark ou light). O componente de contexto &lt;code&gt;ThemeContext.Provider&lt;/code&gt; é usado para fornecer o contexto aos componentes filho. O valor do contexto é passado como um prop para o componente de contexto e inclui o tema atual e uma função para alterar o tema;&lt;br&gt;
4 - O componente &lt;code&gt;Child&lt;/code&gt; é criado e usa o hook &lt;code&gt;useContext&lt;/code&gt; para ler o contexto &lt;code&gt;ThemeContext&lt;/code&gt;. O valor do contexto é armazenado nas variáveis &lt;code&gt;​​theme&lt;/code&gt; e &lt;code&gt;setTheme&lt;/code&gt;.&lt;br&gt;
5 - O componente &lt;code&gt;Child&lt;/code&gt; renderiza um parágrafo que exibe o tema atual e um botão que, quando clicado, chama a função &lt;code&gt;setTheme&lt;/code&gt; para alterar o tema para light.&lt;br&gt;
6 - O componente &lt;code&gt;App&lt;/code&gt; é criado e renderiza o componente &lt;code&gt;ThemeProvider&lt;/code&gt;, que por sua vez renderiza o componente &lt;code&gt;Child&lt;/code&gt;. Isso significa que o contexto &lt;code&gt;ThemeContext&lt;/code&gt; está disponível para o componente &lt;code&gt;Child&lt;/code&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Acessar dados do usuário em vários componentes
&lt;/h2&gt;

&lt;p&gt;Outro uso comum do hook &lt;code&gt;useContext&lt;/code&gt; ocorre no caso em que você tem um aplicativo que precisa acessar dados do usuário em vários componentes.&lt;br&gt;
Em vez de passar os dados do usuário como propriedade para cada componente, você pode &lt;strong&gt;usar um contexto para armazenar os dados&lt;/strong&gt; do usuário e usar o hook &lt;code&gt;useContext&lt;/code&gt; para &lt;strong&gt;ler os dados em qualquer componente&lt;/strong&gt; que precisa acessá-los.&lt;br&gt;
Aqui está o código que implementa esse comportamento:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frdobd4nfzwxcwb94ygpi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frdobd4nfzwxcwb94ygpi.png" alt="Image description" width="800" height="910"&gt;&lt;/a&gt;&lt;br&gt;
1 - O código começa importando os módulos &lt;code&gt;createContext&lt;/code&gt; e &lt;code&gt;useContext&lt;/code&gt; do React.&lt;br&gt;
2 - Em seguida, é criado um contexto chamado &lt;code&gt;UserContext&lt;/code&gt; usando &lt;code&gt;createContext&lt;/code&gt;.&lt;br&gt;
3 - O componente &lt;code&gt;Child&lt;/code&gt; é criado e usa o hook useContext para ler o contexto &lt;code&gt;UserContext&lt;/code&gt;. O valor do contexto (no caso, os dados do usuário) é armazenado na variável user.&lt;br&gt;
4 - O componente &lt;code&gt;App&lt;/code&gt; é criado e usa o componente de contexto &lt;code&gt;UserContext.Provider&lt;/code&gt; para fornecer o contexto aos componentes filho.&lt;br&gt;
5 - O valor do contexto é passado como um prop para o componente de contexto. No exemplo, os dados do usuário são passados como o valor do contexto.&lt;br&gt;
6 - O componente &lt;code&gt;Child&lt;/code&gt; é renderizado dentro do componente &lt;code&gt;App&lt;/code&gt;, então o contexto &lt;code&gt;UserContext&lt;/code&gt; está disponível para ele. O componente &lt;code&gt;Child&lt;/code&gt; usa o hook &lt;code&gt;useContext&lt;/code&gt; para ler o contexto e exibe o nome do usuário.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Gerenciamento de idioma
&lt;/h2&gt;

&lt;p&gt;Você pode usar um contexto para armazenar o idioma atual do aplicativo e permitir que os componentes filho acessem e alterem o idioma.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvs12qd16m8gue8aku9pd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvs12qd16m8gue8aku9pd.png" alt="Image description" width="800" height="885"&gt;&lt;/a&gt;&lt;br&gt;
1 - O código começa importando os módulos &lt;code&gt;createContext&lt;/code&gt;, &lt;code&gt;useContext&lt;/code&gt; e &lt;code&gt;useState&lt;/code&gt; do React.&lt;br&gt;
2 - Em seguida, é criado um contexto chamado &lt;code&gt;LanguageContext&lt;/code&gt; usando &lt;code&gt;createContext&lt;/code&gt;.&lt;br&gt;
3 - O componente &lt;code&gt;LanguageProvider&lt;/code&gt; é criado e usa o hook &lt;code&gt;useState&lt;/code&gt; para gerenciar o estado do idioma atual (en ou pt-BR). O componente de contexto &lt;code&gt;LanguageContext&lt;/code&gt;.Provider é usado para fornecer o contexto aos componentes filho. O valor do contexto é passado como um prop para o componente de contexto e inclui o idioma atual e uma função para alterar o idioma.&lt;br&gt;
4 - O componente &lt;code&gt;Child&lt;/code&gt; é criado e usa o hook &lt;code&gt;useContext&lt;/code&gt; para ler o contexto &lt;code&gt;LanguageContext&lt;/code&gt;. O valor do contexto é armazenado nas variáveis ​​language e &lt;code&gt;setLanguage&lt;/code&gt;.&lt;br&gt;
5 - O componente &lt;code&gt;Child&lt;/code&gt; renderiza um parágrafo que exibe o idioma atual e um botão que, quando clicado, chama a função &lt;code&gt;setLanguage&lt;/code&gt; para alterar o idioma para pt-BR.&lt;br&gt;
6 - O componente &lt;code&gt;App&lt;/code&gt; é criado e renderiza o componente &lt;code&gt;LanguageProvider&lt;/code&gt;, que por sua vez renderiza o componente &lt;code&gt;Child&lt;/code&gt;. Isso significa que o contexto &lt;code&gt;LanguageContext&lt;/code&gt; está disponível para o componente &lt;code&gt;Child&lt;/code&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Hook useContext em autenticação
&lt;/h2&gt;

&lt;p&gt;Você pode usar um contexto para armazenar o status de autenticação do usuário e permitir que os componentes filho acessem e alterem o status de autenticação. Acompanhe:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxowdbo2j1ay8gy5b4hro.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxowdbo2j1ay8gy5b4hro.png" alt="Image description" width="800" height="929"&gt;&lt;/a&gt;&lt;br&gt;
Neste código, o contexto &lt;code&gt;AuthContext&lt;/code&gt; é criado usando &lt;code&gt;createContext&lt;/code&gt;. &lt;br&gt;
1 - O componente &lt;code&gt;AuthProvider&lt;/code&gt; usa o hook &lt;code&gt;useState&lt;/code&gt; para gerenciar o estado de autenticação do usuário (autenticado ou não). &lt;br&gt;
2 - O componente de contexto &lt;code&gt;AuthContext.Provider&lt;/code&gt; é usado para fornecer o contexto aos componentes filho e passa o status de autenticação atual e uma função para alterar o status de autenticação como o valor do contexto. &lt;br&gt;
3 - O componente &lt;code&gt;Child&lt;/code&gt; usa o hook &lt;code&gt;useContext&lt;/code&gt; para ler o contexto e exibe o status de autenticação atual. &lt;br&gt;
4 - O componente &lt;code&gt;Child&lt;/code&gt; também renderiza um botão que, quando clicado, chama a função &lt;code&gt;setIsAuthenticated&lt;/code&gt; para alterar o status de autenticação para true. &lt;br&gt;
5 - O componente &lt;code&gt;App&lt;/code&gt; usa o componente de contexto &lt;code&gt;AuthProvider&lt;/code&gt; para fornecer o contexto aos componentes filho e renderiza o componente &lt;code&gt;Child&lt;/code&gt;. Dessa forma, o componente &lt;code&gt;Child&lt;/code&gt; pode ler o status de autenticação a partir do contexto e alterá-lo quando necessário.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;p&gt;O hook &lt;code&gt;useContext&lt;/code&gt; é uma ferramenta útil para compartilhar dados entre componentes no React sem ter que passar manualmente esses dados como props a cada nível de componente. &lt;br&gt;
Ao criar um contexto com &lt;code&gt;createContext&lt;/code&gt;, é possível fornecer o contexto aos componentes filho usando o componente de contexto &lt;code&gt;Context.Provider&lt;/code&gt; e ler o contexto em qualquer componente filho usando o hook &lt;code&gt;useContext&lt;/code&gt;. Isso pode ser útil para gerenciar o estado de aplicativos de forma mais eficiente e simplificar a propagação de dados em aplicativos de grande escala. &lt;br&gt;
No entanto, é importante lembrar de usar o &lt;code&gt;useContext&lt;/code&gt; de maneira apropriada para evitar problemas de performance e manter o código organizado e fácil de manter.&lt;/p&gt;




&lt;p&gt;Autor: Marcelo Schäffer Petry&lt;br&gt;
&lt;a href="https://marcelopetry.com" rel="noopener noreferrer"&gt;marcelopetry.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
    </item>
    <item>
      <title>⚛Os 10 React Hooks Mais Úteis: 02 - useEffect⚛</title>
      <dc:creator>Marcelo Petry</dc:creator>
      <pubDate>Thu, 22 Dec 2022 22:00:06 +0000</pubDate>
      <link>https://dev.to/mpetry/os-10-react-hooks-mais-uteis-02-useeffect-34di</link>
      <guid>https://dev.to/mpetry/os-10-react-hooks-mais-uteis-02-useeffect-34di</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--B5V6ceXn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/94oqa1al2uq9k5hqtxz9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B5V6ceXn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/94oqa1al2uq9k5hqtxz9.jpg" alt="Image description" width="880" height="440"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Este é o &lt;strong&gt;segundo&lt;/strong&gt; artigo de uma série de 10, que explica de forma simplificada e com exemplos, os &lt;strong&gt;react hooks mais utilizados&lt;/strong&gt; em programação.&lt;/em&gt;&lt;br&gt;
&lt;br&gt;&lt;br&gt;
O hook &lt;code&gt;useEffect&lt;/code&gt; permite que você execute &lt;strong&gt;efeitos secundários&lt;/strong&gt; em componentes de função em React. Isso inclui coisas como modificar o DOM, fazer solicitações HTTP ou adicionar &lt;em&gt;&lt;a href="https://www.freecodecamp.org/news/javascript-addeventlistener-example-code/"&gt;event listeners&lt;/a&gt;&lt;/em&gt;. O &lt;code&gt;useEffect&lt;/code&gt; é chamado após a renderização do componente e pode ser usado para substituir a maioria dos métodos de ciclo de vida como &lt;code&gt;componentDidMount&lt;/code&gt;, &lt;code&gt;componentDidUpdate&lt;/code&gt; e &lt;code&gt;componentWillUnmount&lt;/code&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Empregos do hook useEffect
&lt;/h1&gt;

&lt;p&gt;Aqui está um exemplo básico de como o useEffect pode ser usado para exibir uma mensagem no console quando o componente é montado:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gu7Q9V27--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k4xlfauieiezuur6gpmy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gu7Q9V27--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k4xlfauieiezuur6gpmy.png" alt="Image description" width="880" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neste exemplo, o &lt;code&gt;useEffect&lt;/code&gt; é chamado após a renderização inicial do componente e exibe a mensagem no console. O array vazio de dependências garante que este efeito seja executado apenas uma vez, assim como o método &lt;code&gt;componentDidMount&lt;/code&gt; em um componente de classe.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  useEffect em &lt;em&gt;Event Listeners&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Este hook pode ser usado para adicionar um &lt;em&gt;event listener&lt;/em&gt; ao clique de um botão:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gQkYjBxX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sl0ebuzzj2ljf2wjf2v7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gQkYjBxX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sl0ebuzzj2ljf2wjf2v7.png" alt="Image description" width="880" height="946"&gt;&lt;/a&gt;&lt;br&gt;
No caso acima, o hook &lt;code&gt;useEffect&lt;/code&gt; é usado para adicionar um &lt;em&gt;event listener&lt;/em&gt; de clique ao botão quando o componente é montado. Quando o componente é desmontado, o &lt;em&gt;listener&lt;/em&gt; é removido usando a função de retorno fornecida pelo &lt;code&gt;useEffect&lt;/code&gt;. O array vazio de dependências garante que este efeito seja executado apenas uma vez, assim como o &lt;code&gt;componentDidMount&lt;/code&gt; em um componente de classe.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Hook useEffect para Solicitações HTTP
&lt;/h3&gt;

&lt;p&gt;Também, pode ser usado para fazer uma solicitação HTTP e atualizar o estado com a resposta. Acompanhe:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--u7Y0C6HL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/axb0yc3i0hr9o828r01f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u7Y0C6HL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/axb0yc3i0hr9o828r01f.png" alt="Image description" width="880" height="911"&gt;&lt;/a&gt;&lt;br&gt;
No exemplo acima, o hook &lt;code&gt;useEffect&lt;/code&gt; é usado para fazer uma solicitação HTTP para a rota &lt;code&gt;/api/users&lt;/code&gt; quando o componente é montado e atualizar o estado com a resposta.&lt;/p&gt;

&lt;p&gt;O hook &lt;code&gt;useState&lt;/code&gt; é usado para gerenciar o estado dos usuários no componente. O primeiro argumento é um array de usuários inicialmente vazio e o segundo é uma função para atualizar o estado.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;useEffect&lt;/code&gt; é chamado com uma função que realiza a solicitação HTTP usando o &lt;code&gt;fetch&lt;/code&gt; e um array vazio de dependências. Isso garante que o efeito seja executado apenas uma vez, assim como o método &lt;code&gt;componentDidMount&lt;/code&gt; em um componente de classe.&lt;/p&gt;

&lt;p&gt;Quando a resposta é recebida, o hook &lt;code&gt;useState&lt;/code&gt; é usado para atualizar o estado com a lista de usuários. Isso atualiza o componente e a lista de usuários é exibida na tela.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Emprego em Redimensionamento de Janelas
&lt;/h3&gt;

&lt;p&gt;Outra forma, é a partir de &lt;em&gt;event listeners&lt;/em&gt; para redimensionamento de janelas. Veja:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6hd7NO_A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rjihidve37655zfeyife.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6hd7NO_A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rjihidve37655zfeyife.png" alt="Image description" width="880" height="776"&gt;&lt;/a&gt;&lt;br&gt;
Neste exemplo, o hook &lt;code&gt;useEffect&lt;/code&gt; é usado para adicionar um &lt;em&gt;event listener&lt;/em&gt; de redimensionamento da janela quando o componente é montado. Quando o componente é desmontado, o &lt;em&gt;listener&lt;/em&gt; é removido usando a função de retorno fornecida pelo &lt;code&gt;useEffect&lt;/code&gt;. O array vazio de dependências (&lt;code&gt;[]&lt;/code&gt;) garante que este efeito seja executado apenas uma vez.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Atualizar Título da Página com useEffect
&lt;/h3&gt;

&lt;p&gt;Este hook pode ser utilizado para atualizar o título da página com o &lt;strong&gt;nome do usuário atual&lt;/strong&gt;:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--B0p-is1y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/949o6nqtd1g41xd8lwkf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B0p-is1y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/949o6nqtd1g41xd8lwkf.png" alt="Image description" width="880" height="880"&gt;&lt;/a&gt;&lt;br&gt;
Desta vez, o hook &lt;code&gt;useEffect&lt;/code&gt; é usado para atualizar o título da página com o nome do usuário atual sempre que o usuário for alterado. O array de dependências (&lt;code&gt;[user]&lt;/code&gt;) garante que este efeito seja executado sempre que o usuário for alterado, &lt;strong&gt;mas não seja executado na primeira renderização&lt;/strong&gt; do componente.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Alternar Classes de Estilo Dark/Light Mode
&lt;/h3&gt;

&lt;p&gt;Outra importante aplicabilidade do hook &lt;code&gt;useEffect&lt;/code&gt; é na &lt;strong&gt;alternância entre classes de estilo&lt;/strong&gt; no corpo da página com base em uma propriedade de estado:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_Xjgs1o_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/annxq24gtqoy9ajd5x7k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_Xjgs1o_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/annxq24gtqoy9ajd5x7k.png" alt="Image description" width="880" height="880"&gt;&lt;/a&gt;&lt;br&gt;
Nesse caso, o hook &lt;code&gt;useEffect&lt;/code&gt; é usado para adicionar ou remover a classe &lt;code&gt;dark-mode&lt;/code&gt; do corpo da página com base na propriedade de estado &lt;code&gt;isDarkMode&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O hook &lt;code&gt;useState&lt;/code&gt; é usado para gerenciar o estado do modo escuro no componente. O primeiro argumento é um valor booleano inicialmente falso que indica se o modo escuro está ativado ou não e o segundo é uma função para atualizar o estado.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;useEffect&lt;/code&gt; é chamado com uma função que verifica o valor de &lt;code&gt;isDarkMode&lt;/code&gt; e adiciona ou remove a classe &lt;code&gt;dark-mode&lt;/code&gt; do corpo da página, e um array de dependências que inclui apenas &lt;code&gt;isDarkMode&lt;/code&gt;. Isso garante que o efeito seja executado sempre que o modo escuro for alterado, mas não seja executado na primeira renderização do componente.&lt;/p&gt;

&lt;p&gt;O componente exibe um botão com o texto "Alternar modo escuro". Quando o botão é clicado, a função de retorno do &lt;code&gt;useState&lt;/code&gt; é chamada para alternar o valor de &lt;code&gt;isDarkMode&lt;/code&gt; entre &lt;em&gt;true e false&lt;/em&gt;, o que aciona o &lt;code&gt;useEffect&lt;/code&gt; e adiciona ou remove a classe &lt;code&gt;dark-mode&lt;/code&gt; do corpo da página.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;p&gt;O &lt;code&gt;useEffect&lt;/code&gt; é um dos hooks mais importantes do React e é muito útil para realizar efeitos colaterais em componentes de função. Ele é chamado após a renderização do componente e pode ser usado para substituir a maioria dos métodos de ciclo de vida.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;useEffect&lt;/code&gt; é flexível e pode ser usado para uma variedade de tarefas, incluindo &lt;strong&gt;modificar o DOM&lt;/strong&gt;, &lt;strong&gt;fazer solicitações HTTP&lt;/strong&gt; ou interagir com &lt;em&gt;event listeners&lt;/em&gt;. Ele também pode ser usado para atualizar o estado de um componente com base em alterações externas, como mudanças no tamanho da janela ou no título da página.&lt;/p&gt;

&lt;p&gt;É importante lembrar de &lt;strong&gt;passar um array de dependências&lt;/strong&gt; para o &lt;code&gt;useEffect&lt;/code&gt; para garantir que ele seja executado apenas quando as variáveis especificadas mudam. Isso pode ajudar a evitar efeitos colaterais indesejados e melhorar o desempenho do seu aplicativo.&lt;br&gt;
Em suma, o hook &lt;code&gt;useEffect&lt;/code&gt; é uma ferramenta poderosa e versátil para gerenciar efeitos colaterais em componentes de função do React e é uma parte essencial da biblioteca de hooks do React.&lt;/p&gt;




&lt;p&gt;Autor: Marcelo Schäffer Petry&lt;br&gt;
&lt;a href="https://marcelopetry.com"&gt;marcelopetry.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Como Usar o Spread Operator (…) em React ⚛</title>
      <dc:creator>Marcelo Petry</dc:creator>
      <pubDate>Wed, 21 Dec 2022 22:29:51 +0000</pubDate>
      <link>https://dev.to/mpetry/como-usar-o-spread-operator-em-react-22jb</link>
      <guid>https://dev.to/mpetry/como-usar-o-spread-operator-em-react-22jb</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx2lhunf9wu0233v5fcm2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx2lhunf9wu0233v5fcm2.jpg" alt="Ilustração Programming" width="800" height="498"&gt;&lt;/a&gt;&lt;br&gt;
O operador de espalhamento (&lt;code&gt;spread operator&lt;/code&gt;) é um recurso do JavaScript que permite que um objeto iterável, como um &lt;em&gt;array&lt;/em&gt; ou uma string, seja &lt;strong&gt;expandido em vários elementos individuais&lt;/strong&gt;. Ele é representado por três pontos seguidos (&lt;code&gt;...&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ophnhctnq5iitzbj4lf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ophnhctnq5iitzbj4lf.png" alt="Image description" width="800" height="362"&gt;&lt;/a&gt;&lt;br&gt;
O operador de espalhamento também pode ser usado em objetos literais para &lt;strong&gt;copiar as propriedades&lt;/strong&gt; de um objeto para outro:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmdfr4ygk1qylrtt3cpw0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmdfr4ygk1qylrtt3cpw0.png" alt="Image description" width="800" height="306"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Aplicabilidades do Spread Operator em React
&lt;/h1&gt;

&lt;p&gt;No React, o operador de espalhamento (&lt;code&gt;...&lt;/code&gt;) é frequentemente usado para passar propriedades &lt;strong&gt;de um componente pai para um componente filho&lt;/strong&gt;. Por exemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1qkc403okhqh2ja0zjrj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1qkc403okhqh2ja0zjrj.png" alt="Image description" width="800" height="283"&gt;&lt;/a&gt;&lt;br&gt;
Isso permite que todas as propriedades passadas para &lt;code&gt;MyComponent&lt;/code&gt; sejam passadas para &lt;code&gt;OtherComponent&lt;/code&gt; sem precisar especificar cada uma delas individualmente.&lt;/p&gt;

&lt;p&gt;Outro uso comum do operador de espalhamento no React é ao trabalhar com &lt;strong&gt;estado imutável&lt;/strong&gt;. Por exemplo, digamos que você tenha um estado de objeto com uma propriedade chamada “items” que é um array de itens. Se você quiser adicionar um novo item a esse array, em vez de modificar o array original, é possível criar uma cópia do array e adicionar o novo item a ela usando o operador de espalhamento.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fop4sstsuvu5l9r790e48.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fop4sstsuvu5l9r790e48.png" alt="Image description" width="800" height="603"&gt;&lt;/a&gt;&lt;br&gt;
Aqui, a cópia do array de itens é criada usando o operador de espalhamento e o novo item é adicionado a ela com o operador de concatenação (&lt;code&gt;[...this.state.items, 4]&lt;/code&gt;). Depois, o novo array é passado para o método setState para atualizar o estado. Dessa forma, o estado original não é modificado, o que é importante no React, já que o estado deve ser imutável.&lt;/p&gt;

&lt;p&gt;Além disso, o operador de espalhamento também pode ser usado para passar um número variável de argumentos para uma função. Por exemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8w4eeh8dufvktzgw2gs1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8w4eeh8dufvktzgw2gs1.png" alt="Image description" width="800" height="519"&gt;&lt;/a&gt;&lt;br&gt;
Neste exemplo, o array de números é expandido em três argumentos individuais usando o operador de espalhamento e então passado para a função &lt;code&gt;sum&lt;/code&gt;. O resultado é o mesmo que se tivéssemos chamado a função como &lt;code&gt;sum(1, 2, 3)&lt;/code&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Atualizar propriedades de um objeto:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe6fzetvlqgdxxl3oof94.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe6fzetvlqgdxxl3oof94.png" alt="Image description" width="800" height="463"&gt;&lt;/a&gt;&lt;br&gt;
No exemplo acima, o estado do componente inclui um objeto chamado “user” com duas propriedades: “name” e “age”. O método &lt;code&gt;updateUser&lt;/code&gt; atualiza a propriedade "age" do objeto usando o operador de espalhamento para copiar as propriedades existentes do objeto e adicionar a nova propriedade "age".&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Clonar um componente e passar propriedades personalizadas para ele:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fulx8r3fk9vnd1s1br8kc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fulx8r3fk9vnd1s1br8kc.png" alt="Image description" width="800" height="476"&gt;&lt;/a&gt;&lt;br&gt;
Aqui, o componente &lt;code&gt;MyButton&lt;/code&gt; é um componente de botão genérico que aceita qualquer conteúdo como filhos e uma função de retorno de chamada para a propriedade &lt;code&gt;onClick&lt;/code&gt;. O componente &lt;code&gt;App&lt;/code&gt; clona o componente &lt;code&gt;MyButton&lt;/code&gt; e passa uma nova função de retorno de chamada para a propriedade &lt;code&gt;onClick&lt;/code&gt; usando o operador de espalhamento.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Passar todas as propriedades de um componente para outro componente:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fklkwfrtyrsqezxp3q017.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fklkwfrtyrsqezxp3q017.png" alt="Image description" width="800" height="283"&gt;&lt;/a&gt;&lt;br&gt;
Neste exemplo, o componente &lt;code&gt;MyComponent&lt;/code&gt; recebe propriedades e as passa para o componente &lt;code&gt;OtherComponent&lt;/code&gt; usando o operador de espalhamento. Isso permite que qualquer propriedade passada para &lt;code&gt;MyComponent&lt;/code&gt; seja passada para &lt;code&gt;OtherComponent&lt;/code&gt; sem precisar especificar cada uma delas individualmente.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Unir dois arrays:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmstldmtdmep4skllp2pw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmstldmtdmep4skllp2pw.png" alt="Image description" width="800" height="362"&gt;&lt;/a&gt;&lt;br&gt;
Este exemplo mostra como usar o operador de espalhamento para unir dois arrays em um único array. O array &lt;code&gt;arr1&lt;/code&gt; e o array &lt;code&gt;arr2&lt;/code&gt; são expandidos em elementos individuais usando o operador de espalhamento e então concatenados usando o operador de concatenação (&lt;code&gt;[...]&lt;/code&gt;).&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Passar um número variável de argumentos para uma função:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcxvnonuusi4e4yjiivrd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcxvnonuusi4e4yjiivrd.png" alt="Image description" width="800" height="519"&gt;&lt;/a&gt;&lt;br&gt;
Neste exemplo, a função &lt;code&gt;sum&lt;/code&gt; espera três argumentos (&lt;code&gt;x, y, e z&lt;/code&gt;) e retorna a soma deles. O array de números é expandido em três argumentos individuais usando o operador de espalhamento e então passado para a função &lt;code&gt;sum&lt;/code&gt;. O resultado é o mesmo que se tivéssemos chamado a função como &lt;code&gt;sum(1, 2, 3)&lt;/code&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O operador de espalhamento (spread operator) é uma ferramenta poderosa do JavaScript que permite &lt;strong&gt;expandir objetos iteráveis&lt;/strong&gt; em elementos individuais ou &lt;strong&gt;copiar propriedades&lt;/strong&gt; de um objeto para outro. No React, o operador de espalhamento é amplamente utilizado para &lt;strong&gt;passar propriedades&lt;/strong&gt; de um componente pai para um componente filho, &lt;strong&gt;atualizar estado imutável&lt;/strong&gt;, &lt;strong&gt;clonar componentes&lt;/strong&gt; e passar propriedades personalizadas para eles, e &lt;strong&gt;passar um número variável de argumentos&lt;/strong&gt; para uma função.&lt;/p&gt;

&lt;p&gt;Usar o operador de espalhamento pode tornar o código mais conciso e legível, além de facilitar a manipulação de dados. No entanto, é importante lembrar que o operador de espalhamento também pode ter algumas limitações, como a incapacidade de clonar objetos profundamente aninhados ou a possibilidade de sobrescrever propriedades existentes se o objeto de espalhamento vier depois do objeto de destino.&lt;/p&gt;

&lt;p&gt;Em resumo, o operador de espalhamento é uma ferramenta valiosa no React e em outras situações do JavaScript que pode ajudar a escrever código mais eficiente e legível. É importante entender como ele funciona e quando usá-lo para aproveitar ao máximo seus benefícios.&lt;/p&gt;




&lt;p&gt;Autor: Marcelo Schäffer Petry&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marcelopetry.com" rel="noopener noreferrer"&gt;marcelopetry.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gratitude</category>
    </item>
    <item>
      <title>⚛Os 10 React Hooks Mais Úteis: 01 - useState⚛</title>
      <dc:creator>Marcelo Petry</dc:creator>
      <pubDate>Wed, 21 Dec 2022 14:18:31 +0000</pubDate>
      <link>https://dev.to/mpetry/os-10-react-hooks-mais-uteis-01-usestate-2c6n</link>
      <guid>https://dev.to/mpetry/os-10-react-hooks-mais-uteis-01-usestate-2c6n</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VQIfZnmN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uekatz55tbz5qd6n6cxy.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VQIfZnmN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uekatz55tbz5qd6n6cxy.jpg" alt="Image description" width="880" height="587"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Este é o primeiro artigo de uma série de 10, que explica de forma simplificada e com exemplos, os &lt;strong&gt;react hooks mais utilizados&lt;/strong&gt; em programação.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;O Hook &lt;code&gt;useState&lt;/code&gt; é um dos Hooks mais importantes e mais usados no React. Ele permite que você gerencie o estado em componentes funcionais de forma semelhante a como faria em componentes de classe.&lt;/p&gt;

&lt;p&gt;Aqui está um exemplo básico de como usar o &lt;code&gt;useState&lt;/code&gt; para gerenciar o estado de um componente funcional:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HS3Z2j5u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/59yy3bw6re3rmu7xmd7b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HS3Z2j5u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/59yy3bw6re3rmu7xmd7b.png" alt="Image description" width="880" height="539"&gt;&lt;/a&gt;&lt;br&gt;
Neste exemplo, estamos usando o &lt;code&gt;useState&lt;/code&gt; para gerenciar o estado de um contador. Quando o usuário clica no botão, a função &lt;code&gt;setCount&lt;/code&gt; é chamada para atualizar o valor de count. O &lt;code&gt;useState&lt;/code&gt; retorna um par de valores: o &lt;strong&gt;estado atual&lt;/strong&gt; e uma &lt;strong&gt;função&lt;/strong&gt; para atualizá-lo.&lt;/p&gt;

&lt;p&gt;O valor inicial de &lt;code&gt;count&lt;/code&gt; é definido como 0 quando chamamos o &lt;code&gt;useState&lt;/code&gt;. Você pode passar qualquer valor que desejar como o &lt;strong&gt;valor inicial&lt;/strong&gt; para o estado. Por exemplo, se quisermos começar o contador com um valor de 10, poderíamos fazer isso assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DiXdCIW_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m61l43wzo96gxjhxsfv3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DiXdCIW_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m61l43wzo96gxjhxsfv3.png" alt="Image description" width="880" height="231"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Gerenciamento de Objetos e Arrays
&lt;/h2&gt;

&lt;p&gt;O &lt;code&gt;useState&lt;/code&gt; também pode ser usado para gerenciar o estado de outros tipos de valores, como &lt;strong&gt;objetos&lt;/strong&gt; ou &lt;strong&gt;arrays&lt;/strong&gt;. Aqui está um exemplo de como usar o useState para gerenciar o estado de um objeto:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YMhLw7y7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m3tewhw77ujeby4i4pwb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YMhLw7y7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m3tewhw77ujeby4i4pwb.png" alt="Image description" width="880" height="675"&gt;&lt;/a&gt;&lt;br&gt;
Neste exemplo, estamos usando o &lt;code&gt;useState&lt;/code&gt; para gerenciar o estado de um objeto que representa um usuário. Quando o usuário clica no botão, a função setUser é chamada para atualizar o valor de &lt;code&gt;user&lt;/code&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Hook useState em Formulários
&lt;/h2&gt;

&lt;p&gt;Outra aplicabilidade do &lt;code&gt;useState&lt;/code&gt; é quando precisamos gerenciar o estado de um formulário com &lt;strong&gt;nome, e-mail e senha&lt;/strong&gt;. Veja:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--T_zu7jrs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3aqj0mkhjzdx6f3acrye.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--T_zu7jrs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3aqj0mkhjzdx6f3acrye.png" alt="Image description" width="880" height="2224"&gt;&lt;/a&gt;&lt;br&gt;
Neste exemplo, estamos usando o &lt;code&gt;useState&lt;/code&gt; para gerenciar o estado de um formulário. O estado é um &lt;strong&gt;objeto&lt;/strong&gt; que contém os valores dos campos de formulário. Quando o usuário altera um campo, chamamos a função &lt;code&gt;handleChange&lt;/code&gt; para atualizar o valor correspondente no estado.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Gerenciamento do Estado de Toggle
&lt;/h2&gt;

&lt;p&gt;Outro uso comum do &lt;code&gt;useState&lt;/code&gt; ocorre quando queremos gerenciar o estado de um &lt;strong&gt;toggle&lt;/strong&gt;:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QYG8rJIa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qwm2kui8gwnsipttimgp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QYG8rJIa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qwm2kui8gwnsipttimgp.png" alt="Image description" width="880" height="741"&gt;&lt;/a&gt;&lt;br&gt;
No exemplo acima, estamos usando o &lt;code&gt;useState&lt;/code&gt; para gerenciar o estado de um toggle. Quando o usuário clica no botão, chamamos a função &lt;code&gt;setIsOn&lt;/code&gt; para inverter o valor de &lt;code&gt;isOn&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;useState&lt;/code&gt; é inicializado com o valor &lt;code&gt;false&lt;/code&gt;, que representa o estado "off" do toggle. Quando o usuário clica no botão, chamamos a função &lt;code&gt;setIsOn&lt;/code&gt; com o operador de negação &lt;code&gt;!&lt;/code&gt;, o que inverte o valor de &lt;code&gt;isOn&lt;/code&gt; de &lt;code&gt;false&lt;/code&gt; para &lt;code&gt;true&lt;/code&gt; ou de &lt;code&gt;true&lt;/code&gt; para &lt;code&gt;false&lt;/code&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Hook useState para Gerenciar Listas
&lt;/h2&gt;

&lt;p&gt;Também, emprega-se o hook &lt;code&gt;useState&lt;/code&gt; para gerenciar o estado de uma lista de itens expansíveis:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7VH6T6Wx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4s6x717a53b04pt8ngpi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7VH6T6Wx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4s6x717a53b04pt8ngpi.png" alt="Image description" width="880" height="1240"&gt;&lt;/a&gt;&lt;br&gt;
Neste exemplo, estamos usando o &lt;code&gt;useState&lt;/code&gt; para gerenciar o estado de uma lista de itens expansíveis. O estado é um &lt;strong&gt;array de objetos&lt;/strong&gt; que representam cada item, com um texto e um indicador de se o item está expandido ou não.&lt;/p&gt;

&lt;p&gt;Quando o usuário clica em um item, chamamos a função &lt;code&gt;toggleExpanded&lt;/code&gt; para alternar o estado de expansão do item. Para fazer isso, criamos uma cópia do array de itens usando a sintaxe de propagação (&lt;code&gt;...&lt;/code&gt;), alteramos o valor do indicador de expansão do item correspondente e chamamos a função &lt;code&gt;setItems&lt;/code&gt; para atualizar o estado.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Gerenciamento de Carrinho de Compras
&lt;/h2&gt;

&lt;p&gt;Ainda, o &lt;code&gt;useState&lt;/code&gt; pode ser aplicado no gerenciamento de um carrinho de compras. Acompanhe:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KXIseIXw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5wco2cjhmwbv9briqjmv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KXIseIXw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5wco2cjhmwbv9briqjmv.png" alt="Image description" width="880" height="1304"&gt;&lt;/a&gt;&lt;br&gt;
No exemplo, a primeira coisa que fazemos é importar o hook &lt;code&gt;useState&lt;/code&gt; do React. Em seguida, criamos uma função chamada &lt;code&gt;Example&lt;/code&gt; que renderiza um componente.&lt;/p&gt;

&lt;p&gt;Dentro da função &lt;code&gt;Example&lt;/code&gt;, usamos o hook &lt;code&gt;useState&lt;/code&gt; para inicializar o estado do carrinho como um array vazio. Isso é feito através da seguinte linha de código:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IKbZMK5a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nybf43bvwg97vdl6auaa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IKbZMK5a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nybf43bvwg97vdl6auaa.png" alt="Image description" width="880" height="242"&gt;&lt;/a&gt;&lt;br&gt;
O hook &lt;code&gt;useState&lt;/code&gt; retorna um par de valores: o estado atual e uma função para atualizar o estado. No caso do estado do carrinho, chamamos esses valores de &lt;code&gt;cart&lt;/code&gt; e &lt;code&gt;setCart&lt;/code&gt;, respectivamente.&lt;/p&gt;

&lt;p&gt;Em seguida, criamos duas funções: &lt;code&gt;addToCart&lt;/code&gt; e &lt;code&gt;removeFromCart&lt;/code&gt;. A função &lt;code&gt;addToCart&lt;/code&gt; é chamada quando o usuário clica em um dos botões "Adicionar Item" e adiciona um novo item ao carrinho usando a sintaxe de propagação (&lt;code&gt;...&lt;/code&gt;). A função &lt;code&gt;removeFromCart&lt;/code&gt; é chamada quando o usuário clica no botão "Remover do carrinho" e remove o item do carrinho usando o método &lt;code&gt;filter&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Por fim, renderizamos o componente. Primeiro, mostramos os itens no carrinho usando um loop &lt;code&gt;map&lt;/code&gt; e um botão para remover cada item. Em seguida, mostramos os itens disponíveis para adicionar ao carrinho usando três botões. Quando o usuário clica em um desses botões, chamamos a função &lt;code&gt;addToCart&lt;/code&gt; para adicionar o item ao carrinho.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O hook &lt;code&gt;useState&lt;/code&gt; é um dos hooks mais importantes e amplamente utilizados em React, pois permite que você gerencie o estado de seu componente de maneira &lt;strong&gt;simples e declarativa&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Com o &lt;code&gt;useState&lt;/code&gt;, é possível armazenar &lt;strong&gt;qualquer tipo de valor&lt;/strong&gt; como estado, como &lt;strong&gt;números&lt;/strong&gt;, &lt;strong&gt;strings&lt;/strong&gt;, &lt;strong&gt;objetos&lt;/strong&gt; ou &lt;strong&gt;arrays&lt;/strong&gt;, e atualizar esse estado com facilidade usando a função &lt;code&gt;setState&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O uso do &lt;code&gt;useState&lt;/code&gt; é fundamental para construir aplicativos interativos com React, pois permite que você crie componentes que possam reagir a ações do usuário, como cliques em botões ou mudanças em formulários, e atualizar o estado de acordo.&lt;/p&gt;

&lt;p&gt;Além disso, o &lt;code&gt;useState&lt;/code&gt; é muito útil para &lt;strong&gt;separar o estado lógico&lt;/strong&gt; do seu componente &lt;strong&gt;da lógica de renderização&lt;/strong&gt;, o que torna o código mais &lt;strong&gt;fácil de entender&lt;/strong&gt; e &lt;strong&gt;manter&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Em resumo, o &lt;code&gt;useState&lt;/code&gt; é uma ferramenta fundamental para qualquer desenvolvedor React que busca criar aplicativos interativos e reutilizáveis.&lt;/p&gt;




&lt;p&gt;Autor: Marcelo Schäffer Petry&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marcelopetry.com"&gt;marcelopetry.com&lt;/a&gt;&lt;/p&gt;

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