<?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: Taise Soares</title>
    <description>The latest articles on DEV Community by Taise Soares (@taisesoares).</description>
    <link>https://dev.to/taisesoares</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%2F374306%2F6a72b7e6-4f39-4721-935c-082ae41592cb.jpeg</url>
      <title>DEV Community: Taise Soares</title>
      <link>https://dev.to/taisesoares</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/taisesoares"/>
    <language>en</language>
    <item>
      <title>Resumo do Livro: O Programador Pragmático de aprendiz a mestre (Capitulo 2)</title>
      <dc:creator>Taise Soares</dc:creator>
      <pubDate>Thu, 10 Aug 2023 11:35:03 +0000</pubDate>
      <link>https://dev.to/taisesoares/resumo-do-livro-o-programador-pragmatico-de-aprendiz-a-mestre-capitulo-2-14nb</link>
      <guid>https://dev.to/taisesoares/resumo-do-livro-o-programador-pragmatico-de-aprendiz-a-mestre-capitulo-2-14nb</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mVhqhlti--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dq61f5b1s0h1jgfixq0x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mVhqhlti--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dq61f5b1s0h1jgfixq0x.png" alt="O Programador Pragmático" width="778" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Olá pessoas, vamos continuar mergulhando no mundo da codificação com o resumo do incrível livro O Programador Pragmático, hoje iremos abordar o segundo capitulo, bora la?&lt;/p&gt;

&lt;h2&gt;
  
  
  Capitulo 2: Entropia de software
&lt;/h2&gt;

&lt;p&gt;Já parou pra pensar como o desenvolvimento de software é como um universo próprio? Mesmo que não siga as leis físicas, ele não está imune ao caos. É aí que entra a tal da entropia, que é basicamente a bagunça que se acumula. Quanto mais bagunça, mais o software parece que está se desgastando, tipo uma camiseta velha que vai ficando surrada com o tempo. E essa deterioração pode acontecer por várias razões, mas uma das maiores é a psicologia da galera que tá trabalhando no projeto. Mesmo que seja um projeto solo, a mentalidade por trás dele é crucial. Até aqueles projetos mega planejados, com os melhores profissionais, podem acabar indo pro buraco se a bagunça começar a se multiplicar.&lt;/p&gt;

&lt;p&gt;Aqui entra a "Teoria da Janela Quebrada". Imagine que você tem uma casa bonitona, aí quebra uma janela e você deixa por isso mesmo, sem consertar. O que acontece? Quem mora lá começa a sentir que ninguém tá nem aí pra casa, aí outra janela quebra. E a coisa vão piorando, com lixo acumulando, pichações aparecendo, até que o lugar vira um verdadeiro caos. O mesmo vale para software: um probleminha não resolvido leva a outros, e logo você tá no meio de uma confusão que parece que não tem mais fim. É por isso que a ideia é consertar logo as "janelas quebradas", mesmo que seja um quebra-galho, porque isso impede a bagunça de se espalhar. Até mesmo se você botar um "band-aid" no código ruim, tipo um comentário dizendo "Não Implementado" ou substituindo por dados falsos, já ajuda a mostrar que você está de olho na situação e não está deixando o caos se instalar.&lt;/p&gt;

&lt;p&gt;E aí vem uma lição importante, tipo um alerta de incêndio. Imagina que você tem um amigo com uma casa chiquérrima, cheia de coisas caras e valiosas. Um dia, pega fogo numa tapeçaria, e os bombeiros chegam correndo pra salvar a situação. Mas antes de botarem água no fogo, eles estendem uma esteira pra não sujar o carpete. Ou seja, mesmo no meio do caos, eles tão cuidando dos detalhes. No mundo do software, é a mesma coisa. Uma parte quebrada, um pedaço de código mal feito ou uma decisão furada da chefia, pode ser o estopim pro desastre. Se a gente não cuidar logo disso, a bagunça se espalha e o projeto inteiro vai pro ralo. Então, a moral da história é: não dá pra deixar as "janelas quebradas" de lado. A gente tem que ser o bombeiro que não deixa o fogo se alastrar, senão a entropia ganha e a coisa fica feia de vez.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vamos imaginar
&lt;/h2&gt;

&lt;p&gt;Vamos imaginar meu pequeno gafanhoto, você está na no momento do desenvolvimento de um software, tudo fluindo, código bem organizado, tudo nos trinques. Aí, de repente, você encontra um probleminha, tipo um bug esquisito que faz o programa dar uma travada chata. O que você faz? Ah, decide deixar pra lá, porque, sei lá, é só um probleminha pequeno, não vai afetar muito, né? Aí você volta pra escrever mais código novo, empolgado com as ideias, mas o bug tá lá, quietinho, esperando pra virar o centro da atenção.&lt;/p&gt;

&lt;p&gt;Passam uns dias, e aí começa a acontecer coisa estranha no programa. Outros bugs aparecem, tipo formigas seguindo um rastro de migalhas. Aí o pessoal da equipe começa a notar que as coisas tão ficando meio confusas, mas todo mundo tá tão focado nas novidades que ninguém para pra pensar que talvez o problema seja o tal bug lá do início. Aí acontece o clássico: um programador olha pro código problemático e pensa "Aff, tá uma bagunça mesmo, mas não vou mexer agora, tô ocupado demais". E pronto, a tal "janela quebrada" tá ali, aberta, deixando a confusão entrar de mansinho.&lt;/p&gt;

&lt;p&gt;Aí o projeto continua, mas a coisa vai ficando cada vez mais doida. O pessoal começa a jogar código em cima de código, sem muita organização, e parece que tá todo mundo correndo atrás do próprio rabo. E o bug inicial? Virou um monstro de sete cabeças, uma confusão tão grande que ninguém nem sabe por onde começar a consertar. E o resultado final? Um software todo bagunçado, cheio de bugs, e aquela sensação de que o trem saiu dos trilhos e ninguém sabe como voltar pro caminho certo.&lt;/p&gt;

&lt;p&gt;Então, a moral da história é: não deixa a "janela quebrada" lá no cantinho. Quando você encontra um probleminha, mesmo que seja bobo, meta a mão na massa e conserta logo. Assim, você evita que a bagunça se espalhe feito fogo em capim seco. Porque a verdade é que, se você deixa pra lá, o problema só vai crescer e aí o estrago é certo. É como arrumar a bagunça da sua casa: se você deixar uma coisa fora do lugar, logo o resto começa a ficar bagunçado também. Então, bora ser o bombeiro do você próprio código e não deixar a entropia dominar a parada!&lt;/p&gt;

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

&lt;p&gt;Portanto, meu pequeno gafanhoto, seja no mundo do software ou na vida real, a moral é clara: não dá pra deixar os problemas de lado, porque uma janela quebrada, seja no código ou na rotina, pode se transformar num tsunami de caos. A solução é botar a mão na massa desde o começo, resolver os bugs na hora e não dar brecha pra bagunça se espalhar. Assim, a gente mantém a ordem, evita o desgaste e garante que o nosso sossego, seja no código ou na vida, continue nos eixos. Então, bora encarar os desafios de frente e não deixar a entropia ganhar essa!&lt;/p&gt;

&lt;p&gt;Até o proximo capitulo :)&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Resumo do Livro: O Programador Pragmático de aprendiz a mestre (Capitulo 1)</title>
      <dc:creator>Taise Soares</dc:creator>
      <pubDate>Tue, 08 Aug 2023 00:23:47 +0000</pubDate>
      <link>https://dev.to/taisesoares/resumo-do-livro-o-programador-pragmatico-de-aprendiz-a-mestre-capitulo-1-5ha8</link>
      <guid>https://dev.to/taisesoares/resumo-do-livro-o-programador-pragmatico-de-aprendiz-a-mestre-capitulo-1-5ha8</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qE2iYqFn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dx6dthvjguf6nb6xq5l1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qE2iYqFn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dx6dthvjguf6nb6xq5l1.png" alt="O Programador Pragmático" width="778" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Olá pessoas, se você é um(a) entusiasta da programação ou alguém que está mergulhando no mundo da codificação, prepare-se para uma jornada transformadora rumo à excelência no desenvolvimento de software. Imagine ter em mãos um guia repleto de insights práticos e dicas valiosas dos mestres da programação.&lt;/p&gt;

&lt;p&gt;Bem-vindo(a) ao resumo por capítulo do livro "O Programador Pragmático", onde vamos explorar, de forma descontraída e direta, como cada capítulo deste livro revolucionário pode levar suas habilidades de codificação para um novo patamar. &lt;/p&gt;

&lt;p&gt;Prepare-se para adquirir conhecimentos que vão muito além do código em si, abrangendo desde a gestão de projetos até a otimização do seu fluxo de trabalho. Vamos embarcar nessa jornada rumo à maestria na programação, um capítulo de cada vez!&lt;/p&gt;

&lt;h2&gt;
  
  
  Capitulo 1: O gato comeu meu código-fonte
&lt;/h2&gt;

&lt;p&gt;O texto fala sobre aquele tipo de programador que não só sabe escrever código, mas tem uma atitude especial. Sabe aquela galera que olha para um problema e não vê só o problema em si, mas como ele se encaixa no cenário geral? Pois é, esses são os "programadores pragmáticos". Eles pensam no quadro completo, levam em conta o contexto, não ficam só no imediato.&lt;/p&gt;

&lt;p&gt;Mas olha, não para por aí! Eles também não ficam de braços cruzados esperando que as coisas se resolvam sozinhas. Não, não! Eles botam a mão na massa, são responsáveis pelo que fazem e não deixam os projetos irem ladeira abaixo. Eles encaram os problemas de frente, não importa o tamanho, e buscam sempre aprender com os erros. Além disso, eles sabem que, às vezes, a mudança é necessária e não têm medo de encará-la.&lt;/p&gt;

&lt;p&gt;E sabe o que é massa? Eles não ficam dando desculpas esfarrapadas quando algo dá errado. Assumem a responsabilidade. Se algo sai dos trilhos, eles não ficam apontando dedos ou inventando histórias malucas. Eles têm a ética de encarar a situação, ser honestos sobre os perrengues e propor soluções, entende? E nem é só isso, eles não têm medo de pedir ajuda quando precisam e estão sempre ligados nas opções, em como podem melhorar as coisas. E, eles nem deixam os outros na mão, se comunicam bem e tão sempre dando uma força. Programação pragmática é um estilo de vida, é encarar as barreiras de frente, sem desculpinhas e buscando sempre melhorar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vamos imaginar...
&lt;/h2&gt;

&lt;p&gt;sabe aquele amigo que é daqueles "programadores pragmáticos"? Deixa eu te contar uma história real que ilustra bem isso. Imagina o João, lá no escritório, trabalhando no seu projeto de desenvolvimento. O chefe chega e diz que tem um bug chato que está deixando o sistema todo travado. O João não pira, né? Ele já conhece a filosofia pragmática. Ele não só olha para o bug em si, mas também para o contexto geral do sistema. Ele sabe que só resolver o bug pode não ser suficiente, então já começa a pensar em como isso se encaixa na estrutura toda.&lt;/p&gt;

