<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Aryanne Silva</title>
    <description>The latest articles on Forem by Aryanne Silva (@aryanneas).</description>
    <link>https://forem.com/aryanneas</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%2F333265%2F562fa64e-85bb-4160-8c02-692110c26a74.jpeg</url>
      <title>Forem: Aryanne Silva</title>
      <link>https://forem.com/aryanneas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/aryanneas"/>
    <language>en</language>
    <item>
      <title>Design Patterns: como eles se aplicam no React</title>
      <dc:creator>Aryanne Silva</dc:creator>
      <pubDate>Fri, 22 Mar 2024 11:18:19 +0000</pubDate>
      <link>https://forem.com/womakerscode/design-patterns-como-eles-se-aplicam-no-react-1118</link>
      <guid>https://forem.com/womakerscode/design-patterns-como-eles-se-aplicam-no-react-1118</guid>
      <description>&lt;p&gt;Você já deve ter ouvido falar sobre Design Patterns (“padrões de projeto”, em português) . Mas você sabe o que eles são? E o que são React Patterns e como eles se aplicam?&lt;/p&gt;

&lt;h2&gt;
  
  
  Primeiramente, o que são Design Patterns?
&lt;/h2&gt;

&lt;p&gt;Design Patterns são soluções generalistas para problemas recorrentes durante o desenvolvimento de um software. Não se trata de um framework ou um código pronto, mas de uma definição de alto nível de como um problema comum pode ser solucionado. Para melhor aproveitamento do conteúdo neste artigo, sugiro que &lt;a href="https://www.opus-software.com.br/insights/design-patterns/" rel="noopener noreferrer"&gt;aprofunde seus conhecimentos sobre o termo.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Como o conceito pode ser aplicado ao React?
&lt;/h2&gt;

&lt;p&gt;Para quem ainda não está familiarizado, o &lt;a href="https://pt-br.legacy.reactjs.org/" rel="noopener noreferrer"&gt;React&lt;/a&gt; é uma biblioteca front-end que utiliza a linguagem de programação JavaScript e tem como um de seus objetivos facilitar a conexão entre diferentes partes de uma página, portanto seu funcionamento acontece através do que chamamos de componentes.&lt;/p&gt;

&lt;p&gt;Esses componentes são escritos utilizando JSX que, a grosso modo, é uma linguagem desenvolvida como uma mistura de HTML e JS. Seu objetivo é ser transposta para JS da maneira mais simplificada possível.&lt;/p&gt;

&lt;p&gt;Seguindo pela explicação do tópico acima, &lt;em&gt;React Patterns&lt;/em&gt; nada mais são do que a aplicação de um padrão (como o próprio nome já diz) na escrita dos seus componentes React!&lt;/p&gt;

&lt;p&gt;O poder do React se deve aos seus recursos e à arquitetura robusta que ele oferece. Padrões de projeto são de fato o que dá a esta biblioteca sua extraordinária praticidade e utilidade. Eles facilitam a otimização e a manutenção do código.&lt;/p&gt;

&lt;p&gt;Eles permitem que os desenvolvedores criem aplicativos flexíveis por natureza, ofereçam melhor desempenho e produzam uma base de código mais fácil de manter.&lt;/p&gt;

&lt;p&gt;A utilização de &lt;em&gt;patterns&lt;/em&gt; também auxilia a interagir com o DOM de forma mais consistente e performática, sem side &lt;em&gt;effects&lt;/em&gt; indesejados e com uma interface clara a nível de engenharia.&lt;/p&gt;

&lt;p&gt;A seguir alguns &lt;em&gt;patterns&lt;/em&gt; mais utilizado em React:&lt;/p&gt;

&lt;h2&gt;
  
  
  Higher-order component pattern
&lt;/h2&gt;

