<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Luiz Nison Filler - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Luiz Nison Filler - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 23 May 2026 19:22:12 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/author/luifiller/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Por que você deve usar o React.js para o desenvolvimento para a web ]]>
                </title>
                <description>
                    <![CDATA[ Se você é novo no React.js, você pode estar se perguntando o porquê de ele ser tão popular e por que você deveria usá-lo em suas aplicações. Se esse for o caso, você está no lugar certo. Vamos discutir o que torna o React.js tão bom e porque você deve ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/por-que-voce-deve-usar-o-react-js-para-o-desenvolvimento-para-a-web/</link>
                <guid isPermaLink="false">6509bbaaade67a03f81e53a8</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Luiz Nison Filler ]]>
                </dc:creator>
                <pubDate>Mon, 08 Apr 2024 10:36:36 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/03/image-7.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/why-use-react-for-web-development/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Why You Should Use React.js For Web Development</a>
      </p><p>Se você é novo no React.js, você pode estar se perguntando o porquê de ele ser tão popular e por que você deveria usá-lo em suas aplicações. Se esse for o caso, você está no lugar certo.</p><p>Vamos discutir o que torna o React.js tão bom e porque você deve usá-lo em seus projetos.</p><h1 id="-ndice"><strong>Índice</strong></h1><ul><li>Breve história do React.js</li><li>Por que você deveria usar o React?</li><li>O React é flexível</li><li>O React possui uma ótima experiência de desenvolvedor</li><li>O React tem suporte/recursos do Facebook</li><li>O React também tem um amplo suporte da comunidade</li><li>O React possui um ótimo desempenho</li><li>O React é fácil de testar</li></ul><h2 id="breve-hist-ria-do-react-js"><strong>Breve história do Rea<strong>ct.js</strong></strong></h2><p>O Facebook criou o <a href="https://reactjs.org/">React.js</a> em 2011 para o seu próprio uso. Como você sabe, Facebook é, atualmente, um dos maiores sites de redes sociais da web do mundo.</p><p>Em 2012, o Instagram, que é uma subsidiária do Facebook, também começou a utilizá-lo.</p><p>Em 2013, o Facebook disponibilizou o código do React.js como código-aberto. Inicialmente, a comunidade de desenvolvedores o rejeitou, pois fazia uso de Markup e JavaScript em um único arquivo. No entanto, à medida que mais pessoas experimentavam, elas começaram a apoiar a abordagem centrada em componentes para separação de responsabilidades.</p><p>Em 2014, diversas empresas grandes começaram a usar o React.js em seus ambientes de produção.</p><p>Em 2015, o Facebook também disponibilizou o código do <a href="https://reactnative.dev/">React Native</a> como código-aberto. O React Native é uma biblioteca que nos permite a criação de aplicativos nativos para dispositivos móveis em Android e iOS usando o React.js.</p><p>Em 2016, com a versão 15, o React.js começou a empregar o versionamento semântico. Isso também ajudou a transmitir à comunidade de desenvolvedores que o React estava mais estável.</p><p>Hoje, o React.js é usado por muitas empresas dentre as <strong><strong><a href="https://fortune.com/ranking/fortune500/">Fortune 500</a></strong>. </strong>O Facebook possui uma equipe de desenvolvedores em tempo integral dedicada ao React. Eles, regularmente, lançam correções de bugs, melhorias, postagens em blogs e documentação.</p><h2 id="por-que-voc-deveria-usar-o-react"><strong>Por que você deveria usar o React<strong>?</strong></strong></h2><p>Você pode estar se perguntando por que você deveria usar o React.js. Afinal, com o aumento dos usos do JavaScript nos últimos anos, sabemos que há uma variedade de opções disponíveis no mercado, tais como <a href="https://angular.io/">Angular </a>e <a href="https://vuejs.org/">Vue.js</a>. Então, por que React?</p><p>Vamos explorar os seis motivos principais para usar o React.js.</p><h2 id="o-react-flex-vel"><strong>O <strong>React </strong>é f<strong>lex</strong>ível</strong></h2><p>O React é consideravelmente flexível. Após aprendê-lo, você pode usá-lo numa variedade de plataformas para construir interfaces de usuário de qualidade. O React é uma biblioteca, NÃO um<em> framework</em>. Sua abordagem de biblioteca o possibilitou evoluir e se tornar uma ferramenta notável.</p><p>O React foi criado com um único foco: criar componentes para aplicações para a web. Um <a href="https://www.freecodecamp.org/news/how-to-write-better-react-components/">componente do React</a> (texto em inglês) pode ser qualquer coisa em sua aplicação para a web como, por exemplo, um botão, um texto, um <em>label</em> ou um <em>grid</em>.</p><p>Porém, à proporção que a popularidade do React cresceu, seu ecossistema também ampliou para abranger diversos casos de uso.</p><p>Você pode gerar um site estático com React usando ferramentas como, por exemplo, o <a href="https://www.gatsbyjs.com/">Gatsby</a>. Você pode usar o React Native para construir aplicações para dispositivos móveis. Você, igualmente, pode criar uma aplicação para desktop, usando uma ferramenta como o <a href="https://www.electronjs.org/">Electron</a>, que consegue ser executada em Mac e Windows com a tecnologia React.js.</p><p>O React, da mesma maneira, suporta à renderização no servidor de seus componentes usando ferramentas como o <a href="https://nextjs.org/">Next.js</a>. Você também pode usar o React.js para criar um site da web de realidade virtual e experiências em 360 graus usando o React VR.</p><blockquote>"Aprenda o React uma vez e escreva código em qualquer lugar" - Reactjs.org</blockquote><p>Você também pode usar o React em suas aplicações já existentes. O React foi projetado com isso em mente. Você pode mudar uma pequena parte da sua aplicação existente usando o React e, se essa alteração funcionar, você pode começar a converter sua aplicação inteira para o React.js. O Facebook aplicou a mesma abordagem.</p><blockquote>"A principal vantagem de se usar uma biblioteca em vez de um <em>framework</em> é o fato de que as bibliotecas são leves. Há uma liberdade para escolher ferramentas diversas. O <em>framework</em>, por outro lado, consiste em um ecossistema completo para se criar uma aplicação. Não existe um <em>modo fácil<em> </em></em>de se usar outras ferramentas que não sejam do <em>framework</em>."</blockquote><h2 id="o-react-possui-uma-tima-experi-ncia-de-desenvolvedor">O React possui uma ótima experiência de desenvolvedor</h2><p>Seu time se apaixonará pelo React quando eles começarem a programar com ele. O rápido desenvolvimento e a API enxuta do React combinados criam uma fantástica experiência de desenvolvimento.</p><p>A API do React é muito simples, pois possui poucos conceitos para aprender. Aqui está um curto exemplo de um componente do React:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/03/React-Component.png" class="kg-image" alt="React-Component" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/03/React-Component.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/03/React-Component.png 779w" sizes="(min-width: 720px) 720px" width="779" height="253" loading="lazy"><figcaption>Componente do React</figcaption></figure><p>Você precisa apenas importar a biblioteca do React. <strong><em>Message</em></strong> é um componente que recebe uma <em>props</em> (entrada) e retorna JSX.</p><p>JSX é uma sintaxe especial que se assemelha ao HTML, convertendo as chamadas da API do React e, ao final, renderizando HTML.</p><p><em>Frameworks</em> tradicionais, como o Angular e Vue, potencializam o HTML. Eles usam JavaScript dentro do HTML. Eles criaram atributos HTML que fornecem capacidades adicionais a ele.</p><p>O principal problema com essa abordagem é que você tem que aprender esses novos atributos do HTML ou sempre ficar consultando a documentação oficial.</p><p>Aqui está um exemplo de laço de repetição no Angular. Olhe o atributo <strong><strong>*ngFor</strong></strong>:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/03/Angular-Loops.png" class="kg-image" alt="Angular-Loops" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/03/Angular-Loops.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/03/Angular-Loops.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/03/Angular-Loops.png 1056w" sizes="(min-width: 720px) 720px" width="1056" height="196" loading="lazy"><figcaption>Exemplo de laço de repetição no Angular (Fonte: <a href="https://angular.io/">Angular</a>)</figcaption></figure><p>Aqui, por outro lado, temos um exemplo de laço de repetição no Vue.js. Dê uma olhada no atributo <strong><strong>v-for</strong></strong>:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/03/vue-looping.png" class="kg-image" alt="vue-looping" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/03/vue-looping.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/03/vue-looping.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/03/vue-looping.png 1062w" sizes="(min-width: 720px) 720px" width="1062" height="251" loading="lazy"><figcaption>Exemplo de laço de repetição no Vue (Fonte: <a href="https://vuejs.org/">vuejs.org</a>)</figcaption></figure><p>O React usa uma conduta oposta. Ele utiliza HTML (JSX) dentro do JavaScript. Eu gosto dessa abordagem porque, nela, você pode lidar com JavaScipt e HTML puros.</p><p>Aqui temos um exemplo de laço de repetição no React.js</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/03/loops-in-React.png" class="kg-image" alt="loops-in-React" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/03/loops-in-React.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/03/loops-in-React.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/03/loops-in-React.png 1179w" sizes="(min-width: 720px) 720px" width="1179" height="511" loading="lazy"><figcaption>Exemplo de laços de repetição no React (Fonte: <a href="https://reactjs.org/">Reactjs.org</a>)</figcaption></figure><p>‌O componente <strong><strong>NumberList </strong></strong>do React usa código em JavaScript puro (a função 'map'). Além disso, você pode observar que o JSX é uma simples, e bem conhecida, tag HTML com atributos elegantes. A função '<em>render</em>' está apenas renderizando o componente <em>NumberList</em> no elemento raiz no arquivo HTML.</p><p>O que mais você precisa, enquanto desenvolvedor, se tem à disposição uma plataforma onde você pode lidar com JavaScript e HTML puros e, ainda, criar uma Interface de Usuário interativa?</p><p><strong>Observação<strong>:</strong></strong> <em>quando eu digo "JavaScript puro", isso não significa que você usará simplesmente JavaScript no React. O React é uma biblioteca do JavaScript e ele possui sua camada baseada no próprio JavaScript. PORÉM, como eu disse, a API do React é bem enxuta e simples de aprender. Angular e Vue forçam suas regras a você. O React é mais conceitual. Ele mostra como você pode fazer um melhor uso do JavaScript no estilo do React.</em></p><p>O React.js também nos disponibiliza o pacote <a href="https://www.freecodecamp.org/news/how-to-build-a-react-project-with-create-react-app-in-10-steps/">create-react-app</a>, que permite a começar instantaneamente o desenvolvimento.</p><h2 id="o-react-tem-suporte-recursos-do-facebook">O React tem suporte/recursos do Facebook</h2><p>O React é amplamente usado na aplicação e no site da web do Facebook e no Instagram. É por isso que o Facebook é profundamente comprometido com isso. Eles usam mais de 50 mil componentes do React em seu ambiente de produção. Os quatro principais contribuidores do React no GitHub são funcionários em tempo integral do Facebook.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/03/React-js-Top-Contributors.jpg" class="kg-image" alt="React-js-Top-Contributors" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/03/React-js-Top-Contributors.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/03/React-js-Top-Contributors.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/03/React-js-Top-Contributors.jpg 1039w" sizes="(min-width: 720px) 720px" width="1039" height="642" loading="lazy"><figcaption>Maiores colaboradores do React.js</figcaption></figure><p>Além disso, o time do React mantém um <a href="https://reactjs.org/blog/all.html/">blog</a> que constantemente fornece detalhes de cada novo lançamento.</p><p>Por conta do sólido comprometimento do Facebook com o React em produção, quando ocorrem mudanças significativas (breaking changes) no React, o Facebook consistentemente provê um <a href="https://github.com/reactjs/react-codemod">Codemod</a> que automatiza a mudança. </p><p>O Codemod é uma ferramenta de linha de comando que automatiza mudanças em sua base de código. Quando uma nova especificação entra no React, o Codemod automaticamente substitui velhos componentes com a nova especificação.</p><p>Desde 2015, a popularidade do React tem crescido constantemente. Ele possui uma comunidade muito grande e bastante ativa. Seu <a href="https://github.com/facebook/react">repositório no GitHub</a> tem mais de 164 mil estrelas. É um dos cinco principais repositórios na plataforma.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/03/React-Git-Repository.png" class="kg-image" alt="React-Git-Repository" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/03/React-Git-Repository.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/03/React-Git-Repository.png 928w" width="928" height="434" loading="lazy"><figcaption>Repositório do React no GitHub</figcaption></figure><p>O <a href="https://www.npmjs.com/package/react">pacote do NPM</a> do React tem, também, milhões de downloads semanalmente.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/03/React-NPM-Package-Downlaods.png" class="kg-image" alt="React-NPM-Package-Downlaods" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/03/React-NPM-Package-Downlaods.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/03/React-NPM-Package-Downlaods.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/03/React-NPM-Package-Downlaods.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/03/React-NPM-Package-Downlaods.png 1799w" sizes="(min-width: 1200px) 1200px" width="1799" height="717" loading="lazy"></figure><p>Mais de 9 mil empresas relataram no <a href="https://stackshare.io/react">Stackshare</a> que estão usando React. Você até pode ver empresas da Fortune 500.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/03/Stackshare-React.png" class="kg-image" alt="Stackshare-React" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/03/Stackshare-React.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/03/Stackshare-React.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/03/Stackshare-React.png 1349w" sizes="(min-width: 1200px) 1200px" width="1349" height="485" loading="lazy"><figcaption>Empresas que usam o React</figcaption></figure><p>A <a href="https://www.reactiflux.com/">Reactiflux</a> é uma comunidade especialmente feita para desenvolvedores do React. Mais de 110 mil membros da comunidade estão engajados em ajudar a resolver e compartilhar problemas relativos ao React.</p><p>Um dos sites da web mais populares entre os desenvolvedores de software é o <a href="https://stackoverflow.com/">StackOverflow</a>. Você pode ver que há mais de 250 mil perguntas feitas sobre o React e bibliotecas relacionadas a ele.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/03/React-in-Stackoverflow.png" class="kg-image" alt="React-in-Stackoverflow" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/03/React-in-Stackoverflow.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/03/React-in-Stackoverflow.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/03/React-in-Stackoverflow.png 1202w" sizes="(min-width: 1200px) 1200px" width="1202" height="368" loading="lazy"><figcaption>React no StackOverflow</figcaption></figure><p>Em alguns casos, você nem precisa criar seus próprios componentes. Existem várias bibliotecas de componentes gratuitas e maduras disponíveis on-line.</p><p>Aqui estão alguns exemplos:</p><ul><li>A Microsoft criou a biblioteca de componente <a href="https://developer.microsoft.com/en-us/fluentui#/">Fluent UI</a>, que possibilita desenvolver sua interface de usuário (semelhante a do <a href="https://www.office.com/">office</a>).</li><li>A <a href="https://material-ui.com/">Material-UI</a> oferece componentes do React que implementam as diretrizes de interface de usuário do Google Material.</li><li>A <a href="https://react-bootstrap.github.io/">React-Bootstrap</a> contém componentes do React que facilitam o trabalho com o Bootstrap.</li><li>Ademais, confira a lista <a href="https://github.com/brillout/awesome-react-components">Awesome React Components</a> no GitHub para encontrar mais componentes do React.</li></ul><p>Também existem projetos/bibliotecas maduras relacionadas que você pode usar com React.</p><ul><li>Se você quiser roteamento, então pode empregar o <a href="https://reactrouter.com/">React Router</a>. Se você deseja gerenciar um sistema de dados mais complexo, então utilize o <a href="https://redux.js.org/">Redux</a> e o <a href="https://mobx.js.org/README.html">MobX</a><a href="https://redux.js.org/"></a><a href="https://mobx.js.org/README.html">.</a></li><li>Para testes automatizados, use <a href="https://jestjs.io/">Jest</a>, que também é desenvolvido pelo Facebook.</li><li>Para chamadas a APIs RESTful, use o <a href="https://graphql.org/">GraphQL</a>.</li><li>Para renderização do lado do servidor de componentes do React com Node, faça uso do <a href="https://expressjs.com/">Express.js</a>.</li></ul><p>Todas essas bibliotecas e ferramentas são importantes, pois se você está procurando criar algo no React, você encontrará na web ajuda e soluções em abundância para tudo o que precisar.</p><h2 id="react-possui-um-timo-desempenho">React possui um ótimo desempenho</h2><p>A equipe do React percebeu que o JavaScript é rápido, mas atualizar o DOM o torna lento. O React minimiza as mudanças no DOM, tendo descoberto uma mais eficiente e inteligente de atualizá-lo.</p><p>Antes do React, a maioria dos <em>frameworks</em> e bibliotecas atualizava o DOM de maneira não inteligente para refletir um novo estado, resultando em mudanças em uma parte significativa da página.</p><p>O React monitora os valores do estado de cada componente com o <a href="https://reactjs.org/docs/faq-internals.html">Virtual DOM</a>. Quando o estado do componente é alterado, o React compara o estado existente do DOM com o que o novo DOM deveria parecer. Depois disso, ele encontra a maneira menos custosa de atualizá-lo.</p><p>Isso não parece ser muito fácil, mas o React lida muito bem com isso nos bastidores. Ele possui múltiplos benefícios, tais como evitar o 'layout trashing', que ocorre quando o navegador tem de recalcular a posição de tudo quando o elemento do DOM é modificado.</p><p>Além disso, como a maioria das aplicações tem sido usada em dispositivos móveis, elas precisam ser altamente eficientes. Portanto, economizar bateria e poder de CPU é muito importante.</p><p>O modelo simples de programação do React permite que ele mude os estados automaticamente quando dados são atualizados. Isso ocorre na memória, o que torna o processo bastante rápido.</p><p>O tamanho da biblioteca do React também é enxuto. É de menos de <strong>6kb</strong> (menos de 3kb quando compactado em gzip). Isso é significativamente inferior ao tamanho dos seus concorrentes.</p><h2 id="o-react-f-cil-de-testar">O React é fácil de testar</h2><p>O design do React é muito amigável para testes.</p><ul><li>O teste de interfaces de usuário tradicionais pode ser complicado de configurar. Por outro lado, você requer bem pouca ou nenhuma configuração para testar no React.</li><li>Testar interfaces de usuário tradicionais requer navegadores para os testes, mas você pode testar componentes do React rápida e facilmente usando a linha de comando no Node.</li><li>Os testes tradicionais de interface de usuário no navegador são lentos. No entanto, os testes de linha de comando são rápidos e você pode executar uma quantidade considerável de conjuntos de testes ao mesmo tempo.</li><li>O teste tradicional de interface de usuário no navegador, frequentemente, consome tempo e é desafiador para manter. Os testes em React podem ser escritos rapidamente usando ferramentas como Jest e <a href="https://enzymejs.github.io/enzyme/">Enzyme</a>.</li></ul><p>Há uma vasta variedade de <em>frameworks</em> JavaScript de testes disponíveis na web, os quais você pode implementar para testar o React.js (uma vez que também é uma biblioteca JavaScript). Alguns dos <em>frameworks</em> populares são o <a href="https://mochajs.org/">Mocha</a>, o <a href="https://jasmine.github.io/">Jasmine</a>, o <a href="https://github.com/substack/tape">Tape</a>, o <a href="https://qunitjs.com/">QUnit</a> e o <a href="https://github.com/avajs/ava">AVA</a>.</p><h2 id="conclus-o">Conclusão</h2><p>O React é uma ferramenta excelente para criar aplicações interativas para dispositivos móveis, para a web e para outras plataformas.</p><p>Tanto a popularidade quanto a utilização do React estão aumentando dia a dia por uma boa razão. Como desenvolvedor, programar em React torna você melhor em JavaScript, uma linguagem que detém, atualmente, aproximadamente 90% do mercado de desenvolvimento para a web.</p><p><em>Muito obrigado por ler este artigo. Conecte-se com o autor pelo <a href="https://www.linkedin.com/in/suraj-surve/">LinkedIn</a>.</em></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como validar formulários do Angular orientados a templates ]]>
                </title>
                <description>
                    <![CDATA[ Introdução Neste artigo, aprenderemos sobre validações em formulários do Angular orientados a templates. Criaremos um formulário simples de registro de usuário e implementaremos algumas validações embutidas nele. Junto às validações embutidas, implementaremos algumas validações customizadas para o formulário orientado a templates. Consideraremos as seguintes validações customizadas para essa demonstração:  ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-validar-formularios-do-angular-orientados-a-templates/</link>
                <guid isPermaLink="false">64d62fa5802b5c066d51abd5</guid>
                
                    <category>
                        <![CDATA[ Angular ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Luiz Nison Filler ]]>
                </dc:creator>
                <pubDate>Thu, 05 Oct 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/10/5f9c9e88740569d1a4ca3da3.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-validate-angular-template-driven-forms/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Validate Angular Template-Driven Forms</a>
      </p><h2 id="introdu-o"><strong><strong>Introdução</strong></strong></h2><p>Neste artigo, aprenderemos sobre validações em formulários do Angular orientados a <em>templates</em>. Criaremos um formulário simples de registro de usuário e implementaremos algumas validações embutidas nele. Junto às validações embutidas, implementaremos algumas validações customizadas para o formulário orientado a templates.</p><p>Consideraremos as seguintes validações customizadas para essa demonstração:</p><ul><li>Verificação de disponibilidade do nome de usuário;</li><li>Validação de padrão de senha;</li><li>Correspondência da senha inserida em dois campos diferentes.</li></ul><p>Dê uma olhada na aplicação funcionando:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/10/TemplateFormValidation.gif" class="kg-image" alt="TemplateFormValidation" width="650" height="648" loading="lazy"></figure><h2 id="pr-requisitos"><strong><strong><strong><strong>Pr</strong></strong></strong>é-requisitos</strong></h2><ul><li>Instale o Visual Studio Code <a href="https://code.visualstudio.com/" rel="noreferrer noopener">aqui</a>;</li><li>Instale a última versão da Angular CLI por <a href="https://cli.angular.io/" rel="noreferrer noopener">aqui</a>;</li><li>Instale a última versão LTS do Node.js <a href="https://nodejs.org/pt-br/">aqui</a>.</li></ul><h2 id="c-digo-fonte"><strong>Código fonte</strong></h2><p>Você pode acessar o código fonte pelo <a href="https://github.com/AnkitSharma-007/angular-forms-validation" rel="noreferrer noopener">GitHub</a>.</p><h2 id="crie-a-aplica-o-do-angular"><strong>Crie a aplicação do <strong><strong><strong>Angular</strong></strong></strong></strong></h2><p>Navegue até o diretório no qual deseja criar o seu projeto. Abra uma janela de comando e execute o comando mostrado abaixo: &nbsp;</p><pre><code>ng new angular-forms-validation --routing=false --style=scss</code></pre><p>Estamos especificando o comando para criar uma aplicação do Angular. A opção para criar o módulo de roteamento é definida como <code>false</code> e a extensão de arquivos de estilização é definida como SCSS. Esse comando criará o projeto do Angular com o nome <code>angular-forms-validation</code>.</p><p>Dirija-se ao diretório do novo projeto e abra-o no VS Code usando o conjunto de comandos abaixo.</p><pre><code>cd angular-forms-validation
code .</code></pre><h2 id="instale-o-bootstrap"><strong>Instale<strong> </strong>o <strong>Bootstrap</strong></strong></h2><p>Execute o seguinte comando para instalar o Bootstrap:</p><pre><code>npm install bootstrap --save</code></pre><p>Adicione a seguinte definição de importação no arquivo <code>styles.scss</code> :</p><pre><code>@import "~bootstrap/dist/css/bootstrap.css";</code></pre><h2 id="crie-o-servi-o-de-valida-o"><strong>Crie o serviço de validação</strong></h2><p>Execute o seguinte comando para criar um serviço:</p><pre><code>ng g s services\customvalidation</code></pre><p>Esse comando criará um subdiretório chamado <code>services</code>, que possui dois arquivos dentro dele – <code>customvalidation.service.ts</code> e <code>customvalidation.service.spec.ts</code>. Abra <code>customvalidation.service.ts</code> e insira o seguinte código dentro dele.</p><pre><code>import { Injectable } from '@angular/core';
import { ValidatorFn, AbstractControl } from '@angular/forms';
import { FormGroup } from '@angular/forms';

@Injectable({
  providedIn: 'root'
})
export class CustomvalidationService {

  patternValidator(): ValidatorFn {
    return (control: AbstractControl): { [key: string]: any } =&gt; {
      if (!control.value) {
        return null;
      }
      const regex = new RegExp('^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9]).{8,}$');
      const valid = regex.test(control.value);
      return valid ? null : { invalidPassword: true };
    };
  }

  MatchPassword(password: string, confirmPassword: string) {
    return (formGroup: FormGroup) =&gt; {
      const passwordControl = formGroup.controls[password];
      const confirmPasswordControl = formGroup.controls[confirmPassword];

      if (!passwordControl || !confirmPasswordControl) {
        return null;
      }

      if (confirmPasswordControl.errors &amp;&amp; !confirmPasswordControl.errors.passwordMismatch) {
        return null;
      }

      if (passwordControl.value !== confirmPasswordControl.value) {
        confirmPasswordControl.setErrors({ passwordMismatch: true });
      } else {
        confirmPasswordControl.setErrors(null);
      }
    }
  }

  userNameValidator(userControl: AbstractControl) {
    return new Promise(resolve =&gt; {
      setTimeout(() =&gt; {
        if (this.validateUserName(userControl.value)) {
          resolve({ userNameNotAvailable: true });
        } else {
          resolve(null);
        }
      }, 1000);
    });
  }

  validateUserName(userName: string) {
    const UserList = ['ankit', 'admin', 'user', 'superuser'];
    return (UserList.indexOf(userName) &gt; -1);
  }
}</code></pre><p>O método <code>patternValidator</code> é usado para validar o padrão de senha no seu formulário. O parâmetro para esse método é do tipo <code>AbstractControl</code>, que é uma classe base para o<code>FormControl</code>.</p><p>Usaremos uma expressão regular para validar a senha. Ela verificará as seguintes quatro condições na senha:</p><ul><li>A senha deve ter, no mínimo, oito caracteres;</li><li>Deve possuir pelo menos uma letra minúscula;</li><li>Deve conter, no mínimo, uma letra maiúscula;</li><li>Deve ter, ao menos, um número.</li></ul><p>Se a senha falhar na verificação da <em>regex</em>, definiremos a propriedade <code>invalidPassword</code> como sendo verdadeira (<em>true</em>).</p><p>O método <code>MatchPassword</code> é usado para comparar as senhas em dois campos. Esse método receberá dois parâmetros do tipo string, os quais representam os nomes dos campos a serem comparados. Utilizaremos o <code>FormControl</code> para esses dois campos e, em seguida, compararemos os valores contidos neles. Se os valores não corresponderem, definiremos a propriedade <code>passwordMismatch</code> como verdadeira (<em>true</em>).</p><p>O método <code>userNameValidator</code> é utilizado para verificar se o nome de usuário já foi utilizado ou não. Esse método receberá um parâmetro do tipo <code>AbstractControl</code>. </p><p>Verificaremos se o valor deste campo está presente em um <em>array </em>estático, <code>UserList</code>. Se o valor inserido pelo usuário já estiver presente, definiremos a propriedade <code>userNameNotAvailable</code> como verdadeira (<em>true</em>).</p><p>Estamos utilizando a função <code>setTimeout</code> para invocar essa verificação a cada dois segundos. Isso assegurará que o erro seja disparado após dois segundos a partir do momento em que o usuário parar de digitar no campo.</p><p>Por questão de simplicidade deste artigo, estamos fazendo o uso de um <em>array </em>estático para buscar a disponibilidade de nomes de usuário. Idealmente, essa deveria ser uma chamada de serviço ao servidor para procurar pelo valor em um banco de dados.</p><h2 id="crie-o-modelo-de-usu-rio"><strong>Crie o modelo de usuário</strong></h2><p>Crie uma pasta chamada <code>models</code> dentro de <code>src/app</code>. Adicione um novo arquivo dentro do diretório <code>models</code>, chamado <code>user.ts</code>. Insira o seguinte código dentro do arquivo <code>user.ts</code>. &nbsp; </p><pre><code>export class User {
    public name: string;
    public email: string;
    public username: string;
    public password: string;
    public confirmPassword: string;
}</code></pre><h2 id="crie-diretivas-customizadas"><strong><strong>Cr</strong>ie diretivas customizadas</strong></h2><p>Criaremos diretivas customizadas para implementar <em>validators</em> customizados para o formulário orientado a <em>templates</em>.</p><p>Execute o comando exibido abaixo para criar a diretiva <code>passwordPattern</code>. </p><pre><code>ng g d directives\passwordPattern</code></pre><p>Este comando criará uma pasta chamada <code>directives</code>, que possui dois arquivos dentro de si – <code>passwordPattern.directive.ts</code> e <code>passwordPattern.directive.spec.ts</code>. Abra o <code>passwordPattern.directive.ts</code> e insira o seguinte código dentro dele.</p><pre><code>import { Directive } from '@angular/core';
import { NG_VALIDATORS, Validator, AbstractControl } from '@angular/forms';
import { CustomvalidationService } from '../services/customvalidation.service';

@Directive({
  selector: '[appPasswordPattern]',
  providers: [{ provide: NG_VALIDATORS, useExisting: PasswordPatternDirective, multi: true }]
})
export class PasswordPatternDirective implements Validator {

  constructor(private customValidator: CustomvalidationService) { }

  validate(control: AbstractControl): { [key: string]: any } | null {
    return this.customValidator.patternValidator()(control);
  }
}</code></pre><p>Essa diretiva é usada para validar o padrão da senha. Implementaremos a interface <code>Validator</code> na classe <code>PasswordPatternDirective</code>. Sobrescreveremos o método <code>validate</code>, o qual recebe um parâmetro do tipo <code>AbstractControl</code>, que é o controle que desejamos validar. Em seguida, invocaremos o método <code>patternValidator</code> do serviço. </p><p>Execute o comando mostrado abaixo para criar a diretiva <code>matchPassword</code>:</p><pre><code>ng g d directives\matchPassword</code></pre><p>Abra o arquivo <code>matchPassword.directive.ts</code> e insira o seguinte código dentro dele:</p><pre><code>import { Directive, Input } from '@angular/core';
import { NG_VALIDATORS, Validator, ValidationErrors, FormGroup } from '@angular/forms';
import { CustomvalidationService } from '../services/customvalidation.service';

@Directive({
  selector: '[appMatchPassword]',
  providers: [{ provide: NG_VALIDATORS, useExisting: MatchPasswordDirective, multi: true }]
})
export class MatchPasswordDirective implements Validator {
  @Input('appMatchPassword') MatchPassword: string[] = [];

  constructor(private customValidator: CustomvalidationService) { }

  validate(formGroup: FormGroup): ValidationErrors {
    return this.customValidator.MatchPassword(this.MatchPassword[0], this.MatchPassword[1])(formGroup);
  }
}</code></pre><p>Essa diretiva é usada para validar se as senhas inseridas nos dois campos correspondem ou não. Essa diretiva receberá uma entrada do tipo <em>array </em>de <em>strings</em>, o qual contém os campos a serem comparados. Sobrescreveremos o método <code>validate</code> e passaremos o parâmetro do tipo <code>FormGroup</code>. Em seguida, invocaremos o método <code>MatchPassword</code> do serviço. &nbsp;</p><p>Execute o comando abaixo para criar a diretiva <code>validateUserName</code>:</p><pre><code>ng g d directives\validateUserName</code></pre><p>Abra o arquivo <code>validateUserName.directive.ts</code> e introduza o seguinte código nele:</p><pre><code>import { Directive, forwardRef } from '@angular/core';
import { Validator, AbstractControl, NG_ASYNC_VALIDATORS } from '@angular/forms';
import { CustomvalidationService } from '../services/customvalidation.service';
import { Observable } from 'rxjs';

@Directive({
  selector: '[appValidateUserName]',
  providers: [{ provide: NG_ASYNC_VALIDATORS, useExisting: forwardRef(() =&gt; ValidateUserNameDirective), multi: true }]

})
export class ValidateUserNameDirective implements Validator {

  constructor(private customValidator: CustomvalidationService) { }

  validate(control: AbstractControl): Promise&lt;{ [key: string]: any }&gt; | Observable&lt;{ [key: string]: any }&gt; {
    return this.customValidator.userNameValidator(control);
  }
}</code></pre><p>Essa diretiva é usada para validar a disponibilidade do nome de usuário. Sobrescreveremos o método <code>validate</code> e passaremos um parâmetro do tipo <code>AbstractControl</code>. Em seguida, invocaremos o método <code>userNameValidator</code> do serviço. Esse método retornará uma <em>promise</em>.</p><h2 id="crie-o-componente-do-formul-rio-orientado-a-templates"><strong><strong>Cr</strong>ie o componente do formulário orientado a <em>templates</em></strong></h2><p>Execute o comando apresentado abaixo para criar o componente do formulário orientado a <em>templates</em>:</p><pre><code>ng g c template-driven-form</code></pre><p>Abra o arquivo <code>template-driven-form.component.ts</code> e insira o seguinte código nele:</p><pre><code>import { Component } from '@angular/core';
import { User } from '../models/user';

@Component({
  selector: 'app-template-driven-form',
  templateUrl: './template-driven-form.component.html',
  styleUrls: ['./template-driven-form.component.scss']
})
export class TemplateDrivenFormComponent {

  userModal = new User();

  constructor() { }

  onSubmit() {
    alert('Form Submitted succesfully!!!\n Check the values in browser console.');
    console.table(this.userModal);
  }
}</code></pre><p>Criamos um objeto <code>userModal</code> do tipo <code>User</code>. Vincularemos os campos do formulário com a propriedade desse objeto. O método <code>onSubmit</code> mostrará a mensagem de sucesso na tela e exibirá os conteúdos do formulário no console.</p><p>Abra o arquivo <code>template-driven-form.component.html</code> e introduza o seguinte código nele:</p><pre><code>&lt;div class="container"&gt;
    &lt;div class="row"&gt;
        &lt;div class="col-md-8 mx-auto"&gt;
            &lt;div class="card"&gt;
                &lt;div class="card-header"&gt;
                    &lt;h3&gt;Angular Template-driven Form&lt;/h3&gt;
                &lt;/div&gt;
                &lt;div class="card-body"&gt;
                    &lt;form class="form" #registerForm="ngForm" [appMatchPassword]="['password', 'confirmPassword']"
                        (ngSubmit)="registerForm.form.valid &amp;&amp; onSubmit()" novalidate&gt;
                        &lt;div class=" form-group"&gt;
                            &lt;label&gt;Name&lt;/label&gt;
                            &lt;input type="text" class="form-control" [(ngModel)]="userModal.name" name="name"
                                #name="ngModel" required&gt;
                            &lt;span class="text-danger"
                                *ngIf="(name.touched || registerForm.submitted) &amp;&amp; name.errors?.required"&gt;
                                Name is required
                            &lt;/span&gt;
                        &lt;/div&gt;
                        &lt;div class="form-group"&gt;
                            &lt;label&gt;Email&lt;/label&gt;
                            &lt;input type="text" class="form-control" [(ngModel)]="userModal.email" name="email"
                                #email="ngModel" required email&gt;
                            &lt;span class="text-danger"
                                *ngIf="(email.touched || registerForm.submitted) &amp;&amp; email.errors?.required"&gt;
                                Email is required
                            &lt;/span&gt;
                            &lt;span class="text-danger" *ngIf="email.touched &amp;&amp; email.errors?.email"&gt;
                                Enter a valid email address
                            &lt;/span&gt;
                        &lt;/div&gt;
                        &lt;div class="form-group"&gt;
                            &lt;label&gt;User Name&lt;/label&gt;
                            &lt;input type="text" class="form-control" [(ngModel)]="userModal.username" name="username"
                                #username="ngModel" appValidateUserName required&gt;
                            &lt;span class="text-danger"
                                *ngIf="(username.touched || registerForm.submitted) &amp;&amp; username.errors?.required"&gt;
                                User Name is required
                            &lt;/span&gt;
                            &lt;span class="text-danger" *ngIf="username.touched &amp;&amp; username.errors?.userNameNotAvailable"&gt;
                                User Name not available
                            &lt;/span&gt;
                        &lt;/div&gt;
                        &lt;div class="form-group"&gt;
                            &lt;label&gt;Password&lt;/label&gt;
                            &lt;input type="password" class="form-control" [(ngModel)]="userModal.password" name="password"
                                #password="ngModel" appPasswordPattern required&gt;
                            &lt;span class="text-danger"
                                *ngIf="(password.touched || registerForm.submitted) &amp;&amp; password.errors?.required"&gt;
                                Password is required
                            &lt;/span&gt;
                            &lt;span class="text-danger" *ngIf="password.touched &amp;&amp; password.errors?.invalidPassword"&gt;
                                Password should have minimum 8 characters, at least 1 uppercase letter, 1 lowercase
                                letter and 1 number
                            &lt;/span&gt;
                        &lt;/div&gt;
                        &lt;div class="form-group"&gt;
                            &lt;label&gt;Confirm Password&lt;/label&gt;
                            &lt;input type="password" class="form-control" [(ngModel)]="userModal.confirmPassword"
                                name="confirmPassword" #confirmPassword="ngModel" required&gt;
                            &lt;span class="text-danger"
                                *ngIf="(confirmPassword.touched || registerForm.submitted) &amp;&amp; confirmPassword.errors?.required"&gt;
                                Confirm Password is required
                            &lt;/span&gt;
                            &lt;span class="text-danger"
                                *ngIf="confirmPassword.touched &amp;&amp; confirmPassword.errors?.passwordMismatch"&gt;
                                Passwords doesnot match
                            &lt;/span&gt;
                        &lt;/div&gt;
                        &lt;div class="form-group"&gt;
                            &lt;button type="submit" class="btn btn-success"&gt;Register&lt;/button&gt;
                        &lt;/div&gt;
                    &lt;/form&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</code></pre><p>Criaremos um formulário orientado a <em>templates</em> e usaremos o card do Bootstrap para estilização. O <code>card-header</code> conterá um título, enquanto o <code>card-body</code> terá os campos do formulário.</p><p>Usaremos a diretiva <code>appMatchPassword</code> em nosso formulário e passaremos para validação os campos de senha e <code>confirmPassword</code>. A propriedade <code>ngModel</code> é usada para vincular o controle do formulário ao modelo.</p><p>Para validar a disponibilidade do nome de usuário, usaremos a diretiva <code>appValidateUserName</code> no campo <code>username</code>. Do mesmo modo, utilizaremos a diretiva <code>appPasswordPattern</code> no campo de senha para validar o padrão da senha.</p><p>Verificaremos os erros nos controles do formulário e, então, exibiremos na tela a mensagem de erro de validação apropriada.</p><h2 id="crie-um-componente-nav-bar"><strong><strong>Cr</strong>ie um componente nav-bar</strong></h2><p>Execute o comando abaixo para criar um componente <code>nav-bar</code>:</p><pre><code>ng g c nav-bar</code></pre><p>Abra o arquivo <code>nav-bar.component.html</code> e insira nele o seguinte código:</p><pre><code>&lt;nav class="navbar navbar-expand-sm navbar-dark bg-dark fixed-top"&gt;
    &lt;a class="navbar-brand" [routerLink]='["/"]'&gt;Form Validation Demo&lt;/a&gt;
    &lt;div class="collapse navbar-collapse"&gt;
        &lt;ul class="navbar-nav mr-auto"&gt;
            &lt;li class="nav-item"&gt;
                &lt;a class="nav-link" [routerLink]='["/template-form"]'&gt;Template Form&lt;/a&gt;
            &lt;/li&gt;
        &lt;/ul&gt;
    &lt;/div&gt;
&lt;/nav&gt;</code></pre><p>Aqui, estamos adicionando o link de navegação para o componente de formulário orientado a <em>templates</em>.</p><h2 id="atualize-o-componente-app"><strong>Atualize o componen<strong>t</strong>e <em>app</em></strong></h2><p>Abra o arquivo <code>app.component.html</code> e introduza nele o código a seguir:</p><pre><code>&lt;app-nav-bar&gt;&lt;/app-nav-bar&gt;
&lt;div class="container"&gt;
  &lt;router-outlet&gt;&lt;/router-outlet&gt;
&lt;/div&gt;</code></pre><h2 id="atualize-o-m-dulo-de-app"><strong>Atualize o módulo de <em>app</em></strong></h2><p>Importaremos o módulo de formulários e, também, configuraremos o roteamento para nossa aplicação no módulo do <code>app</code>. Adicione o seguinte código no arquivo <code>app.module.ts</code>. Você pode consultar o <a href="https://github.com/AnkitSharma-007/angular-forms-validation/blob/master/src/app/app.module.ts">GitHub</a> para obter o código fonte completo deste arquivo:</p><pre><code>import { RouterModule } from '@angular/router';
import { FormsModule } from  '@angular/forms';

@NgModule({
  ...    
  imports: [
    ...
    FormsModule,
    RouterModule.forRoot([
      { path: '', component: TemplateDrivenFormComponent },
      { path: 'template-form', component: TemplateDrivenFormComponent }
    ]),
  ],
})</code></pre><h2 id="execu-o-de-demonstra-o"><strong><strong>Execu</strong>ção de<strong> demo</strong>nstração</strong></h2><p>Use o comando a seguir para iniciar o servidor da web:</p><pre><code>ng serve -o</code></pre><p>Este comando iniciará a aplicação em seu navegador padrão no <code>http://localhost:4200/</code>. Você pode realizar todas as validações de formulário que discutimos aqui.</p><h2 id="resumo">Resumo</h2><p>Criamos um formulário de registro de usuário de exemplo usando a abordagem de formulário orientado a <em>templates</em> no Angular. Implementamos no formulário as validações nativas, assim como as validações customizadas. A biblioteca do Bootstrap foi usada para estilização do formulário.</p><p>Acesse o código-fonte pelo <a href="https://github.com/AnkitSharma-007/angular-forms-validation">GitHub</a> e explore o repositório para ter um melhor entendimento.</p><h2 id="veja-tamb-m-recursos-em-ingl-s-"><strong>Veja também (recursos em inglês)</strong></h2><ul><li><a href="https://ankitsharmablogs.com/reactive-form-validation-in-angular/">Reactive Form Validation In Angular</a></li><li><a href="https://ankitsharmablogs.com/localization-in-angular-using-i18n-tools/">Localization In Angular Using i18n Tools</a></li><li><a href="https://ankitsharmablogs.com/policy-based-authorization-in-angular-using-jwt/">Policy-Based Authorization In Angular Using JWT</a></li><li><a href="https://ankitsharmablogs.com/asp-net-core-using-highcharts-with-angular-5/">ASP.NET Core – Using Highcharts With Angular 5</a></li><li><a href="https://ankitsharmablogs.com/asp-net-core-crud-using-angular-and-entity-framework-core/">ASP.NET Core – CRUD Using Angular And Entity Framework Core</a></li></ul><p>Você pode encontrar este artigo em inglês, <a href="https://ankitsharmablogs.com/template-driven-form-validation-in-angular/">Template-Driven Form Validation In Angular</a>, e outros artigos semelhantes no <a href="https://ankitsharmablogs.com/">blog do autor</a>.<br></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