&lt;p&gt;E aí, o João não fica esperando que a coisa se resolva sozinha. Ele não é daqueles que ficam empurrando problemas para debaixo do tapete. Ele põe a mão na massa, investiga a fundo, encontra a causa raiz do bug e ainda documenta o processo todo pra ninguém ter dor de cabeça depois. E não para por aí! Ele também não é de jogar a culpa nos outros ou nas circunstâncias. Ele chega pro chefe e fala na lata: "Olha, deu ruim aqui, mas já fiz uma análise e vou consertar. E pra evitar que isso aconteça de novo, vou implementar umas medidas de segurança extras".&lt;/p&gt;

&lt;p&gt;Aí, imagina o chefe perguntando se o João tinha tentado isso ou aquilo antes de chegar à conclusão. O João não fica na defensiva, ele sabe que é normal esse tipo de pergunta. Ele responde normal, porque já tinha imaginado essa cena na cabeça, tinha antecipado as possíveis questões. E não vem com desculpa esfarrapada, ele mostra os testes que já fez e as opções que considerou, explicando o porquê de ter escolhido aquela solução.&lt;/p&gt;

&lt;p&gt;Isso, meu pequeno gafanhoto, é programação pragmática. É saber encarar os perrengues com atitude, assumir a responsa, pensar no cenário geral e sempre buscar soluções. E a moral da história é: se você quer se dar bem nesse mundo da programação, fica esperto com essa mentalidade pragmática, porque ela é o pulo do gato pra mandar bem.&lt;/p&gt;

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

&lt;p&gt;Então, meu pequeno gafanhoto, ser um programador pragmático é olhar alem do código, sabe? É não ficar só olhando pro próprio umbigo, mas entender o contexto completo. É botar a mão na massa, assumir a bronca quando algo dá errado, e não ficar de mimimi. É não só resolver os bugs, mas também deixar o sistema melhor do que estava antes. É ter uma boa comunicação, ser honesto sobre os bugs e propor soluções em vez de só jogar a culpa nos outros. Se você quer ser o ninja da programação, essa é a chave: pensamento pragmático é a chave pro sucesso nesse mundão digital.&lt;/p&gt;

&lt;p&gt;Até o proximo capitulo :) &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Série React Hooks: useRef</title>
      <dc:creator>Taise Soares</dc:creator>
      <pubDate>Mon, 07 Aug 2023 13:27:09 +0000</pubDate>
      <link>https://dev.to/taisesoares/serie-react-hooks-useref-2mjl</link>
      <guid>https://dev.to/taisesoares/serie-react-hooks-useref-2mjl</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6-lz-i2P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bq30xwpmpre3pdznnmr4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6-lz-i2P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bq30xwpmpre3pdznnmr4.png" alt="useRef" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Olá pessoas, bora continuar nossa séria sobre os hooks do nosso querido ReactJS, e hoje, vamos mergulhar no maravilhoso mundo do useRef hook no ReactJS. É como ter um superpoder que permite gerenciar valores mutáveis em seus componentes. Então, se prepare e prepare-se para elevar o seu jogo no React!&lt;/p&gt;

&lt;p&gt;Caso queriam ver os outros artigos sobre essa série, segue links de artigos anteriores e nosso github:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/taisesoares/hooks-reactjs"&gt;github&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-useimperativehandle-44d"&gt;Série React Hooks: useImperativeHandle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-usedeferredvalue-13d"&gt;Série React Hooks: useDeferredValue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-usecallback-49ap"&gt;Série React Hooks: useCallback&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-usesyncexternalstore-2lpk"&gt;Série React Hooks: useSyncExternalStore&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-usememo-5pc"&gt;Série React Hooks: useMemo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Afinal, o que é o Hook useRef? 🤔
&lt;/h2&gt;

&lt;p&gt;O &lt;code&gt;useRef&lt;/code&gt; é um gancho (ou hook) que permite que você acesse e manipule diretamente elementos do DOM em seus componentes. Parece interessante? Então continue lendo, pois vamos mergulhar nesse conceito de forma descontraída e profissional. Ele é como uma ferramenta mágica que ajuda você a armazenar e acessar valores mutáveis em componentes funcionais. É como ter um bilhete adesivo que lembra as coisas para você, mas muito mais poderoso!&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando usar o useRef?
&lt;/h2&gt;

&lt;p&gt;Você pode estar se perguntando: "Quando devo usar o hook useRef?". Bem, meu pequeno gafanhoto, aqui estão algumas situações em que ele é útil:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Referenciando elementos do DOM:&lt;/strong&gt; Quando você precisa pegar um elemento do DOM, o useRef está lá para te ajudar. Ele permite que você acesse e manipule esse elemento como um verdadeiro mestre. Diga adeus ao antigo document.getElementById()!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gerenciando valores persistentes:&lt;/strong&gt; Às vezes, você deseja que um valor persista entre as renderizações sem desencadear uma renderização em si. É aí que o useRef brilha. Ele mantém o valor e você pode acessá-lo sempre que precisar, sem interferir no ciclo de renderização do seu componente.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Exemplos de código para te ajudar!
&lt;/h3&gt;

&lt;p&gt;Agora, vamos colocar a mão na massa com alguns exemplos de código. Mas espere! Vamos incrementar as coisas com TypeScript, para que você tenha o melhor dos dois mundos: segurança de tipos e a magia do useRef.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 1: Referenciando um Elemento Textarea
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;useRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&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;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AutosizeTextarea&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;textareaRefElement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useRef&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLTextAreaElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&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="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;textareaRefElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;textareaRefElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;textareaRefElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt; &lt;span class="o"&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;textareaRefElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollHeight&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;px`&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleChange&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;textareaRefElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;textareaRefElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;textareaRefElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt; &lt;span class="o"&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;textareaRefElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollHeight&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;px`&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;textarea&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;textareaRefElement&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;handleChange&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, utilizamos o &lt;code&gt;useRef&lt;/code&gt; para criar uma referência ao elemento &lt;code&gt;textarea&lt;/code&gt;. O &lt;code&gt;useEffect&lt;/code&gt; é usado para ajustar automaticamente a altura do &lt;code&gt;textarea&lt;/code&gt; quando o componente é montado. Definimos a altura inicial como 'auto' e, em seguida, atualizamos para o valor de &lt;code&gt;scrollHeight&lt;/code&gt; do &lt;code&gt;textarea&lt;/code&gt;, ajustando a altura com base no conteúdo. A função &lt;code&gt;handleChange&lt;/code&gt; é acionada sempre que o valor do &lt;code&gt;textarea&lt;/code&gt; é alterado, recalculando a altura para acomodar o novo conteúdo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 2: Foco no Carregamento
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;useRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&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;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AutoFocusInput&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;inputRefElement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useRef&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLInputElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&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="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputRefElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;inputRefElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;focus&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="k"&gt;return&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;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;inputRefElement&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kd"&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="o"&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 &lt;code&gt;useRef&lt;/code&gt; para criar uma referência ao elemento de input. O &lt;code&gt;useEffect&lt;/code&gt; é usado para dar foco ao input quando o componente é montado. Se &lt;code&gt;inputRefElement.current&lt;/code&gt; não for nulo, ou seja, se o elemento de input existir no DOM, chamamos o método &lt;code&gt;focus()&lt;/code&gt;para trazer o foco para o campo de input. Isso permite que o input seja focado automaticamente assim que o componente for renderizado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 3 e ultimo: Acompanhamento do Redimensionamento da Janela
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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="nx"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&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;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;WindowResizeTracker&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;windowWidth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setWindowWidth&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="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerWidth&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;windowHeight&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setWindowHeight&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="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHeight&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;resizeTimeoutRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useRef&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;NodeJS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Timeout&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleResize&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resizeTimeoutRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;clearTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resizeTimeoutRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="nx"&gt;resizeTimeoutRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;setTimeout&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;setWindowWidth&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="nx"&gt;innerWidth&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;setWindowHeight&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="nx"&gt;innerHeight&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&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="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;resize&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleResize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;removeEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;resize&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleResize&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;resizeTimeoutRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;clearTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resizeTimeoutRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&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="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="na"&gt;Width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;windowWidth&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="nx"&gt;px&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="na"&gt;Height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;windowHeight&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="nx"&gt;px&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;este exemplo, além de rastrear o redimensionamento da janela, exibimos as dimensões da janela na tela. Criamos dois estados: &lt;code&gt;windowWidth&lt;/code&gt; e &lt;code&gt;windowHeight&lt;/code&gt;, que armazenam a largura e a altura da janela, respectivamente. Dentro da função &lt;code&gt;handleResize&lt;/code&gt;, atualizamos esses estados quando ocorre o redimensionamento da janela.&lt;/p&gt;

&lt;p&gt;Na parte de renderização, exibimos as dimensões da janela usando &lt;/p&gt;
&lt;p&gt;. Assim, sempre que a janela for redimensionada, as dimensões serão atualizadas e exibidas na tela.&lt;/p&gt;

&lt;p&gt;Esses exemplos demonstram casos adicionais de uso do useRef no TypeScript. Seja ajustando a altura de um textarea automaticamente, acompanhando o redimensionamento da janela ou dando foco a um input no carregamento, o useRef fornece um mecanismo poderoso para lidar com valores mutáveis e acessar elementos do DOM em componentes React.&lt;/p&gt;

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

&lt;p&gt;Em resumo, o useRef é uma ferramenta poderosa no ReactJS que permite a manipulação direta de elementos do DOM em seus componentes. Use-o quando precisar interagir diretamente com o DOM, como focar um campo de entrada ou obter valores de um elemento. No entanto, se você estiver lidando apenas com o estado interno do componente ou atualizações do ciclo de vida, o useRef pode não ser necessário.&lt;/p&gt;

&lt;p&gt;Espero que este artigo descontraído e profissional tenha ajudado você a entender melhor o uso do useRef no ReactJS. Agora você está pronto para explorar e utilizar esse gancho incrível em seus projetos. Divirta-se codificando!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>useref</category>
    </item>
    <item>
      <title>MBA Arquitetura: Diferença entre Enterprise architecture vs solution architecture</title>
      <dc:creator>Taise Soares</dc:creator>
      <pubDate>Thu, 13 Jul 2023 12:05:53 +0000</pubDate>
      <link>https://dev.to/taisesoares/mba-arquitetura-diferenca-entre-enterprise-architecture-vs-solution-architecture-kog</link>
      <guid>https://dev.to/taisesoares/mba-arquitetura-diferenca-entre-enterprise-architecture-vs-solution-architecture-kog</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tjeDhZkW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ymjjialk73945pszgkxu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tjeDhZkW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ymjjialk73945pszgkxu.png" alt="Enterprise architecture vs solution architecture" width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Olá pessoas, continuando minha jornada no MBA de Arquitetura de Software, bora falar sobre a diferença entre Enterprise architecture vs solution architecture.&lt;/p&gt;

&lt;p&gt;Caso queriam ver os outros artigos sobre essa jornada, segue links de artigos anteriores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/software-enterprise-e-ecossistema-enterprise-1i13"&gt;MBA Arquitetura: Software Enterprise e Ecossistema Enterprise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/arquitetura-de-solucao-e-perfil-do-arquiteto-3n45"&gt;MBA Arquitetura: Arquitetura de Solução e Perfil do Arquiteto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/mba-arquitetura-tco-total-cost-of-ownership-compreendendo-e-utilizando-o-custo-total-de-propriedade-4hj7"&gt;MBA Arquitetura: TCO (Total Cost of Ownership): Compreendendo e Utilizando o Custo Total de Propriedade&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Enterprise Architecture (EA)
&lt;/h2&gt;