&lt;p&gt;Um componente de ordem superior (HOC, do inglês Higher-Order Component), é uma função que recebe um componente e retorna um novo componente. Um componente de ordem superior é semelhante a uma função de ordem superior do JavaScript; são &lt;a href="https://medium.com/devzera/o-que-%C3%A9-uma-fun%C3%A7%C3%A3o-pura-em-javascript-2b34edcad8e2" rel="noopener noreferrer"&gt;funções puras&lt;/a&gt; com zero efeitos colaterais.&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%2Fw95tbb7vld0ri0wwstoa.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%2Fw95tbb7vld0ri0wwstoa.png" alt="código com Higher-order component pattern"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Provider pattern
&lt;/h2&gt;

&lt;p&gt;O Provider Pattern (padrão de provedor, em uma tradução livre) no React é um padrão usado para compartilhar dados globais em vários componentes na árvore de componentes do React.&lt;/p&gt;

&lt;p&gt;O padrão de provedor envolve um componente &lt;strong&gt;&lt;em&gt;Provider&lt;/em&gt;&lt;/strong&gt; — componente que provê o(s) dado(s) — que contém dados globais e compartilha esses dados na árvore de componentes no aplicativo usando um componente &lt;em&gt;&lt;strong&gt;Consumer&lt;/strong&gt;&lt;/em&gt; — que consome os dados providos.&lt;/p&gt;

&lt;p&gt;O padrão do provedor não é exclusivo do React; bibliotecas como React-Redux e MobX também implementam o padrão de provedor.&lt;/p&gt;

&lt;p&gt;O código abaixo mostra um exemplo de uma configuração do padrão de provedor para React-Redux:&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%2Fwim6fydtsxvqfls7e74t.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%2Fwim6fydtsxvqfls7e74t.png" alt="código com Provider pattern"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No React, o &lt;em&gt;Provider Pattern&lt;/em&gt; também pode ser implementado através da &lt;strong&gt;API Context&lt;/strong&gt; do React.&lt;/p&gt;

&lt;p&gt;O React por padrão suporta um fluxo descendente unilateral de dados (imagem abaixo) de um componente pai para seus filhos. Consequentemente, para passar dados para um componente filho localizado muito abaixo na árvore de componentes, teríamos que passar explicitamente &lt;em&gt;props&lt;/em&gt; por cada nível da árvore de componentes — esse processo é chamado de perfuração de &lt;em&gt;props&lt;/em&gt;.&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%2Fftn2g7dcze9b1635zqy0.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%2Fftn2g7dcze9b1635zqy0.png" alt="Aqui temos os componentes mapeados à esquerda e na direita podemos ver a árvore de dados."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A API Context do React usa o padrão de provedor para resolver esse problema! Assim, ela nos permite compartilhar dados na árvore de componentes sem ter que passar por cada componente na árvore até chegar o no componente filho que irá receber essas &lt;em&gt;props&lt;/em&gt;.&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%2Fvkymfn9kwwap8h3705aj.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%2Fvkymfn9kwwap8h3705aj.png" alt="Do lado esquerdo, estrutura onde precisamos passar a(s) prop(s) por cada componente. Já do lado direito utilizando Context API, sem ter que passar manualmente em todos os níveis."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para usar a Context API, primeiro precisamos criar um objeto qualquer que será nosso “&lt;em&gt;context&lt;/em&gt;”. O objeto vem com um componente que aceita um valor: os dados globais. O objeto também possui um componente &lt;strong&gt;Consumer&lt;/strong&gt; que será utilizado para alterações de contexto. O componente Consumer então provê as informações mais recentes e atualizadas para o componente filho.&lt;/p&gt;

&lt;p&gt;Abaixo demonstra um caso de uso típico da API Context do React:&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%2Fzkkwib4l29rgydj374qd.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%2Fzkkwib4l29rgydj374qd.png" alt="código de API Context do React"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A Context API (e gerenciadores de estados globais a grosso modo), são bastante utilizados na implementação de recursos como autenticado de usuário, tema ou idioma preferencial, onde os dados globais são compartilhados em uma árvore de componentes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hooks patterns
&lt;/h2&gt;