&lt;p&gt;Pra começar, vamos falar sobre a &lt;strong&gt;Enterprise Architecture&lt;/strong&gt;. A EA é uma abordagem que ajuda a organizar e alinhar os processos de negócio, a tecnologia e a estratégia de uma empresa. É como se fosse um mapa que mostra como tudo se conecta e funciona junto. A ideia é garantir que a empresa esteja preparada para enfrentar os desafios do mercado e possa se adaptar às mudanças.&lt;/p&gt;

&lt;p&gt;O principal objetivo da arquitetura empresarial é entender como todos os componentes do sistema se encaixam e se comunicam entre si. Ela olha para os processos, os dados, as aplicações e a infraestrutura existentes na empresa e tenta otimizá-los. A arquitetura empresarial também está preocupada em alinhar a tecnologia aos objetivos estratégicos da organização.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution Architecture (SA)
&lt;/h2&gt;

&lt;p&gt;Agora, vamos falar sobre a &lt;strong&gt;Solution Architecture&lt;/strong&gt;. A SA é mais específica e foca em resolver um problema ou desafio de negócio particular. Ela define a estrutura, os componentes e as interações entre eles para criar uma solução que atenda às necessidades do projeto.&lt;/p&gt;

&lt;p&gt;A SA é responsável por garantir que a solução seja tecnicamente viável, alinhada com a estratégia da empresa e que possa ser integrada aos sistemas existentes. Ela também ajuda a identificar riscos e a planejar a implementação da solução.&lt;/p&gt;

&lt;h2&gt;
  
  
  Então, qual é a diferença?
&lt;/h2&gt;

&lt;p&gt;A principal diferença entre a EA e a SA é o escopo. A EA é uma abordagem mais ampla que engloba toda a organização, enquanto a SA é focada em resolver um problema específico.&lt;/p&gt;

&lt;p&gt;A EA ajuda a criar uma visão geral de como a empresa funciona e como os diferentes componentes se conectam. Ela é mais estratégica e ajuda a garantir que a empresa esteja preparada para enfrentar os desafios do mercado.&lt;/p&gt;

&lt;p&gt;Já a SA é mais tática e foca em resolver um problema ou desafio específico. Ela define a estrutura e os componentes necessários para criar uma solução que atenda às necessidades do projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resumindo
&lt;/h2&gt;

&lt;p&gt;Em resumo, a diferença entre arquitetura empresarial e arquitetura de soluções está no escopo e no foco. A arquitetura empresarial olha para a organização como um todo e visa otimizar a estrutura tecnológica, alinhando-a aos objetivos estratégicos. Já a arquitetura de soluções concentra-se em projetos específicos, projetando e implementando sistemas que atendam a requisitos detalhados.&lt;/p&gt;

&lt;p&gt;Ambas as áreas são essenciais no mundo da tecnologia. A arquitetura empresarial garante que a empresa tenha uma base sólida e eficiente, enquanto a arquitetura de soluções traz soluções específicas para problemas ou necessidades específicas.&lt;/p&gt;

&lt;p&gt;Então, da próxima vez que ouvir falar de arquitetura empresarial ou arquitetura de soluções, lembre-se: uma cuida do todo e a outra cuida dos detalhes. Juntas, elas ajudam a construir um futuro tecnológico brilhante para as empresas.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>MBA Arquitetura: TCO (Total Cost of Ownership): Compreendendo e Utilizando o Custo Total de Propriedade</title>
      <dc:creator>Taise Soares</dc:creator>
      <pubDate>Tue, 11 Jul 2023 11:28:43 +0000</pubDate>
      <link>https://dev.to/taisesoares/mba-arquitetura-tco-total-cost-of-ownership-compreendendo-e-utilizando-o-custo-total-de-propriedade-4hj7</link>
      <guid>https://dev.to/taisesoares/mba-arquitetura-tco-total-cost-of-ownership-compreendendo-e-utilizando-o-custo-total-de-propriedade-4hj7</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--84C7tMSf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h7lohvng51oax8rbm72r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--84C7tMSf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h7lohvng51oax8rbm72r.png" alt="TCO" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Olá pessoas, continuando minha jornada no MBA de Arquitetura de Software, bora falar sobre TCO. &lt;/p&gt;

&lt;p&gt;Caso queriam ver os outros artigos sobre essa jornada, segue links de artigos anteriores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/software-enterprise-e-ecossistema-enterprise-1i13"&gt;MBA Arquitetura: Software Enterprise e Ecossistema Enterprise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/arquitetura-de-solucao-e-perfil-do-arquiteto-3n45"&gt;MBA Arquitetura: Arquitetura de Solução e Perfil do Arquiteto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Entendendo o TCO: O que é e como usar na prática
&lt;/h2&gt;

&lt;p&gt;No mundo dos negócios e da tecnologia, é essencial tomar decisões informadas, especialmente quando se trata de implementar soluções e sistemas. Uma ferramenta valiosa para essa análise é o TCO (Total Cost of Ownership), ou Custo Total de Propriedade em português. O TCO é um conceito que permite avaliar os custos envolvidos em todas as fases do ciclo de vida de uma solução, indo além do custo inicial de aquisição ou desenvolvimento. Se você já se perguntou como calcular todos os custos envolvidos em um projeto ou solução tecnológica, esse artigo é pra você! Vamos descomplicar o TCO e mostrar como ele pode ser útil no dia a dia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Afinal o que é TCO
&lt;/h2&gt;

&lt;p&gt;TCO significa Total Cost of Ownership, ou em bom português, Custo Total de Propriedade. É uma forma de calcular todos os custos relacionados à aquisição, implantação, operação e manutenção de um produto ou sistema durante sua vida útil. O TCO ajuda a entender e comparar os custos diretos e indiretos de uma solução, permitindo uma análise mais completa antes de tomar decisões de investimento em tecnologia. Em essência, o TCO fornece uma visão abrangente dos custos totais ao longo do tempo, permitindo uma análise financeira mais precisa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que o TCO é importante?
&lt;/h2&gt;

&lt;p&gt;Sabe quando você compra um celular novo e depois percebe que precisa gastar mais dinheiro com capinha, película e outros acessórios? Pois é, o TCO é como se fosse uma versão mais elaborada dessa situação, só que aplicada a projetos e soluções tecnológicas.&lt;/p&gt;

&lt;p&gt;Ao considerar o TCO, você consegue ter uma visão mais ampla dos custos envolvidos em um projeto, evitando surpresas desagradáveis no futuro. Além disso, o TCO ajuda a comparar diferentes soluções e escolher a que melhor se encaixa no seu orçamento e objetivos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quais custos fazem parte do TCO?
&lt;/h2&gt;

&lt;p&gt;O TCO inclui uma série de custos, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aquisição de hardware e software&lt;/li&gt;
&lt;li&gt;Instalação e configuração&lt;/li&gt;
&lt;li&gt;Treinamento de funcionários&lt;/li&gt;
&lt;li&gt;Suporte e manutenção&lt;/li&gt;
&lt;li&gt;Atualizações e expansões&lt;/li&gt;
&lt;li&gt;Custos de energia e espaço físico (quando aplicável)&lt;/li&gt;
&lt;li&gt;Custos de migração ou desativação do sistema&lt;/li&gt;
&lt;li&gt;Entre outros.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Legal, e como faz para calcular o TCO?
&lt;/h2&gt;

&lt;p&gt;Calcular o TCO pode ser um pouco complicado, já que envolve muitos fatores e variáveis. Mas não se preocupe, vamos te dar algumas dicas para facilitar esse processo:&lt;/p&gt;

&lt;p&gt;1 - &lt;strong&gt;Identifique e quantifique os custos relevantes:&lt;/strong&gt; O primeiro passo é identificar e listar todos os custos associados à solução. Isso inclui custos diretos, como aquisição de hardware e software, e custos indiretos, como treinamento de funcionários e perda de produtividade durante a implementação.&lt;/p&gt;

&lt;p&gt;2 - &lt;strong&gt;Estabeleça o período de análise:&lt;/strong&gt; Determine o período de tempo que você deseja analisar. O TCO pode ser calculado para curto, médio ou longo prazo, dependendo das necessidades da organização e da solução em questão.&lt;/p&gt;

&lt;p&gt;3 - &lt;strong&gt;Estime os custos futuros:&lt;/strong&gt; Considere os custos futuros, como manutenção, atualizações, suporte técnico e possíveis melhorias. Leve em conta as projeções de crescimento da empresa e as tendências tecnológicas que podem afetar os custos no futuro.&lt;/p&gt;

&lt;p&gt;4 - &lt;strong&gt;Calcule o TCO:&lt;/strong&gt; Some todos os custos identificados ao longo do período de análise para obter o Custo Total de Propriedade. Isso inclui custos iniciais, custos operacionais, custos de manutenção, custos de suporte, custos de atualização, custos de treinamento, entre outros.&lt;/p&gt;

&lt;p&gt;5 - &lt;strong&gt;Compare alternativas:&lt;/strong&gt; Utilize o TCO para comparar diferentes soluções ou abordagens arquiteturais. Calcule o TCO para cada opção e leve em consideração não apenas o custo inicial, mas também os custos totais ao longo do tempo. Isso permitirá uma análise mais precisa da viabilidade e rentabilidade de cada alternativa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dicas para reduzir o TCO
&lt;/h2&gt;

&lt;p&gt;Agora que você já sabe o que é TCO e como calcular, vamos te dar algumas dicas para reduzir esses custos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Negocie com fornecedores&lt;/strong&gt;: Tente negociar melhores preços e condições com os fornecedores de hardware e software.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Capacite sua equipe&lt;/strong&gt;: Invista em treinamento para que seus funcionários possam usar a solução de forma eficiente e evitar problemas que gerem custos adicionais.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Escolha soluções escaláveis&lt;/strong&gt;: Opte por soluções que possam ser facilmente expandidas ou atualizadas, evitando a necessidade de substituição completa do sistema.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Considere soluções em nuvem&lt;/strong&gt;: Muitas vezes, soluções baseadas em nuvem têm um TCO menor, já que eliminam custos com infraestrutura física e manutenção.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Benefícios do uso do TCO:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tomada de decisão informada:&lt;/strong&gt; O TCO fornece uma base sólida para tomar decisões informadas ao levar em consideração todos os custos envolvidos em uma solução.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Identificação de oportunidades de economia:&lt;/strong&gt; Ao analisar os custos detalhadamente, é possível identificar oportunidades de redução de despesas, como a substituição de uma solução mais cara por uma alternativa mais econômica.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Planejamento financeiro:&lt;/strong&gt; O TCO auxilia no planejamento financeiro, permitindo que as organizações prevejam e reservem recursos para cobrir os custos ao longo do ciclo de vida da solução.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Avaliação de ROI:&lt;/strong&gt; O TCO é um componente essencial para calcular o retorno sobre o investimento (ROI) de uma solução, fornecendo uma perspectiva realista dos custos envolvidos em relação aos benefícios esperados.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resumindo
&lt;/h2&gt;

&lt;p&gt;Em resumo, o TCO é importante porque oferece uma visão completa e realista dos custos totais de uma solução ao longo de seu ciclo de vida. Ele permite que as organizações tomem decisões informadas, comparem alternativas, planejem financeiramente, identifiquem oportunidades de economia e avaliem o ROI. Ao considerar o TCO, as organizações podem evitar custos inesperados, otimizar seus investimentos e alcançar melhores resultados financeiros.&lt;/p&gt;

&lt;p&gt;E aí, curtiu o nosso papo sobre TCO? Esperamos que essas informações te ajudem a tomar decisões mais informadas e a gerenciar melhor os custos dos seus projetos e soluções tecnológicas. Até a próxima!&lt;/p&gt;

</description>
      <category>tco</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
    <item>
      <title>Série React Hooks: useSyncExternalStore</title>
      <dc:creator>Taise Soares</dc:creator>
      <pubDate>Mon, 10 Jul 2023 11:10:06 +0000</pubDate>
      <link>https://dev.to/taisesoares/serie-react-hooks-usesyncexternalstore-2lpk</link>
      <guid>https://dev.to/taisesoares/serie-react-hooks-usesyncexternalstore-2lpk</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FhTT3S4_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i241dkt5c5dcp1sw2sku.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FhTT3S4_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i241dkt5c5dcp1sw2sku.png" alt="useSyncExternalStore" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Olá pessoas, vamos dar continuidade em nossa série onde desvendando todos os hooks padrões do nosso querido React.js.&lt;/p&gt;

&lt;p&gt;Caso queriam ver os outros artigos sobre essa série, segue links de artigos anteriores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-useimperativehandle-44d"&gt;Série React Hooks: useImperativeHandle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-usedeferredvalue-13d"&gt;Série React Hooks: useDeferredValue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-usememo-5pc"&gt;Série React Hooks: useMemo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-usecallback-49ap"&gt;Série React Hooks: useCallback&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-useref-2mjl"&gt;Série React Hooks: useRef&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hoje vamos falar sobre um hook bem interessante do ReactJS chamado &lt;code&gt;useSyncExternalStore&lt;/code&gt;. Vamos entender como ele funciona, como utilizá-lo com exemplos em TypeScript e quais são os benefícios e ganhos em utilizá-lo. Bora lá?&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o &lt;code&gt;useSyncExternalStore&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;O &lt;code&gt;useSyncExternalStore&lt;/code&gt; é um hook do ReactJS que permite sincronizar o estado de um componente com uma fonte de dados externa. Ele é especialmente útil quando você precisa compartilhar o estado entre vários componentes sem usar um gerenciador de estado global, como o Redux por exemplo, como o armazenamento local (local storage) ou uma API de armazenamento em nuvem. Com esse superpoder, você pode compartilhar o estado em tempo real entre diferentes partes da sua aplicação e até mesmo entre dispositivos distintos. Imagine só, atualizações instantâneas em tempo real em qualquer lugar!&lt;/p&gt;

&lt;p&gt;Agora você deve estar se perguntando: Mas como esse hook mágico funciona? É simples! Basta chamar o useSyncExternalStore e passar a chave de identificação do estado e a fonte externa que deseja utilizar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como utilizar o &lt;code&gt;useSyncExternalStore&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;Vamos para um exemplo, externo e interno ao mesmo tempo, vamos começar criando uma função que será nossa fonte de dados externa. Essa função será responsável por armazenar e atualizar o estado. No nosso exemplo, vamos criar uma função que armazena um contador.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;typescript&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;State&lt;/span&gt; &lt;span class="o"&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="kr"&gt;number&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;initialState&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="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="kd"&gt;let&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="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;listeners&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Set&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;getState&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="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="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newState&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="k"&gt;void&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;newState&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;listeners&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;listener&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;listener&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="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;listener&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;gt;&lt;/span&gt; &lt;span class="k"&gt;void&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;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;listeners&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;listener&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;listeners&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;listener&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;Agora que temos nossa fonte de dados externa, podemos criar o hook &lt;code&gt;useSyncExternalStore&lt;/code&gt;. Vamos importar o hook do pacote &lt;code&gt;react&lt;/code&gt; e criar uma função que utiliza o &lt;code&gt;useSyncExternalStore&lt;/code&gt; para sincronizar o estado do componente com nossa fonte de dados externa.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;useSyncExternalStore&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;useCounter&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;useSyncExternalStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;getState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;subscribe&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;E isso é tudo, está pronto! Agora podemos utilizar o hook useCounter em nossos componentes para sincronizar o estado do contador.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;const&lt;/span&gt; &lt;span class="nx"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&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="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="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useCounter&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="na"&gt;Contador&lt;/span&gt;&lt;span class="p"&gt;:&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="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;setState&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="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;Incrementar&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;Counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Legal não é mesmo, mas vamos para um outro exemplo utilizando localStorage agora para tentar ficar mais simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;useSyncExternalStore&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;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;useSyncExternalStore&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="nx"&gt;localStorage&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;Contagem&lt;/span&gt;&lt;span class="p"&gt;:&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="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;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;Incrementar&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 utilizando o armazenamento local (&lt;code&gt;localStorage&lt;/code&gt;) como a fonte externa. O estado &lt;code&gt;'count'&lt;/code&gt; será sincronizado com o valor armazenado no localStorage e qualquer alteração feita no estado será automaticamente refletida no localStorage e vice-versa. Incrível, não é?&lt;/p&gt;

&lt;p&gt;A mágica não para por aí. O hook &lt;code&gt;useSyncExternalStore&lt;/code&gt; também permite que você compartilhe o estado entre diferentes abas ou janelas do navegador. Isso significa que se você tiver a mesma aplicação aberta em duas abas diferentes, qualquer alteração feita em uma aba será instantaneamente refletida na outra aba. Isso abre um mundo de possibilidades para colaboração em tempo real e sincronização de dados entre usuários. Bora de outro exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;useSyncExternalStore&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;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;useSyncExternalStore&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="nx"&gt;localStorage&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="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;Contagem&lt;/span&gt;&lt;span class="p"&gt;:&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="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;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;Incrementar&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;No exemplo acima, estamos passando &lt;code&gt;0&lt;/code&gt; como valor inicial para o estado &lt;code&gt;'count'&lt;/code&gt;. Isso significa que, caso não haja um valor previamente armazenado no localStorage, o estado será iniciado com o valor padrão de &lt;code&gt;0&lt;/code&gt;. Isso garante que sua aplicação funcione sem problemas mesmo quando o estado inicial não está disponível.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefícios e ganhos em utilizar o &lt;code&gt;useSyncExternalStore&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Agora que vimos como utilizar o &lt;code&gt;useSyncExternalStore&lt;/code&gt;, vamos falar sobre os benefícios e ganhos em utilizá-lo.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sincronização de estado entre componentes&lt;/strong&gt;: O &lt;code&gt;useSyncExternalStore&lt;/code&gt; permite que você compartilhe o estado entre vários componentes sem a necessidade de um gerenciador de estado global, como o Redux. Isso pode simplificar seu código e torná-lo mais fácil de entender e manter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt;: O &lt;code&gt;useSyncExternalStore&lt;/code&gt; é otimizado para evitar renderizações desnecessárias. Ele só atualiza os componentes que realmente precisam ser atualizados, melhorando a performance da sua aplicação.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flexibilidade&lt;/strong&gt;: O &lt;code&gt;useSyncExternalStore&lt;/code&gt; pode ser utilizado com qualquer fonte de dados externa, não apenas com o estado do React. Isso significa que você pode utilizá-lo para sincronizar o estado do componente com outras bibliotecas, APIs ou até mesmo com o LocalStorage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Escalabilidade&lt;/strong&gt;: Como o &lt;code&gt;useSyncExternalStore&lt;/code&gt; é um hook nativo do React, ele é compatível com todas as funcionalidades e otimizações do React, como o Concurrent Mode e o React Server Components. Isso garante que sua aplicação continuará escalável e performática à medida que o React evolui.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Resumindo
&lt;/h2&gt;

&lt;p&gt;Os benefícios e ganhos ao utilizar o hook &lt;code&gt;useSyncExternalStore&lt;/code&gt; são inúmeros. Com ele, você pode facilmente compartilhar e sincronizar o estado da sua aplicação em tempo real entre diferentes partes do seu código, diferentes abas ou até mesmo diferentes dispositivos. Isso proporciona uma experiência do usuário mais rica e colaborativa.&lt;/p&gt;

&lt;p&gt;Além disso, o &lt;code&gt;useSyncExternalStore&lt;/code&gt; simplifica a recuperação e persistência do estado, garantindo que os dados não sejam perdidos mesmo em situações como atualização da página ou novos acessos à aplicação.&lt;/p&gt;

&lt;p&gt;Portanto, se você está em busca de superpoderes para o gerenciamento de estado no ReactJS, não deixe de experimentar o hook &lt;code&gt;useSyncExternalStore&lt;/code&gt;. Ele vai revolucionar a forma como você compartilha, sincroniza e persiste o estado da sua aplicação. Aproveite e conquiste o mundo React com esse hook poderoso!&lt;/p&gt;

</description>
      <category>usesyncexternalstore</category>
      <category>react</category>
      <category>typescript</category>
      <category>javascript</category>
    </item>
    <item>
      <title>MBA Arquitetura: Arquitetura de Solução e Perfil do Arquiteto.</title>
      <dc:creator>Taise Soares</dc:creator>
      <pubDate>Tue, 04 Jul 2023 12:09:46 +0000</pubDate>
      <link>https://dev.to/taisesoares/arquitetura-de-solucao-e-perfil-do-arquiteto-3n45</link>
      <guid>https://dev.to/taisesoares/arquitetura-de-solucao-e-perfil-do-arquiteto-3n45</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--efy17zVH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/npoc6w1by6cu07ba08l7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--efy17zVH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/npoc6w1by6cu07ba08l7.png" alt="Arquitetura de Solução" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ola pessoas, continuando meus estudos no MBA, hoje vamos falar sobre o que é arquitetura de solução e o perfil de uma pessoa arquiteta de solução... Bora la? &lt;/p&gt;

&lt;p&gt;Então bora, você já se perguntou como os sistemas complexos e as aplicações de software são projetados e desenvolvidos? Bem, aqui está um segredo dos bastidores: a arquitetura de solução! Neste artigo, vamos explorar o que é arquitetura de solução, qual o perfil e as habilidades necessárias para se tornar um arquiteto de solução, e quais os princípios fundamentais para arquitetar uma solução eficaz. Prepare-se para mergulhar no mundo fascinante da arquitetura de solução!&lt;/p&gt;

&lt;h2&gt;
  
  
  Mas afinal o que é arquitetura de solução?
&lt;/h2&gt;

&lt;p&gt;Arquitetura de solução é uma disciplina que envolve o design, planejamento e implementação de soluções tecnológicas para atender aos objetivos de negócio de uma organização. É como construir uma estrutura sólida para um edifício, mas em vez de tijolos e argamassa, estamos lidando com componentes de software e sistemas interconectados. O papel de um arquiteto de solução é garantir que os diferentes elementos de um sistema funcionem em harmonia, atendendo às necessidades de negócio e aos requisitos técnicos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perfil de um arquiteto de solução:
&lt;/h2&gt;