&lt;p&gt;As APIs do React Hooks foram introduzidas no React 16.8 e revolucionaram a forma como construímos componentes no React.&lt;/p&gt;

&lt;p&gt;A API React Hooks oferece aos componentes funcionais do React uma maneira simples e direta de acessar recursos comuns do React, como &lt;em&gt;props&lt;/em&gt;, &lt;em&gt;state&lt;/em&gt;, &lt;em&gt;context&lt;/em&gt;, &lt;em&gt;refs&lt;/em&gt; e &lt;em&gt;lifecycle&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;O resultado disso é que agora os componentes funcionais não precisam mais ser componentes “burros”, onde definem apenas aparência da aplicação e a interface de usuário, pois podem usar o estado, conectar-se a um &lt;a href="https://legacy.reactjs.org/docs/react-component.html#the-component-lifecycle" rel="noopener noreferrer"&gt;ciclo de vida do componente&lt;/a&gt;, executar efeitos colaterais e muito mais a partir de um componente funcional. Antes, esses recursos eram suportados apenas por componentes de classe.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hooks&lt;/em&gt; resolvem alguns problemas como “componentes gigantes”, que concentram uma enorme lógica dividida em vários métodos de ciclo de vida. Com o &lt;em&gt;Hooks&lt;/em&gt;, esses problemas foram amenizados, fornecendo uma API mais limpa e enxuta. Exemplo de uma implementação utilizando &lt;em&gt;Hooks&lt;/em&gt;:&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%2Fl5y7mmsqpupv1ef5uovz.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%2Fl5y7mmsqpupv1ef5uovz.png" alt="código com Hooks patterns"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Além das vantagens já citadas, o &lt;em&gt;Hooks pattern&lt;/em&gt; promove a reutilização do código, permitindo-nos criar hooks reutilizáveis ​​e personalizados.&lt;/p&gt;

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

&lt;p&gt;Os &lt;em&gt;Design Patterns&lt;/em&gt; focam na reutilização de soluções. Apesar de todos os problemas não serem iguais, caso você os quebre e ache similaridades com os que já foram resolvidos anteriormente, é possível aplicar os Patterns e obter as soluções.&lt;/p&gt;

&lt;p&gt;Projetar softwares que sejam de qualidade e, principalmente, reutilizáveis, não é uma tarefa fácil — mas os padrões estão aí exatamente para facilitar nessa missão.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/@aryanneas/design-patterns-como-eles-se-aplicam-no-react-dc0161ec25c5" rel="noopener noreferrer"&gt;Design Patterns: como eles se aplicam no React (este mesmo artigo, mas em outra plataforma) &lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://blog.openreplay.com/3-react-component-design-patterns-you-should-know-about" rel="noopener noreferrer"&gt;3 react component design patterns you should know about&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.uxpin.com/studio/blog/react-design-patterns/" rel="noopener noreferrer"&gt;react design patterns&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.hostgator.com.br/blog/design-patterns-e-seus-beneficios/" rel="noopener noreferrer"&gt;design patterns e seus beneficios&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://blog.logrocket.com/react-component-design-patterns-2022/" rel="noopener noreferrer"&gt;react component design patterns 2022&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/collabcode/react-patterns-come%C3%A7ando-pelo-render-props-e0040ef723ce" rel="noopener noreferrer"&gt;react patterns começando pelo render props&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.smashingmagazine.com/2021/08/compound-components-react/#:~:text=Compound%20components%20can%20be%20said,back%20to%20the%20external%20user." rel="noopener noreferrer"&gt;What Is A Compound Component?&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/devzera/o-que-%C3%A9-uma-fun%C3%A7%C3%A3o-pura-em-javascript-2b34edcad8e2" rel="noopener noreferrer"&gt;O que é uma Função Pura? Código em Javascript.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/@gabrielamdesalvo/fluxo-de-dados-no-react-4fc584480582" rel="noopener noreferrer"&gt;Fluxo de dados no React&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