&lt;p&gt;Agora que já entendemos o que é arquitetura de solução, vamos falar sobre o perfil e as habilidades de uma pessoa arquiteta de solução. Essa pessoa precisa ter uma visão ampla do negócio e das tecnologias disponíveis, além de ser capaz de se comunicar bem com diferentes áreas da empresa. Algumas soft skills importantes para essa função são:&lt;/p&gt;

&lt;h3&gt;
  
  
  Comunicação:
&lt;/h3&gt;

&lt;p&gt;A habilidade de comunicação é crucial para uma pessoa arquiteta de solução. Essa pessoa precisa ser capaz de articular ideias e conceitos de forma clara e concisa, tanto com os membros da equipe técnica quanto com os stakeholders do projeto. Além disso, é importante saber ouvir e entender as necessidades e expectativas de todas as partes envolvidas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pensamento critico:
&lt;/h3&gt;

&lt;p&gt;Uma arquiteta de solução deve ser capaz de analisar de forma crítica os requisitos e desafios do projeto. Isso envolve a capacidade de avaliar diferentes abordagens, identificar pontos fracos e fortes, antecipar possíveis problemas e tomar decisões informadas com base em dados e informações disponíveis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resolução de problemas
&lt;/h3&gt;

&lt;p&gt;A resolução de problemas é uma competência fundamental para um arquiteto de solução. Essa pessoa precisa ser capaz de identificar e analisar problemas complexos, decompondo-os em partes menores e procurando soluções viáveis. Isso requer criatividade, pensamento analítico e uma abordagem sistemática para lidar com desafios técnicos e organizacionais.&lt;/p&gt;

&lt;h3&gt;
  
  
  Liderança
&lt;/h3&gt;

&lt;p&gt;A liderança é importante para um arquiteto de solução, pois essa pessoa muitas vezes atua como um ponto central na coordenação de equipes multidisciplinares. A capacidade de influenciar, motivar e orientar os membros da equipe é fundamental para garantir a implementação bem-sucedida da solução proposta. Além disso, um líder eficaz deve ser capaz de tomar decisões difíceis, delegar responsabilidades e resolver conflitos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Flexibilidade
&lt;/h3&gt;

&lt;p&gt;A flexibilidade é uma característica crucial para um arquiteto de solução, pois os projetos de TI muitas vezes exigem adaptação a mudanças nas necessidades dos usuários, nas tecnologias disponíveis ou nos requisitos do negócio. Ser capaz de se ajustar a novas circunstâncias, pensar de forma criativa e encontrar soluções alternativas é essencial para enfrentar os desafios que surgem ao longo do processo.&lt;/p&gt;

&lt;p&gt;Esses pontos de comunicação, pensamento crítico, resolução de problemas, liderança e flexibilidade são essenciais para um arquiteto de solução bem-sucedido, pois eles trabalham na interface entre as necessidades do negócio e a implementação técnica, garantindo que as soluções propostas sejam eficazes, viáveis e alinhadas com os objetivos estratégicos da organização.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resumindo
&lt;/h2&gt;

&lt;p&gt;A arquitetura de soluções desempenha um papel vital na conexão entre as necessidades comerciais e as soluções tecnológicas. Um arquiteto de soluções competente possui um conjunto diversificado de habilidades, incluindo conhecimento técnico, visão de negócios, pensamento analítico e excelentes habilidades de comunicação.&lt;/p&gt;

</description>
      <category>arquiteturasoftware</category>
    </item>
    <item>
      <title>Série React Hooks: useCallback</title>
      <dc:creator>Taise Soares</dc:creator>
      <pubDate>Mon, 03 Jul 2023 12:21:59 +0000</pubDate>
      <link>https://dev.to/taisesoares/serie-react-hooks-usecallback-49ap</link>
      <guid>https://dev.to/taisesoares/serie-react-hooks-usecallback-49ap</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9Rr_ht0A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rad7ujxlcjhvd0hlf4ww.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9Rr_ht0A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rad7ujxlcjhvd0hlf4ww.png" alt="hooks reactjs" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Olá pessoas, vamos dar continuidade em nossa série onde desventamos todos os hooks padrões do nosso querido React.js. &lt;/p&gt;

&lt;p&gt;Caso queriam ver os outros artigos sobre essa série, segue links de artigos anteriores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-useimperativehandle-44d"&gt;Série React Hooks: useImperativeHandle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-usedeferredvalue-13d"&gt;Série React Hooks: useDeferredValue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-usememo-5pc"&gt;Série React Hooks: useMemo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-usesyncexternalstore-2lpk"&gt;Série React Hooks: useSyncExternalStore&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-useref-2mjl"&gt;Série React Hooks: useRef&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hoje iremos falar sobre o hook &lt;code&gt;useCallback&lt;/code&gt;, então, pegue sua bebida favorita, sente-se e vamos começar!&lt;/p&gt;

&lt;h2&gt;
  
  
  O Conceito do useCallback:
&lt;/h2&gt;

&lt;p&gt;O useCallback é um hook do React que tem como objetivo otimizar o desempenho de componentes funcionais. Ele é um hook que ajuda a otimizar o desempenho dos seus componentes React. Tudo se resume à memoização &lt;em&gt;(não confundir com memorização&lt;/em&gt; 😛). A memoização é uma técnica onde você armazena o resultado de uma função para que não tenha que re-computá-la toda vez que ela é chamada com os mesmos argumentos.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;useCallback&lt;/code&gt; é perfeito para quando você tem uma função que é passada como prop para um componente filho, e você quer evitar re-renderizações desnecessárias. No entanto, nem sempre é necessário. Se a sua função não está causando problemas de desempenho, você pode não precisar do useCallback.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparação rasa ou profunda? 🤨
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;useCallback&lt;/code&gt; usa comparação rasa para verificar se as dependências mudaram. Isso significa que ele verifica apenas se as referências às dependências são diferentes, e não se os valores reais dentro dos objetos mudaram. Bora ver um exemplo para compreender melhor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useCallback, useState } from 'react';

const ParentComponent: React.FC = () =&amp;gt; {
  const [count, setCount] = useState(0);

  const handleClick = useCallback(() =&amp;gt; {
    setCount(prevCount =&amp;gt; prevCount + 1);
  }, []);

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1&amp;gt;Contagem: {count}&amp;lt;/h1&amp;gt;
      &amp;lt;ChildComponent handleClick={handleClick} /&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

interface ChildProps {
  handleClick: () =&amp;gt; void;
}

const ChildComponent: React.FC&amp;lt;ChildProps&amp;gt; = ({ handleClick }) =&amp;gt; {
  return (
    &amp;lt;button onClick={handleClick}&amp;gt;Clique Aqui!&amp;lt;/button&amp;gt;
  );
};

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

&lt;/div&gt;



&lt;p&gt;Neste exemplo, o &lt;code&gt;useCallback&lt;/code&gt; é utilizado para envolver a função handleClick dentro do componente &lt;code&gt;"ParentComponent"&lt;/code&gt;. Não fornecemos nenhuma dependência ao &lt;code&gt;useCallback&lt;/code&gt;, o que significa que a função será memoizada e permanecerá a mesma em chamadas subsequentes. Isso é apropriado, pois a função &lt;code&gt;handleClick&lt;/code&gt; não possui dependências externas que possam afetar seu comportamento.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando é possivel não usar o useCallback:
&lt;/h2&gt;

&lt;p&gt;Embora o useCallback seja uma ferramenta útil para melhorar a performance, nem sempre é necessário utilizá-lo. Em situações em que a função não possui dependências e não é passada como prop para componentes filhos, não há benefício em envolvê-la com o useCallback. Além disso, se a função é recriada em cada renderização, mas não causa problemas de desempenho, também não é necessário utilizar o useCallback.&lt;/p&gt;

&lt;p&gt;Bora ver um exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState } from 'react';

const CounterComponent: React.FC = () =&amp;gt; {
  const [count, setCount] = useState(0);

const incrementCount = () =&amp;gt; {
setCount(count + 1);
};

return (
  &amp;lt;div&amp;gt;
    &amp;lt;h1&amp;gt;Contagem: {count}&amp;lt;/h1&amp;gt;
    &amp;lt;button onClick={incrementCount}&amp;gt;Incrementar&amp;lt;/button&amp;gt;
  &amp;lt;/div&amp;gt;
 );
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, a função incrementCount não possui dependências externas e não é passada como prop para nenhum componente filho. Portanto, não há necessidade de envolvê-la com o useCallback. A função é recriada em cada renderização, mas isso não afeta o desempenho do aplicativo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Uma palavra de cautela
&lt;/h2&gt;

&lt;p&gt;Embora &lt;code&gt;useCallback&lt;/code&gt; possa ajudar a otimizar seus componentes, não é uma solução mágica. Ele tem um custo, pois precisa armazenar a função na memória. Portanto, use-o com sabedoria e apenas quando necessário.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resumindo
&lt;/h2&gt;

&lt;p&gt;O hook &lt;code&gt;useCallback&lt;/code&gt; é uma ferramenta poderosa para otimizar a performance de um aplicativo React. Utilizando o conceito de memoização, o useCallback permite armazenar em cache funções e reutilizá-las em chamadas subsequentes, desde que as dependências permaneçam as mesmas. É apropriado utilizar o &lt;code&gt;useCallback&lt;/code&gt; quando precisamos passar funções como props para componentes filhos, evitando renderizações desnecessárias. Porém, é importante lembrar que o &lt;code&gt;useCallback&lt;/code&gt; não é sempre necessário e deve ser usado com discernimento. Em situações em que a função não possui dependências ou não causa problemas de desempenho, não há necessidade de envolvê-la com o &lt;code&gt;useCallback&lt;/code&gt;. Compreender quando utilizar e quando não utilizar o &lt;code&gt;useCallback&lt;/code&gt; ajuda a desenvolver aplicativos React mais eficientes e responsivos.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>usecallback</category>
      <category>hooks</category>
    </item>
    <item>
      <title>MBA Arquitetura: Software Enterprise e Ecossistema Enterprise</title>
      <dc:creator>Taise Soares</dc:creator>
      <pubDate>Fri, 30 Jun 2023 12:36:08 +0000</pubDate>
      <link>https://dev.to/taisesoares/software-enterprise-e-ecossistema-enterprise-1i13</link>
      <guid>https://dev.to/taisesoares/software-enterprise-e-ecossistema-enterprise-1i13</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FeZZozQg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z5oouuxweig2af3wte1y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FeZZozQg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z5oouuxweig2af3wte1y.png" alt="software enterprise" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Olá pessoas, bora falar sobre software enterprise, o que são, do que se alimentam, como sobrevivem ? Nesse artigo iremos explorar um pouco sobre o conceito de software enterprise e o ecossistema enterprise. bora la?&lt;/p&gt;

&lt;h2&gt;
  
  
  Afinal o que é software enterprise
&lt;/h2&gt;

&lt;p&gt;Software enterprise, também conhecido como software corporativo ou software empresarial, refere-se a um tipo de software desenvolvido e utilizado por organizações para atender às suas necessidades específicas de negócios. Esse tipo de software é projetado para lidar com processos complexos, integração de sistemas, gerenciamento de dados em larga escala e colaboração entre departamentos e equipes.&lt;/p&gt;

&lt;p&gt;O software enterprise é caracterizado por sua capacidade de suportar as operações de uma organização em larga escala, abrangendo várias áreas funcionais, como contabilidade, recursos humanos, vendas, marketing, cadeia de suprimentos e produção. Ele fornece uma plataforma centralizada para armazenar e processar dados cruciais, permitindo uma visão abrangente das operações e facilitando a tomada de decisões informadas.&lt;/p&gt;

&lt;p&gt;Os sistemas de software enterprise geralmente são altamente personalizáveis e configuráveis para atender às necessidades específicas de uma organização. Eles podem ser implantados localmente, em servidores da empresa, ou na nuvem, oferecendo maior flexibilidade e escalabilidade. Esses sistemas são desenvolvidos com foco na segurança, confiabilidade e integridade dos dados, garantindo que as informações empresariais sejam protegidas contra acessos não autorizados e perdas de dados.&lt;/p&gt;

&lt;p&gt;Além disso, o software enterprise geralmente inclui recursos avançados, como relatórios e análises detalhadas, automação de processos, integração com outros sistemas externos, suporte a múltiplos idiomas e moedas, e funcionalidades de colaboração e comunicação interna.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ecossistema Enterprise
&lt;/h2&gt;

&lt;p&gt;Dentro da definição de software enterprise, o termo "ecossistema enterprise" refere-se à interconexão e interdependência entre pessoas, processos e tecnologia dentro de uma organização. Esses três componentes são fundamentais para o funcionamento eficiente e eficaz de uma empresa que utiliza software voltado para o ambiente corporativo.&lt;/p&gt;

&lt;p&gt;Pessoas: No ecossistema enterprise, as pessoas desempenham um papel crucial. Isso inclui todos os membros da organização, desde executivos e gerentes até os funcionários de diferentes departamentos. Essas pessoas são responsáveis por tomar decisões, executar tarefas, colaborar e interagir com o software e outros sistemas dentro do ambiente corporativo. O ecossistema enterprise valoriza a colaboração e a comunicação entre as pessoas para alcançar os objetivos organizacionais.&lt;/p&gt;

&lt;p&gt;Processos: Os processos empresariais são os fluxos de trabalho e as atividades estruturadas que ocorrem dentro de uma organização. Eles podem envolver desde processos internos, como gestão de projetos, compras e recursos humanos, até processos externos, como atendimento ao cliente, cadeia de suprimentos e vendas. No ecossistema enterprise, o software desempenha um papel fundamental na automação e otimização desses processos, garantindo maior eficiência, rastreabilidade e conformidade.&lt;/p&gt;

&lt;p&gt;Tecnologia: A tecnologia desempenha um papel central no ecossistema enterprise. Isso inclui o software empresarial em si, bem como a infraestrutura tecnológica que suporta sua operação, como servidores, redes, bancos de dados e dispositivos móveis. O software enterprise é projetado para atender às necessidades específicas de uma organização, permitindo a integração com outros sistemas, a manipulação de grandes volumes de dados e a análise de informações para tomar decisões fundamentadas.&lt;/p&gt;

&lt;p&gt;Dentro do ecossistema enterprise, a interação entre pessoas, processos e tecnologia é essencial para impulsionar a produtividade, melhorar a eficiência operacional, promover a inovação e alcançar os objetivos organizacionais. Uma abordagem integrada e colaborativa, que reconhece a importância desses três componentes e busca alinhar seus esforços, é fundamental para o sucesso de um software enterprise e para a organização como um todo.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Escalabilidade&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Escalabilidade é a capacidade de um sistema se adaptar e lidar com o aumento da carga de trabalho, seja em termos de volume de dados, número de usuários ou complexidade das operações. Um sistema escalável é aquele que pode crescer e se expandir sem comprometer o desempenho ou a qualidade do serviço. Por exemplo, a arquitetura de microsserviços permite que as empresas escalem seus sistemas de forma eficiente, adicionando ou removendo componentes conforme necessário, e utilizando técnicas como balanceamento de carga e autoescalabilidade em ambientes de nuvem.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Disponibilidade&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Disponibilidade é a capacidade de um sistema estar acessível e operacional quando necessário. Em um ambiente empresarial, a alta disponibilidade é essencial para garantir a continuidade dos negócios e minimizar o tempo de inatividade. Soluções como redundância de hardware, balanceamento de carga e recuperação de desastres são exemplos de estratégias para aumentar a disponibilidade de um sistema. Além disso, a implementação de monitoramento proativo e manutenção preventiva pode ajudar a identificar e resolver problemas antes que eles afetem a disponibilidade do sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Segurança&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;A segurança é uma preocupação fundamental no ambiente empresarial, pois envolve a proteção de informações confidenciais, propriedade intelectual e ativos de TI. As empresas devem implementar políticas e tecnologias de segurança robustas para proteger seus sistemas e dados contra ameaças internas e externas. Isso inclui criptografia, autenticação de dois fatores, firewalls e sistemas de detecção de intrusão. Além disso, a conscientização e treinamento dos funcionários em práticas de segurança e a implementação de processos de auditoria e conformidade também são fundamentais para garantir a segurança dos sistemas empresariais.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Customização e Modularização&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Customização é a capacidade de adaptar um software às necessidades específicas de uma organização, enquanto a modularização é a prática de dividir um sistema em componentes menores e independentes. Ambos os conceitos são importantes no desenvolvimento de software enterprise, pois permitem que as empresas personalizem e adaptem suas soluções conforme necessário. Um exemplo de customização é a criação de um módulo específico para gerenciar o processo de vendas de uma empresa, enquanto a modularização pode ser vista na arquitetura de microsserviços mencionada anteriormente. A modularização também facilita a manutenção e atualização do software, permitindo que as empresas implementem melhorias e correções de forma mais ágil e eficiente.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Integração&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Integração é o processo de conectar diferentes sistemas e aplicativos para que possam trabalhar juntos de forma eficiente. No ambiente empresarial, a integração é essencial para garantir que os dados e processos fluam de forma eficiente entre os diversos sistemas e departamentos. As empresas podem utilizar APIs (Application Programming Interfaces), ETL (Extract, Transform, Load) e outras tecnologias de integração para conectar seus sistemas e garantir a troca de informações em tempo real. Além disso, a integração também pode envolver a utilização de padrões e protocolos comuns, como o REST e o SOAP, para facilitar a comunicação entre sistemas heterogêneos e garantir a interoperabilidade.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Observabilidade&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Observabilidade é a capacidade de monitorar e compreender o comportamento de um sistema a partir de suas saídas e métricas. No contexto empresarial, a observabilidade é crucial para garantir a estabilidade, o desempenho e a segurança dos sistemas. As empresas podem utilizar ferramentas de monitoramento, como o Prometheus e o Grafana, para coletar e analisar métricas de desempenho, identificar problemas e otimizar seus sistemas. Além disso, a observabilidade também envolve a análise de logs e a implementação de alertase notificações para garantir que os administradores de sistemas estejam cientes de quaisquer problemas em tempo real.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concluindo
&lt;/h2&gt;

&lt;p&gt;Em resumo, o Software Enterprise é um software desenvolvido para atender às necessidades complexas de grandes organizações, enquanto o ecossistema Enterprise refere-se ao conjunto de componentes e sistemas interconectados que trabalham em conjunto para suportar as operações e objetivos de uma empresa.&lt;/p&gt;

</description>
      <category>desenvolviment</category>
      <category>software</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Série React Hooks: useMemo</title>
      <dc:creator>Taise Soares</dc:creator>
      <pubDate>Tue, 06 Jun 2023 12:24:00 +0000</pubDate>
      <link>https://dev.to/taisesoares/serie-react-hooks-usememo-5pc</link>
      <guid>https://dev.to/taisesoares/serie-react-hooks-usememo-5pc</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cndT3JT8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3cq82utxhjrbbgsobc6o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cndT3JT8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3cq82utxhjrbbgsobc6o.png" alt="Hook Reactjs" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Olá pessoas, bora continuar nossa séria sobre os hooks do nosso querido ReactJS, e hoje vamos falar sobre um dos seus hooks úteis chamado &lt;strong&gt;&lt;code&gt;useMemo&lt;/code&gt;&lt;/strong&gt;. Se você já trabalha com React há algum tempo, talvez tenha se deparado com situações em que precisa otimizar o desempenho dos seus componentes. Bem, não se preocupe! &lt;strong&gt;&lt;code&gt;useMemo&lt;/code&gt;&lt;/strong&gt; está aqui para salvar o dia.&lt;/p&gt;

&lt;p&gt;Caso queriam ver os outros artigos sobre essa série, segue links de artigos anteriores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-useimperativehandle-44d"&gt;Série React Hooks: useImperativeHandle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-usedeferredvalue-13d"&gt;Série React Hooks: useDeferredValue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-usecallback-49ap"&gt;Série React Hooks: useCallback&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-usesyncexternalstore-2lpk"&gt;Série React Hooks: useSyncExternalStore&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-useref-2mjl"&gt;Série React Hooks: useRef&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Mas, afinal de contas, o que diabos o &lt;strong&gt;&lt;code&gt;useMemo&lt;/code&gt;&lt;/strong&gt; faz? 🤔
&lt;/h2&gt;

&lt;p&gt;Calma, meu pequeno gafanhoto, tem tudo a ver com memoização. Hã? &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EJTBvR0s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fjxxokvs11qy3k9tg0da.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EJTBvR0s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fjxxokvs11qy3k9tg0da.png" alt="Memorização useMemo" width="497" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Primeiramente vamos resumir o que é memoização né ... Memoização é uma técnica de otimização que armazena os resultados de funções caras e os retorna quando os mesmos argumentos são fornecidos novamente, evitando a necessidade de recalcular o resultado. &lt;/p&gt;

&lt;p&gt;Sim, eu sei, parece sofisticado, mas é na verdade bem simples. Quando você usa o &lt;strong&gt;&lt;code&gt;useMemo&lt;/code&gt;&lt;/strong&gt;, está dizendo ao React para lembrar do valor que uma função retorna e recalcular apenas se as dependências mudarem. Em outras palavras, ele ajuda a evitar cálculos desnecessários e melhora o desempenho do seu aplicativo.&lt;/p&gt;

&lt;p&gt;Sabe quando você tem um cálculo super mega pesado acontecendo no seu componente React e isso está deixando tudo mais lento? Pois é meu pequeno gafanhoto, é aí que o &lt;code&gt;useMemo&lt;/code&gt; vem para salvar o nosso dia! &lt;/p&gt;

&lt;p&gt;Resumindo ele é um hook que te ajuda a otimizar seu componente, memorizando (ou armazenando em cache) o resultado de uma função, para que não precise ser recalculado toda vez que seu componente for renderizado novamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  OK mas como ele funciona ?
&lt;/h2&gt;

&lt;p&gt;Bom o &lt;code&gt;useMemo&lt;/code&gt; tem uma sintexe bem simples de se usar. Você só irá precisa passar uma função e um array de dependências, e ele retornará o resultado memorizado. Se as dependências não mudaram desde a última renderização, o React usará o resultado em cache em vez de chamar a função novamente (ai está a magica). Como falei ela tem uma sintexe bemmm básica, saca só o exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;memoizedValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useMemo&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;computeExpensiveValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YQcW0CnC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/odkmla1z2g5i7tntiz0e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YQcW0CnC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/odkmla1z2g5i7tntiz0e.png" alt="reactjs useMemo" width="400" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Confuso ainda? Bora para um exemplo simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&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;useMemo&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;const&lt;/span&gt; &lt;span class="nx"&gt;MyComponent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&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;expensiveResult&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useMemo&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;// Some heavy calculations here&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;someExpensiveFunction&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;dependency1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dependency2&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="c1"&gt;// Rest of your component code&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;// JSX stuff goes here&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;Vamos analisar esse exemplo, nele estamos definindo uma variável chamada &lt;strong&gt;&lt;code&gt;expensiveResult&lt;/code&gt;&lt;/strong&gt; usando &lt;strong&gt;&lt;code&gt;useMemo&lt;/code&gt;&lt;/strong&gt;. Dentro da função &lt;strong&gt;&lt;code&gt;useMemo&lt;/code&gt;&lt;/strong&gt;, a gente realiza alguns cálculos complexos ou chama uma função muito custosa parao nosso projeto (no nosso caso, &lt;strong&gt;&lt;code&gt;someExpensiveFunction()&lt;/code&gt;&lt;/strong&gt;), e esse resultado é armazenado em &lt;strong&gt;&lt;code&gt;expensiveResult&lt;/code&gt;&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;O segundo argumento do &lt;strong&gt;&lt;code&gt;useMemo&lt;/code&gt;&lt;/strong&gt; é um array de dependências que indica ao React quando recalcular o valor. Se alguma das dependências mudar, a função será reexecutada.&lt;/p&gt;

&lt;p&gt;A beleza do &lt;strong&gt;&lt;code&gt;useMemo&lt;/code&gt;&lt;/strong&gt; está em permitir que você otimize seus componentes evitando cálculos desnecessários. Vamos para um outro exemplo, digamos que você tem um componente que exibe uma lista de usuários e seus detalhes, mas você só quer mostrar os usuários que estão ativos. Nesse cénario podemos usar o &lt;code&gt;useMemo&lt;/code&gt; para filtrar a lista e evitar recalculá-la a cada renderização. Vamos ver como ficaria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&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;useMemo&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="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;isActive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&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;UserList&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;User&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;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;users&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;activeUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useMemo&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="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&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;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isActive&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;users&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;ul&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;activeUsers&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;user&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&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;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&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;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse novo exemplo, a função de cálculo passada para o &lt;strong&gt;&lt;code&gt;useMemo&lt;/code&gt;&lt;/strong&gt; filtra os usuários com base na propriedade &lt;strong&gt;&lt;code&gt;isActive&lt;/code&gt;&lt;/strong&gt;, retornando apenas os usuários ativos. A dependência fornecida é o array &lt;strong&gt;&lt;code&gt;users&lt;/code&gt;&lt;/strong&gt;, ou seja, sempre que o array de usuários for alterado, a função de cálculo será executada novamente.&lt;/p&gt;

&lt;p&gt;O resultado do &lt;strong&gt;&lt;code&gt;useMemo&lt;/code&gt;&lt;/strong&gt; é armazenado na variável &lt;strong&gt;&lt;code&gt;activeUsers&lt;/code&gt;&lt;/strong&gt;. Essa variável contém o resultado da filtragem dos usuários ativos. Em seguida, é renderizada uma lista não ordenada &lt;strong&gt;&lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;&lt;/strong&gt;, onde cada elemento &lt;strong&gt;&lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;&lt;/strong&gt; representa um usuário ativo. O atributo &lt;strong&gt;&lt;code&gt;key&lt;/code&gt;&lt;/strong&gt; é definido como o &lt;strong&gt;&lt;code&gt;id&lt;/code&gt;&lt;/strong&gt; do usuário para ajudar o React a otimizar a renderização de lista.&lt;/p&gt;

&lt;p&gt;A utilização do &lt;strong&gt;&lt;code&gt;useMemo&lt;/code&gt;&lt;/strong&gt; neste exemplo é útil para evitar que o cálculo de usuários ativos seja realizado a cada renderização do componente &lt;strong&gt;&lt;code&gt;UserList&lt;/code&gt;&lt;/strong&gt;. Como a função de cálculo é executada apenas quando a dependência &lt;strong&gt;&lt;code&gt;users&lt;/code&gt;&lt;/strong&gt; é alterada, se a prop &lt;strong&gt;&lt;code&gt;users&lt;/code&gt;&lt;/strong&gt; não sofrer alterações, o valor memoizado será retornado, evitando cálculos desnecessários e melhorando o desempenho da aplicação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--D3NRDtpN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/92krc57p78plscmy0m1w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--D3NRDtpN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/92krc57p78plscmy0m1w.png" alt="beleza" width="800" height="988"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Beleza, mas quando você deve usar useMemo? 🤔
&lt;/h2&gt;

&lt;p&gt;Maravilha agora, você pode estar pensando: "Isso é incrível! Vou usar &lt;code&gt;useMemo&lt;/code&gt; em todos os lugares!" Mas calma lá pequeno gafanhoto! Com grandes poderes vem grandes responsabilidades&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;useMemo&lt;/code&gt; é ótimo para otimizar o desempenho, mas nem sempre é necessário. Você deve usá-lo apenas quando estiver lidando com cálculos pesados ou quando quiser evitar renderizações desnecessárias causadas por novas referências de objetos.&lt;/p&gt;

&lt;p&gt;Por mais que o &lt;code&gt;useMemo&lt;/code&gt; possa ser muito útil, é importante não usá-lo em excesso. Adicioná-lo em todos os lugares pode realmente prejudicar o desempenho de sua aplicação, porque a memorização tem seu próprio custo. Portanto, use-o apenas quando tiver certezade que fará uma diferença notável ok?&lt;/p&gt;

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

&lt;p&gt;Enfim pessoas! O &lt;code&gt;useMemo&lt;/code&gt; é um hook bacana que pode te ajudar a otimizar seus componentes React armazenando em cache os resultados de cálculos pesados. Essa é a mágica do &lt;strong&gt;&lt;code&gt;useMemo&lt;/code&gt;&lt;/strong&gt;! É uma ferramenta simples, porém poderosa, para otimizar seus componentes React,  só lembre-se de usá-lo com sabedoria e apenas quando realmente necessário, pois o uso desnecessário do &lt;strong&gt;&lt;code&gt;useMemo&lt;/code&gt;&lt;/strong&gt; pode prejudicar o desempenho do seu aplicativo.&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>usememo</category>
    </item>
    <item>
      <title>call(), apply() e bind() - Os Três Patetas do JavaScript</title>
      <dc:creator>Taise Soares</dc:creator>
      <pubDate>Fri, 02 Jun 2023 00:38:57 +0000</pubDate>
      <link>https://dev.to/taisesoares/call-apply-e-bind-os-tres-patetas-do-javascript-1pdd</link>
      <guid>https://dev.to/taisesoares/call-apply-e-bind-os-tres-patetas-do-javascript-1pdd</guid>
      <description>&lt;p&gt;Olá pessoas, como estão? Baummm ? Espero que sim. Hoje vamos falar sobre três amigos inseparáveis do JavaScript: &lt;code&gt;call()&lt;/code&gt;, &lt;code&gt;apply()&lt;/code&gt; e &lt;code&gt;bind()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LWqlqsSu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1fpsgy8haa5y4t9xwo6j.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LWqlqsSu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1fpsgy8haa5y4t9xwo6j.gif" alt="happy javascript" width="800" height="455"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Se você já se deparou com esses três, pode ter ficado um pouco confuso, mas não se preocupe, vou tentar aqui clarear as ideias. Vamos lá! &lt;/p&gt;

&lt;h2&gt;
  
  
  Método &lt;code&gt;call()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;O método &lt;code&gt;call()&lt;/code&gt; é uma verdadeira mão na roda quando você precisa invocar uma função e definir um valor específico para o &lt;code&gt;"this"&lt;/code&gt;. Ele permite que você chame uma função, passando um objeto para o qual o &lt;code&gt;"this"&lt;/code&gt; será definido dentro da função. &lt;/p&gt;

&lt;p&gt;Esse método &lt;code&gt;call()&lt;/code&gt; é utilizado para invocar uma função com um determinado contexto de execução e uma lista de argumentos passados separadamente. Ele aceita um objeto como primeiro parâmetro, que será o valor de this dentro da função chamada. Em seguida, você pode passar os argumentos da função separadamente como argumentos subsequentes. Bora de um exemplo:&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;function&lt;/span&gt; &lt;span class="nx"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Olá, &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;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;! Bem-vindo(a) ao &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;local&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ana&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;local&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;restaurante&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;otherPerson&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Carlos&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;local&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hotel&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Olá, Ana! Bem-vindo(a) ao restaurante!&lt;/span&gt;
&lt;span class="nx"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;otherPerson&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Olá, Carlos! Bem-vindo(a) ao hotel!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, temos uma função &lt;code&gt;greeting()&lt;/code&gt; que imprime uma mensagem de boas-vindas personalizada com base nas propriedades nome e local. Em seguida, temos dois objetos: &lt;code&gt;person&lt;/code&gt; e &lt;code&gt;otherPerson&lt;/code&gt;, cada um com suas próprias propriedades nome e local.&lt;/p&gt;

&lt;p&gt;Ao utilizar o método &lt;code&gt;call()&lt;/code&gt; com a função &lt;code&gt;greeting()&lt;/code&gt;, passamos como argumento o objeto no qual queremos definir o valor de &lt;code&gt;this&lt;/code&gt;. Quando chamamos &lt;code&gt;greeting.call(person)&lt;/code&gt;, a função &lt;code&gt;greeting()&lt;/code&gt; é executada no contexto de pessoa, e a mensagem exibida é "Olá, Ana! Bem-vindo(a) ao restaurante!". Da mesma forma, ao chamar &lt;code&gt;greeting.call(otherPerson)&lt;/code&gt;, a função é executada no contexto de &lt;code&gt;otherPerson&lt;/code&gt;, e a mensagem exibida é "Olá, Carlos! Bem-vindo(a) ao hotel!".&lt;/p&gt;

&lt;p&gt;Dessa forma, o método &lt;code&gt;call()&lt;/code&gt; permite que você chame uma função e defina o valor de &lt;code&gt;this&lt;/code&gt; explicitamente, permitindo a reutilização de funções em diferentes contextos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Método &lt;code&gt;apply()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Já o método &lt;code&gt;apply()&lt;/code&gt; é muito parecido com o &lt;code&gt;call()&lt;/code&gt;, mas com uma diferença sutil. Enquanto o &lt;code&gt;call()&lt;/code&gt; espera os argumentos separados por vírgula, o &lt;code&gt;apply()&lt;/code&gt; espera que os argumentos sejam fornecidos como um array. O primeiro parâmetro ainda representa o valor de &lt;code&gt;this&lt;/code&gt; dentro da função. &lt;br&gt;
Ele é útil quando você possui uma função que espera receber seus argumentos como um array ou um objeto de argumentos. Vamos ver um exemplo para ficar mais claro:&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;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;João&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pointing&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;greeting&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="o"&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;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;pointing&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;args&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;Olá&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;!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Olá João!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, o método &lt;code&gt;greeting&lt;/code&gt; do objeto pessoa é invocado usando o método &lt;code&gt;apply()&lt;/code&gt;. O valor de &lt;code&gt;this&lt;/code&gt; é definido como person para garantir que o &lt;code&gt;this.name&lt;/code&gt; se refira à propriedade nome do objeto &lt;code&gt;person&lt;/code&gt;. Os argumentos são passados como um &lt;code&gt;array['Olá', '!']&lt;/code&gt;, resultando na saída &lt;code&gt;"Olá João!"&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Método &lt;code&gt;bind()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Por fim, temos o método &lt;code&gt;bind()&lt;/code&gt;. Diferente dos outros dois, o &lt;code&gt;bind()&lt;/code&gt; não invoca a função imediatamente. Em vez disso, ele retorna uma nova função, vinculada ao objeto que você passou como argumento. Dessa forma, você pode chamar essa nova função posteriormente. Ele não executa a função imediatamente, mas permite que você a invoque posteriormente. Além disso, você também pode pré-definir argumentos para a função retornada. Confuso? Vamos ver um exemplo:&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;car&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Fiat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Uno&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;displayCar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Brand: &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;brand&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, Model: &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;model&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="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;displayCaptur&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;car&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;displayCar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;car&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;displayCaptur&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse exemplo, temos um objeto carro com um método &lt;code&gt;displayCar()&lt;/code&gt;. Usando o &lt;code&gt;bind()&lt;/code&gt;, criamos uma nova função &lt;code&gt;displayCaptur&lt;/code&gt; que está vinculada ao objeto carro. Quando chamamos a função &lt;code&gt;displayCaptur()&lt;/code&gt;, ela exibe a marca e o modelo do carro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resumindo....
&lt;/h2&gt;

&lt;p&gt;Então, galera, é isso! Agora vocês estão por dentro das diferenças entre &lt;code&gt;call()&lt;/code&gt;, &lt;code&gt;apply()&lt;/code&gt; e &lt;code&gt;bind()&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Usem esses três patetas do JavaScript com sabedoria e aproveitem ao máximo suas funcionalidades. O &lt;code&gt;call()&lt;/code&gt; é perfeito quando você precisa invocar uma função e definir o valor do &lt;code&gt;"this"&lt;/code&gt; explicitamente, o &lt;code&gt;apply()&lt;/code&gt; é ótimo quando você quer passar os argumentos como um array e definir o valor do &lt;code&gt;"this"&lt;/code&gt;, enquanto o &lt;code&gt;bind()&lt;/code&gt; permite vincular um objeto a uma nova função para ser chamada posteriormente.&lt;/p&gt;

&lt;p&gt;Esses métodos podem ser muito úteis em várias situações de programação, especialmente quando você lida com objetos e precisa controlar o contexto do &lt;code&gt;"this"&lt;/code&gt; e os argumentos da função. Agora você tem essas poderosas ferramentas no seu arsenal de desenvolvedor.&lt;/p&gt;

&lt;p&gt;Então, pessoal, não se preocupem se os métodos &lt;code&gt;call()&lt;/code&gt;, &lt;code&gt;apply()&lt;/code&gt; e &lt;code&gt;bind()&lt;/code&gt; parecerem um pouco confusos no início. Com o tempo e a prática, vocês irão se acostumar a utilizá-los e aproveitar todos os benefícios que eles têm a oferecer. Mãos à obra e continuem explorando as maravilhas do JavaScript!&lt;/p&gt;

</description>
      <category>javascript</category>
    </item>
    <item>
      <title>Série React Hooks: useDeferredValue</title>
      <dc:creator>Taise Soares</dc:creator>
      <pubDate>Mon, 22 May 2023 12:06:22 +0000</pubDate>
      <link>https://dev.to/taisesoares/serie-react-hooks-usedeferredvalue-13d</link>
      <guid>https://dev.to/taisesoares/serie-react-hooks-usedeferredvalue-13d</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uBiuDLel--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/40nq2bmp8x6eummoc4m4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uBiuDLel--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/40nq2bmp8x6eummoc4m4.png" alt="Hook React" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Olá pessoas, como prometido bora continuar nossa série com os Hooks do ReactJs. &lt;/p&gt;

&lt;p&gt;Caso queriam ver os outros artigos sobre essa série, segue links de artigos anteriores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-useimperativehandle-44d"&gt;Série React Hooks: useImperativeHandle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-usememo-5pc"&gt;Série React Hooks: useMemo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-usecallback-49ap"&gt;Série React Hooks: useCallback&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-usesyncexternalstore-2lpk"&gt;Série React Hooks: useSyncExternalStore&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/taisesoares/serie-react-hooks-useref-2mjl"&gt;Série React Hooks: useRef&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E hoje vamos falar de um Hook, tecnicamente novo, lançado na versão 18 chamado &lt;code&gt;useDeferredValue&lt;/code&gt;. Mas vamos para a definição na doc oficial do react:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;useDeferredValue is a React Hook that lets you defer updating a part of the UI. -&lt;a href="https://react.dev/reference/react/useDeferredValue"&gt; Doc ReactJS&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HZYQE7y0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1ix6t0e150clpbu45g0m.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HZYQE7y0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1ix6t0e150clpbu45g0m.gif" alt="whats" width="640" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Não disse muita coisa né? Simplificando o &lt;code&gt;useDeferredValue&lt;/code&gt; é um hook do React que permite que você adie a atualização de um valor. Isso pode ser útil quando você quer evitar que a interface do usuário fique lenta ou travada devido a operações pesadas ou demoradas (imagine um filtro enorme ou um campo de pesquisa que retorne muitos dados)&lt;/p&gt;

&lt;h2&gt;
  
  
  Legal mas como ele funciona ?
&lt;/h2&gt;

&lt;p&gt;O &lt;code&gt;useDeferredValue&lt;/code&gt; recebe dois argumentos: o valor que você deseja adiar e um objeto de configuração com a propriedade &lt;code&gt;timeoutMs&lt;/code&gt;, que define o tempo máximo de adiamento em milissegundos. O hook retorna o valor adiado, que será atualizado após o tempo especificado.&lt;/p&gt;

&lt;p&gt;Vamos a um exemplo sem a utilização do &lt;code&gt;useDeferredValue&lt;/code&gt; ok. Neste exemplo, vamos criar de forma genérica uma lista de itens gerada por um loop for com um limite size, a filtragem da lista de itens ocorre a cada renderização, o que pode causar atrasos na entrada de texto se a lista for muito grande.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState } from 'react';

interface Item {
  id: number;
  name: string;
}

const generateItems = (size: number): Item[] =&amp;gt; {
  const items: Item[] = [];
  for (let i = 0; i &amp;lt; size; i++) {
    items.push({ id: i, name: `Item ${i}` });
  }
  return items;
};

const items = generateItems(1000); // Gera uma lista de 1000 itens

const App: React.FC = () =&amp;gt; {
  const [search, setSearch] = useState('');

  const filteredItems = items.filter(item =&amp;gt; item.name.includes(search));

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;input
        type="text"
        value={search}
        onChange={e =&amp;gt; setSearch(e.target.value)}
      /&amp;gt;
      &amp;lt;ul&amp;gt;
        {filteredItems.map(item =&amp;gt; (
          &amp;lt;li key={item.id}&amp;gt;{item.name}&amp;lt;/li&amp;gt;
        ))}
      &amp;lt;/ul&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default App;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note que nesse exemplo, estamos usando a função &lt;code&gt;generateItems&lt;/code&gt; para gerar uma lista de 1000 itens. A filtragem da lista de itens ocorre com base no valor search sem usar o hook &lt;code&gt;useDeferredValue&lt;/code&gt;. Isso pode causar atrasos na entrada de texto se a lista for muito grande ou a filtragem for complexa, já que a filtragem ocorre a cada renderização.&lt;/p&gt;

&lt;p&gt;Agora vamos ao mesmo exemplo, porém utilizando o hook &lt;code&gt;useDeferredValue&lt;/code&gt; para demonstrar a melhoria na responsividade do componente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState, useDeferredValue } from 'react';

interface Item {
  id: number;
  name: string;
}

const generateItems = (size: number): Item[] =&amp;gt; {
  const items: Item[] = [];
  for (let i = 0; i &amp;lt; size; i++) {
    items.push({ id: i, name: `Item ${i}` });
  }
  return items;
};

const items = generateItems(1000); // Gera uma lista de 1000 itens

const App: React.FC = () =&amp;gt; {
  const [search, setSearch] = useState('');

  const deferredSearch = useDeferredValue(search, { timeoutMs: 200 });

  const filteredItems = items.filter(item =&amp;gt; item.name.includes(deferredSearch));

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;input
        type="text"
        value={search}
        onChange={e =&amp;gt; setSearch(e.target.value)}
      /&amp;gt;
      &amp;lt;ul&amp;gt;
        {filteredItems.map(item =&amp;gt; (
          &amp;lt;li key={item.id}&amp;gt;{item.name}&amp;lt;/li&amp;gt;
        ))}
      &amp;lt;/ul&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default App;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora,  criamos uma função &lt;code&gt;generateItems&lt;/code&gt; que recebe um parâmetro &lt;code&gt;size&lt;/code&gt; e gera uma lista de itens com base nesse tamanho. A função é usada para gerar uma lista de 1000 itens, que é então filtrada com base no valor adiado &lt;code&gt;deferredSearch&lt;/code&gt; usando o hook &lt;code&gt;useDeferredValue&lt;/code&gt;. Isso permite que o React adie a atualização da lista de itens enquanto o usuário digita no campo de entrada, melhorando a responsividade do componente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ah legal mas como eu testo se isso é verdade?
&lt;/h2&gt;

&lt;p&gt;Bora fazer o teste? No primeiro exemplo ao renderizar em seu navegador (vou supor que você esteja utilizando no chrome), abra o seu devTools e vá na aba de &lt;code&gt;Performance&lt;/code&gt;. Apos isso click na &lt;code&gt;engrenagem&lt;/code&gt; ao lado das opções e altere a &lt;code&gt;CPU para 6x slowdown&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SZ1lx93a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/um2kkrkfv1mvduzdivv0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SZ1lx93a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/um2kkrkfv1mvduzdivv0.png" alt="devtools" width="778" height="327"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois faça o teste com ambos os projetos e notara a diferença de performance entre eles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Legal mas quando devo usa-lo?
&lt;/h2&gt;

&lt;p&gt;Você pode usar o &lt;code&gt;useDeferredValue&lt;/code&gt; em cenários onde a atualização imediata de um valor pode causar lentidão na interface do usuário. Por exemplo, ao filtrar uma lista grande de itens enquanto o usuário digita em um campo de pesquisa.&lt;/p&gt;

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

&lt;p&gt;Ao utilizar o &lt;code&gt;useDeferredValue&lt;/code&gt;, você ganha em performance, pois a atualização do valor é adiada, evitando que a interface fique lenta devido a operações pesadas ou demoradas. Por outro lado, ao não utilizar o &lt;code&gt;useDeferredValue&lt;/code&gt;, a performance pode ser afetada negativamente, pois a atualização do valor é imediata e pode causar lentidão na interface do usuário.&lt;/p&gt;

&lt;p&gt;É importante lembrar que o ganho de performance ao utilizar o &lt;code&gt;useDeferredValue&lt;/code&gt; depende do cenário e da complexidade das operações realizadas. Em alguns casos, o ganho pode ser significativo, enquanto em outros, pode ser mínimo.&lt;/p&gt;

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