<?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[ 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[ freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Wed, 29 Apr 2026 08:30:00 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Ep. 53 Julia Labs - Hardware, leds e Projetos criativos ]]>
                </title>
                <description>
                    <![CDATA[  Neste episódio, tive o prazer de conversar com Júlia Labs, engenheira de computação e criadora do projeto Julia Labs, sobre como ela transforma o mundo do hardware em algo criativo e acessível. Júlia compartilha sua jornada de empreendedora e produtora de conteúdo, destacando como a eletrônica pode ser mais ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/podcast-ep53/</link>
                <guid isPermaLink="false">67d97d82c7f60f04e485489b</guid>
                
                    <category>
                        <![CDATA[ podcast ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Nielda Karla ]]>
                </dc:creator>
                <pubDate>Thu, 04 Sep 2025 23:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2025/03/podcast-cover-test--20-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p></p><p>Neste episódio, tive o prazer de conversar com Júlia Labs, engenheira de computação e criadora do projeto Julia Labs, sobre como ela transforma o mundo do hardware em algo criativo e acessível. Júlia compartilha sua jornada de empreendedora e produtora de conteúdo, destacando como a eletrônica pode ser mais do que técnica, ela pode ser uma forma de arte. Ela também fala como a colaboração com a comunidade, a paixão pela criação e a mistura de tecnologia com arte podem inspirar novos projetos e desmistificar o universo do hardware para iniciantes.</p><p>Boa escuta! </p><hr><p>Obrigada por escutar ao podcast freeCodeCamp em português! Se você achar nosso conteúdo útil, compartilhe-o com seus amigos para ajudar mais pessoas a descobri-lo. Além disso, agradeceríamos muito se puder deixar uma avaliação 5 estrelas na plataforma que você usa para nos ouvir.</p><p>Se quiser nos apoiar ainda mais, você pode fazer isso visitando em <a href="https://www.freecodecamp.org/portuguese/news/podcast-ep09/freeCodeCamp.org/portuguese/donate">freeCodeCamp.org/portuguese/donate</a>.</p><p>Seu apoio é muito importante e nos ajuda a continuar a fornecer recursos educacionais de programação gratuitos.</p><h2 id="-links-de-julia"><strong><strong><strong>⭐️<strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Links</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong> de Julia </strong></h2><p>🔗 youTube: https://www.youtube.com/@julia_labs </p><p>🔗 Instagram: https://www.instagram.com/juliallabs/</p><p>🔗 Twitch: https://www.twitch.tv/julialabs </p><p>🔗 &nbsp;Site: https://julialabs.com.br/</p><p>🔗 &nbsp;TikTok: [tiktok.com/@juliallabs](https://tiktok.com/@juliallabs)</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Ep. 52 Jessica Temporal - Como as aplicações sabem quem é você? ]]>
                </title>
                <description>
                    <![CDATA[  No episódio de hoje vamos mergulhar em uma conversa fascinante com Jéssica Temporal,  Developer Advocate na Auth0, especialista em segurança e identidade digital. Jéssica compartilha sua trajetória única, desde sua formação em informática biomédica até sua atuação no mundo da tecnologia, passando pela transição para o universo da segurança ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/podcast-ep52/</link>
                <guid isPermaLink="false">67a0d4953a09600410f7b45c</guid>
                
                    <category>
                        <![CDATA[ podcast ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Nielda Karla ]]>
                </dc:creator>
                <pubDate>Thu, 31 Jul 2025 23:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2025/02/podcast-cover-test--19-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p></p><p>No episódio de hoje vamos mergulhar em uma conversa fascinante com Jéssica Temporal, &nbsp;Developer Advocate na Auth0, especialista em segurança e identidade digital. Jéssica compartilha sua trajetória única, desde sua formação em informática biomédica até sua atuação no mundo da tecnologia, passando pela transição para o universo da segurança cibernética. Ela aborda de forma acessível e prática os desafios e melhores práticas em autenticação, autorização e proteção de dados de usuários, essenciais para desenvolvedores que buscam criar sistemas mais seguros. Além disso, ela fala sobre sua trajetória profissional, desafios no mundo da programação e como a comunidade de tecnologia tem sido fundamental em sua jornada.</p><hr><p>Obrigada por escutar ao podcast freeCodeCamp em português! Se você achar nosso conteúdo útil, compartilhe-o com seus amigos para ajudar mais pessoas a descobri-lo. Além disso, agradeceríamos muito se puder deixar uma avaliação 5 estrelas na plataforma que você usa para nos ouvir.</p><p>Se quiser nos apoiar ainda mais, você pode fazer isso visitando em <a href="https://www.freecodecamp.org/portuguese/news/podcast-ep09/freeCodeCamp.org/portuguese/donate">freeCodeCamp.org/portuguese/donate</a>.</p><p>Seu apoio é muito importante e nos ajuda a continuar a fornecer recursos educacionais de programação gratuitos.</p><h2 id="-links-de-jessica"><strong><strong><strong>⭐️<strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Links</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong> de Jessica</strong></h2><p>🔗Site: &nbsp;<a href="https://jtemporal.com/livros/">https://jtemporal.com/livros/</a></p><p>🔗Site: <a href="https://gitfichas.com/">gitfichas.com</a></p><p>🔗Site: <a href="https://auth0.com/blog/rag-and-access-control-where-do-you-start/">https://auth0.com/blog/rag-and-access-control-where-do-you-start/</a></p><p>🔗Site: <a href="https://www.linkedin.com/safety/go?url=https%3A%2F%2Fjtemporal.com%2F&amp;trk=flagship-messaging-web&amp;messageThreadUrn=urn%3Ali%3AmessagingThread%3A2-OTQ3MDQ2ZTQtYWRlOS00M2Q2LWIzNjUtMTg5NGQxNjNlZjdkXzAxMA%3D%3D&amp;lipi=urn%3Ali%3Apage%3Ad_flagship3_profile_view_base%3BAvzDK3RtTh%2Be6Lrn6qrdiQ%3D%3D">j</a><a href="http://temporal.com">temporal.com</a></p><p>🔗Site: <a href="https://owasp.org/www-project-top-ten/">https://owasp.org/www-project-top-ten/</a></p><p>🔗Site: <a href="https://genai.owasp.org/llm-top-10/">https://genai.owasp.org/llm-top-10/</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Ep. 51 Téo Calvo - O Mago das ciências de Dados ]]>
                </title>
                <description>
                    <![CDATA[  No vídeo de hoje tive o prazer de conversar com o Téo Calvo, um estatístico e especialista na área de dados, com experiência em empresas como idwall e Grupo Boticário. É o criador da iniciativa Téo Me Why, onde ensina programação e ciência de dados gratuitamente na Twitch, acumulando ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/podcast-ep51/</link>
                <guid isPermaLink="false">679bdf9f3a09600410f7b446</guid>
                
                    <category>
                        <![CDATA[ podcast ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Nielda Karla ]]>
                </dc:creator>
                <pubDate>Thu, 03 Jul 2025 23:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2025/01/podcast-cover-test--18-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p></p><p>No vídeo de hoje tive o prazer de conversar com o Téo Calvo, um estatístico e especialista na área de dados, com experiência em empresas como idwall e Grupo Boticário. É o criador da iniciativa Téo Me Why, onde ensina programação e ciência de dados gratuitamente na Twitch, acumulando mais de 1800 horas de conteúdo. Téo compartilha sua jornada no mundo dos dados, falando sobre sua transição de carreira, desafios enfrentados e a importância de ter um propósito claro para guiar as decisões profissionais. Ele também discute a paixão pela área de tecnologia, a busca por novos desafios e como a prática e o aprendizado constante são fundamentais para o crescimento na carreira. </p><p>Boa escuta!</p><hr><p>Obrigada por escutar ao podcast freeCodeCamp em português! Se você achar nosso conteúdo útil, compartilhe-o com seus amigos para ajudar mais pessoas a descobri-lo. Além disso, agradeceríamos muito se puder deixar uma avaliação 5 estrelas na plataforma que você usa para nos ouvir.</p><p>Se quiser nos apoiar ainda mais, você pode fazer isso visitando em <a href="https://www.freecodecamp.org/portuguese/news/podcast-ep09/freeCodeCamp.org/portuguese/donate">freeCodeCamp.org/portuguese/donate</a>.</p><p>Seu apoio é muito importante e nos ajuda a continuar a fornecer recursos educacionais de programação gratuitos.</p><h2 id="-links-de-t-o"><strong><strong><strong>⭐️<strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Links</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong> de Téo </strong></h2><p>🔗 LinkedIn: &nbsp;<a href="https://www.linkedin.com/in/teocalvo/">https://www.linkedin.com/in/teocalvo/</a></p><p>🔗 Instagram: <a href="https://www.instagram.com/teomewhy/">https://www.instagram.com/teomewhy/</a></p><p>🔗 Twitch: &nbsp;<a href="https://www.twitch.tv/teomewhy">https://www.twitch.tv/teomewhy</a></p><p>🔗 GitHub: &nbsp;<a href="https://github.com/teocalvo">https://github.com/teocalvo</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Ep. 50 Guilherme Rodrigues - Apps Inteligentes No-Code e IA ]]>
                </title>
                <description>
                    <![CDATA[  No episódio de hoje falei com Guilherme Rodrigues, cofundador da WebDraw, uma plataforma que permite criar aplicativos usando inteligência artificial em questão de segundos. Conta sobre sua jornada empreendedora e como chegou no mundo da tecnologia até a criação de soluções inovadoras com inteligência artificial. Ele discute o impacto ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/podcast-ep50/</link>
                <guid isPermaLink="false">6797ef1627c9db04432d7660</guid>
                
                    <category>
                        <![CDATA[ podcast ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Nielda Karla ]]>
                </dc:creator>
                <pubDate>Thu, 05 Jun 2025 23:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2025/01/podcast-cover-test--2-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p></p><p>No episódio de hoje falei com Guilherme Rodrigues, cofundador da WebDraw, uma plataforma que permite criar aplicativos usando inteligência artificial em questão de segundos. Conta sobre sua jornada empreendedora e como chegou no mundo da tecnologia até a criação de soluções inovadoras com inteligência artificial. Ele discute o impacto da AI no desenvolvimento de software, a transformação do mercado brasileiro e como a tecnologia pode impulsionar a prosperidade do país. Além disso, Guilherme compartilha insights sobre liderança, aprendizado e como a inovação pode ser acessível a todos, independentemente do nível técnico. </p><p>Boa escuta!</p><hr><p>Obrigada por escutar ao podcast freeCodeCamp em português! Se você achar nosso conteúdo útil, compartilhe-o com seus amigos para ajudar mais pessoas a descobri-lo. Além disso, agradeceríamos muito se puder deixar uma avaliação 5 estrelas na plataforma que você usa para nos ouvir.</p><p>Se quiser nos apoiar ainda mais, você pode fazer isso visitando em <a href="https://www.freecodecamp.org/portuguese/news/podcast-ep09/freeCodeCamp.org/portuguese/donate">freeCodeCamp.org/portuguese/donate</a>.</p><p>Seu apoio é muito importante e nos ajuda a continuar a fornecer recursos educacionais de programação gratuitos.</p><h2 id="-links-de-guilherme"><strong><strong><strong>⭐️<strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Links</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong> de Guilherme </strong></h2><p>🔗 LinkedIn: &nbsp;<a href="https://www.linkedin.com/in/drawveloper/">https://www.linkedin.com/in/drawveloper/</a></p><p>🔗 Site: <a href="https://webdraw.com/community">https://webdraw.com/community</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Ep. 49 Sibelius Seraphini - Construção de uma fintech ]]>
                </title>
                <description>
                    <![CDATA[  Nesse episódio tive o prazer de conversar com Sibelius Seraphini, cofundador da Wolvi, uma fintech focada em soluções de pagamentos via PIX. Sibelio fala sobre sua trajetória no mundo das startups, desde a criação de sua primeira empresa até a construção da Wolvi, discutindo como a evolução do produto, ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/podcast-ep49/</link>
                <guid isPermaLink="false">6797eb1327c9db04432d764c</guid>
                
                    <category>
                        <![CDATA[ podcast ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Nielda Karla ]]>
                </dc:creator>
                <pubDate>Thu, 01 May 2025 23:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2025/01/podcast-cover-test--1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p></p><p>Nesse episódio tive o prazer de conversar com Sibelius Seraphini, cofundador da Wolvi, uma fintech focada em soluções de pagamentos via PIX. Sibelio fala sobre sua trajetória no mundo das startups, desde a criação de sua primeira empresa até a construção da Wolvi, discutindo como a evolução do produto, a importância da documentação, a automação de processos e a cultura de startup são fundamentais para o sucesso. Ele também fala sobre sua abordagem de aprendizado e como mantém o foco no longo prazo.</p><p>Boa escuta!</p><hr><p>Obrigada por escutar ao podcast freeCodeCamp em português! Se você achar nosso conteúdo útil, compartilhe-o com seus amigos para ajudar mais pessoas a descobri-lo. Além disso, agradeceríamos muito se puder deixar uma avaliação 5 estrelas na plataforma que você usa para nos ouvir.</p><p>Se quiser nos apoiar ainda mais, você pode fazer isso visitando em <a href="https://www.freecodecamp.org/portuguese/news/podcast-ep09/freeCodeCamp.org/portuguese/donate">freeCodeCamp.org/portuguese/donate</a>.</p><p>Seu apoio é muito importante e nos ajuda a continuar a fornecer recursos educacionais de programação gratuitos.</p><h2 id="-links-de-sibelius"><strong><strong><strong>⭐️<strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Links</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong> de </strong>Sibelius</h2><p></p><p> 🔗 Linkedin: https://www.linkedin.com/in/sibeliusseraphini/</p><p> 🔗X: https://x.com/sseraphini</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Ep. 48 Wagner Oliveira - Cibersegurança na Prática ]]>
                </title>
                <description>
                    <![CDATA[ No último episódio da terceira temporada tive o prazer de receber o Wagner Oliveira, gerente de infraestrutura de TI com mais de 28 anos de experiência em tecnologia. Wagner compartilha sua jornada na tecnologia, desde os primeiros passos no mercado até seu foco atual em cibersegurança, explicando os conceitos fundamentais ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/podcast-ep48/</link>
                <guid isPermaLink="false">675896dd0951fa04afda5ec9</guid>
                
                    <category>
                        <![CDATA[ podcast ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Nielda Karla ]]>
                </dc:creator>
                <pubDate>Thu, 03 Apr 2025 23:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2025/01/podcast-cover-test--17-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>No último episódio da terceira temporada tive o prazer de receber o Wagner Oliveira, gerente de infraestrutura de TI com mais de 28 anos de experiência em tecnologia. Wagner compartilha sua jornada na tecnologia, desde os primeiros passos no mercado até seu foco atual em cibersegurança, explicando os conceitos fundamentais e boas práticas para proteger dados e sistemas, especialmente no contexto do mercado financeiro. Além disso, ele fala sobre os desafios enfrentados ao longo da carreira e dá dicas para profissionais iniciantes na área de segurança da informação.</p><p>Boa escuta!</p><hr><p>Obrigada por escutar ao podcast freeCodeCamp em português! Se você achar nosso conteúdo útil, compartilhe-o com seus amigos para ajudar mais pessoas a descobri-lo. Além disso, agradeceríamos muito se puder deixar uma avaliação 5 estrelas na plataforma que você usa para nos ouvir.</p><p>Se quiser nos apoiar ainda mais, você pode fazer isso visitando em <a href="https://www.freecodecamp.org/portuguese/news/podcast-ep09/freeCodeCamp.org/portuguese/donate">freeCodeCamp.org/portuguese/donate</a>.</p><p>Seu apoio é muito importante e nos ajuda a continuar a fornecer recursos educacionais de programação gratuitos.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Ficha informativa de React com exemplos reais ]]>
                </title>
                <description>
                    <![CDATA[ Elaborei uma ficha informativa visual e abrangente para ajudá-lo a dominar todos os principais conceitos e recursos da biblioteca do React. > Nota da tradução: este texto foi escrito em 2021. Nos últimos três anos, algumas modificações do React podem ter tornado diversas partes deste artigo obsoletas. Criei esta ficha ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/ficha-informativa-de-react-com-exemplos-reais/</link>
                <guid isPermaLink="false">667721c279dc5c03cfad5133</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Filipe Virgínio Vital Torres Barbosa ]]>
                </dc:creator>
                <pubDate>Wed, 02 Apr 2025 00:57:08 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/12/the-react-cheatsheet-for-2021-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/react-cheatsheet-with-real-world-examples/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">https://www.freecodecamp.org/news/react-cheatsheet-with-real-world-examples/</a>
      </p><p>Elaborei uma ficha informativa visual e abrangente para ajudá-lo a dominar todos os principais conceitos e recursos da biblioteca do React.</p><blockquote>Nota da tradução: este texto foi escrito em 2021. Nos últimos três anos, algumas modificações do React podem ter tornado diversas partes deste artigo obsoletas.</blockquote><p><strong><strong>Criei es</strong>t<strong>a f</strong>icha informativa <strong>para ajudá-lo a otimizar seu aprendizado de React no menor tempo possível.</strong></strong></p><p>Ela inclui vários exemplos práticos para ilustrar cada recurso da biblioteca e como ela funciona usando padrões que você pode aplicar em seus próprios projetos.</p><p>Junto com cada trecho de código, adicionei muitos comentários úteis. Se você ler esses comentários, verá o que cada linha de código faz, como os diferentes conceitos se relacionam entre si e obterá um entendimento mais completo de como o React pode ser usado.</p><p>Observe que as palavras-chave particularmente úteis para você conhecer como desenvolvedor do React estão destacadas em negrito. Portanto, fique atento a elas.</p><ul><li>Guia de referência rápida para revisar quando e como quiser</li><li>Inúmeros de trechos de código copiáveis para facilitar a reutilização</li><li>Leia este enorme guia onde for melhor para você. No trem, na sua mesa, na fila... em qualquer lugar.</li></ul><p>Há muitas coisas ótimas para tratarmos. Então, vamos começar.</p><blockquote>Deseja executar qualquer um dos trechos de código abaixo? Crie uma aplicação em React para experimentar qualquer um desses exemplos usando a ferramenta on-line (gratuita) CodeSandbox. Você pode fazer isso instantaneamente visitando <a href="https://react.new/">react.new</a>.</blockquote><h2 id="sum-rio"><strong>Sumário</strong></h2><h3 id="fundamentos-do-react"><strong>Fundamentos do React</strong></h3><ul><li><a href="https://www.freecodecamp.org/news/react-cheatsheet-with-real-world-examples/#jsx-elements">Elementos JSX</a></li><li><a href="https://www.freecodecamp.org/news/react-cheatsheet-with-real-world-examples/#components-and-props">Componentes e <em>props</em></a></li><li><a href="https://www.freecodecamp.org/news/react-cheatsheet-with-real-world-examples/#lists-and-keys">Listas e chaves</a></li><li><a href="https://www.freecodecamp.org/news/react-cheatsheet-with-real-world-examples/#event-listeners-and-handling-events">Ouvintes de eventos e tratamento de eventos</a></li></ul><h3 id="hooks-essenciais-do-react"><strong>Hooks essenciais do React</strong></h3><ul><li><a href="https://www.freecodecamp.org/news/react-cheatsheet-with-real-world-examples/#state-and-usestate">State e useState</a></li><li><a href="https://www.freecodecamp.org/news/react-cheatsheet-with-real-world-examples/#side-effects-and-useeffect">Efeitos colaterais e useEffect</a></li><li><a href="https://www.freecodecamp.org/news/react-cheatsheet-with-real-world-examples/#refs-and-useref">Refs e useRef</a></li></ul><h3 id="hooks-e-desempenho"><strong>Hooks e desempenho</strong></h3><ul><li><a href="https://www.freecodecamp.org/news/react-cheatsheet-with-real-world-examples/#preventing-re-renders-and-react-memo">Prevenção de novas renderizações e React.memo</a></li><li><a href="https://www.freecodecamp.org/news/react-cheatsheet-with-real-world-examples/#callback-functions-and-usecallback">Funções de <em>callback</em> e useCallback</a></li><li><a href="https://www.freecodecamp.org/news/react-cheatsheet-with-real-world-examples/#memoization-and-usememo">Memoização e useMemo</a></li></ul><h3 id="hooks-avan-ados-do-react"><strong>Hooks avançados do React</strong></h3><ul><li><a href="https://www.freecodecamp.org/news/react-cheatsheet-with-real-world-examples/#context-and-usecontext">Contexto e useContext</a></li><li><a href="https://www.freecodecamp.org/news/react-cheatsheet-with-real-world-examples/#reducers-and-usereducer">Redutores e useReducer</a></li><li><a href="https://www.freecodecamp.org/news/react-cheatsheet-with-real-world-examples/#writing-custom-hooks">Escrevendo hooks personalizados</a></li><li><a href="https://www.freecodecamp.org/news/react-cheatsheet-with-real-world-examples/#rules-of-hooks">Regras de hooks</a></li></ul><h2 id="fundamentos-do-react-1"><strong>Fundamentos do React</strong></h2><h3 id="elementos-jsx"><strong>Elementos JSX</strong></h3><p>As aplicações em React são estruturadas usando uma sintaxe chamada <strong><strong>JSX</strong></strong>. Esta é a sintaxe de um <strong><strong>elemento JSX</strong></strong> básico.</p><pre><code class="language-js">/* 
  O JSX nos permite escrever em uma sintaxe quase idêntica à do HTML simples.
  O resultado disso é que o JSX é uma ferramenta poderosa para estruturar nossas aplicações.
  O JSX usa todas as tags HTML válidas (ou seja, div/span, h1-h6, form/input, img etc.).
*/

&lt;div&gt;Alô, React!&lt;/div&gt;

/* 
  Observação: esse JSX não seria visível porque precisa ser renderizado por nossa aplicação usando ReactDOM.render()
*/</code></pre><p>O JSX é a maneira mais comum de estruturar aplicações em React, mas não é obrigatório para o React.</p><pre><code class="language-js">/* O JSX é uma maneira mais simples de usar a função React.createElement()
Em outras palavras, as duas linhas a seguir no React são iguais: */

&lt;div&gt;Alô, React!&lt;/div&gt;  // sintaxe do JSX

React.createElement('div', null, 'Alô, React!'); // sintaxe do createElement</code></pre><p>O JSX não é compreendido pelo navegador. Ele precisa ser compilado em JavaScript puro para que o navegador possa entender.</p><p>O compilador mais comumente usado para JSX é chamado Babel.</p><pre><code class="language-js">/* 
  Quando nosso projeto é criado para ser executado no navegador, nosso JSX será convertido pelo Babel em chamadas simples da função React.createElement(). 
  Disto...
*/
const greeting = &lt;div&gt;Alô React!&lt;/div&gt;;

/* ...para isto: */
"use strict";

const greeting = /*#__PURE__*/React.createElement("div", null, "Alô, React!");</code></pre><p>O JSX difere do HTML de várias maneiras importantes:</p><pre><code class="language-js">/* 
  Podemos escrever JSX como se fosse HTML simples, mas na verdade ele é feito usando funções JavaScript.
  Como o JSX é JavaScript, e não HTML, há algumas diferenças:

  1) Alguns atributos JSX têm nomes diferentes dos atributos HTML. Por quê? Porque algumas palavras de atributos são palavras reservadas em JavaScript, como 'class' (classe). Em vez de class, o JSX usa 'className'.

  Além disso, como o JSX é JavaScript, os atributos que consistem em várias palavras são escritos em camelcase:
*/

&lt;div id="header"&gt;
  &lt;h1 className="title"&gt;Alô, React!&lt;/h1&gt;
&lt;/div&gt;

/* 
  2) Os elementos JSX que consistem em apenas uma única tag (ou seja, elementos input, img, br) devem ser fechados com uma barra à direita para serem válidos (/): 
*/

&lt;input type="email" /&gt; // &lt;input type="email"&gt; é um erro de sintaxe

/* 
  3) Os elementos JSX que consistem em uma tag de abertura e de fechamento (ou seja, div, span, elemento de botão) devem ter ambas ou ser fechados com uma barra à direita. Como no item 2) acima, é um erro de sintaxe ter um elemento não encerrado. 
*/

&lt;button&gt;Clique aqui&lt;/button&gt; // somente &lt;button&gt; ou &lt;/button&gt; geram um erro de sintaxe
&lt;button /&gt; // vazio, mas também válido</code></pre><p>Estilos em linha podem ser adicionados aos elementos JSX usando o atributo <code>style</code>. Os estilos são atualizados em um objeto, e não em um conjunto de aspas duplas, como no HTML.</p><p>Observe que os nomes das propriedades de estilo também devem ser escritos em <em>camelcase</em>.</p><pre><code class="language-js">/* 
  As propriedades que aceitam valores de pixel (como largura, altura, preenchimento, margem etc.) podem usar números inteiros em vez de cadeias de caracteres.
  Por exemplo: fontSize: 22. Em vez de: fontSize: "22px"
*/
&lt;h1 style={{ color: 'blue', fontSize: 22, padding: '0.5em 1em' }}&gt;
  Alô, React!
&lt;/h1&gt;</code></pre><p>Os elementos JSX são expressões JavaScript e podem ser usados como tal. O JSX nos dá todo o poder do JavaScript diretamente em nossa interface de usuário.</p><pre><code class="language-js">/* 
  Os elementos JSX são expressões (resultam em um valor) e, portanto, podem ser atribuídos a variáveis JavaScript simples... 
*/
const greeting = &lt;div&gt;Alô, React!&lt;/div&gt;;

const isNewToReact = true;

// ... ou pode ser exibido condicionalmente
function sayGreeting() {
  if (isNewToReact) {
    // ... ou retornado de funções, etc.
    return greeting; // exibe: Alô, React!
  } else {
    return &lt;div&gt;Olá novamente, React&lt;/div&gt;;
  }
}</code></pre><p>O JSX nos permite inserir (ou incorporar) expressões JavaScript simples usando a sintaxe de chaves:</p><pre><code class="language-js">const year = 2021;

/* Podemos inserir valores JS primitivos (ou seja, strings, números, booleanos) entre chaves: {} */
const greeting = &lt;div&gt;Alô, React, em {year}&lt;/div&gt;;

/* Também podemos inserir expressões que resultam em um valor primitivo: */
const goodbye = &lt;div&gt;Adeus ano velho: {year - 1}&lt;/div&gt;

/* As expressões também podem ser usadas para atributos de elementos */
const className = 'title';
const title = &lt;h1 className={className}&gt;Meu título&lt;/h1&gt;

/* Observação: tentar inserir valores de objetos (por exemplo: objetos, arrays, maps) entre chaves resultará em um erro */</code></pre><p>O JSX nos permite aninhar elementos uns nos outros, como faríamos com o HTML.</p><pre><code class="language-js">/* 
  Para escrever JSX em várias linhas, coloque entre parênteses: ()
  As expressões JSX que abrangem várias linhas são chamadas de expressões multilinhas
*/

const greeting = (
  // div é o elemento pai
  &lt;div&gt;
    {/* h1 e p são elementos filhos */}
    &lt;h1&gt;Alô!&lt;/h1&gt;
    &lt;p&gt;Bem vindo ao React&lt;/p&gt;
  &lt;/div&gt;
);
/* 'pais' e 'filhos' são a forma como descrevemos os elementos JSX em relação
uns com os outros, como se estivéssemos falando de elementos HTML */</code></pre><p>Os comentários em JSX são escritos como comentários JavaScript de várias linhas, escritos entre chaves, como este:</p><pre><code class="language-js">const greeting = (
  &lt;div&gt;
    {/* Este é um comentário de uma única linha */}
  	&lt;h1&gt;Alô!&lt;/h1&gt;
    	&lt;p&gt;Bem vindo ao React&lt;/p&gt;
    {/* Este é 
    	um comentário
        de várias linhas */} 
  &lt;/div&gt;
);</code></pre><p>Todas as aplicações em React exigem três coisas:</p><ol><li><code>ReactDOM.render()</code>: usado para renderizar (exibir) nossa aplicação, montando-a em um elemento HTML</li><li>Um elemento JSX: chamado de "nó raiz", porque é a raiz da nossa aplicação. Em outras palavras, ao renderizá-lo, renderizará também todos os filhos dentro dele</li><li>Um elemento HTML (DOM): onde a aplicação é inserida em uma página HTML. O elemento geralmente é uma div com um id de valor "root", localizado em um arquivo index.html.</li></ol><pre><code class="language-js">// Os pacotes podem ser instalados localmente ou trazidos por meio de um link de um CDN (adicionado ao cabeçalho do documento HTML)
import React from "react";
import ReactDOM from "react-dom";

// O nó raiz (geralmente um componente) é mais frequentemente chamado de "App"
const App = &lt;h1&gt;Alô, React!&lt;/h1&gt;;

// ReactDOM.render(nó raiz, elemento HTML)
ReactDOM.render(App, document.getElementById("root"));</code></pre><h3 id="componentes-e-props"><strong>Componentes e <em>props</em></strong></h3><p>O JSX pode ser agrupado em funções individuais chamadas <strong><strong>componentes</strong></strong>.</p><p>Há dois tipos de componentes no React: <strong><strong>componentes de função</strong></strong> e <strong><strong>componentes de classe</strong></strong>.</p><p>Os nomes de componentes, sejam para componentes de função ou de classe, são capitalizados para distingui-los das funções JavaScript simples que não retornam JSX:</p><pre><code class="language-js">import React from "react";

/* 	
  Componente de função
  Observe o nome da função capitalizado: 'Header', e não 'header'
*/
function Header() {
  return &lt;h1&gt;Alô, React&lt;/h1&gt;;
}

// Os componentes de função que usam uma sintaxe de arrow function também são válidos
const Header = () =&gt; &lt;h1&gt;Alô, React&lt;/h1&gt;;

/* 
  Componente de classe
  Os componentes de classe têm mais boilerplate (observe a palavra-chave 'extends' e o método 'render'.)
*/
class Header extends React.Component {
  render() {
    return &lt;h1&gt;Alô, React&lt;/h1&gt;;
  }
}</code></pre><p>Os componentes, apesar de serem funções, não são chamados como funções JavaScript comuns. Eles são executados ao renderizá-los como faríamos com o JSX em nossa aplicação.</p><pre><code class="language-js">// Chamamos esse componente de função como uma função normal?

// Não, para executá-las e exibir o JSX que elas retornam...
const Header = () =&gt; &lt;h1&gt;Alô, React&lt;/h1&gt;;

// ...usamos como elementos JSX 'personalizados'.
ReactDOM.render(&lt;Header /&gt;, document.getElementById("root"));
// renderiza: &lt;h1&gt;Alô, React&lt;/h1&gt;</code></pre><p>A grande vantagem dos componentes é sua capacidade de serem reutilizados em todas as aplicações, sempre que necessário.</p><p>Como os componentes aproveitam o poder das funções JavaScript, podemos passar dados logicamente para eles, como faríamos ao passar um ou mais argumentos.</p><pre><code class="language-js">/* 
  Os componentes Header e Footer podem ser reutilizados em qualquer página da nossa aplicação.
  Os componentes eliminam a necessidade de reescrever o mesmo JSX várias vezes.
*/

// Componente IndexPage, visível na rota '/' de nosso aplicativo
function IndexPage() {
  return (
    &lt;div&gt;
      &lt;Header /&gt;
      &lt;Hero /&gt;
      &lt;Footer /&gt;
    &lt;/div&gt;
  );
}

// Componente AboutPage, visível na rota '/about'.
function AboutPage() {
  return (
    &lt;div&gt;
      &lt;Header /&gt;
      &lt;About /&gt;
      &lt;Testimonials /&gt;
      &lt;Footer /&gt;
    &lt;/div&gt;
  );
}</code></pre><p>Os dados passados aos componentes em JavaScript são chamados de <strong><strong>props</strong></strong>. As <em>props</em> são idênticas aos atributos dos elementos JSX/HTML simples, mas você pode acessar seus valores dentro do próprio componente.</p><p><em>Props</em> estão disponíveis nos parâmetros do componente para o qual são passadas. <em>Props</em> são sempre incluídas como propriedades de um objeto.</p><pre><code class="language-js">/* 
  O que fazemos se quisermos passar dados personalizados para o nosso componente a partir de um componente pai?
  Por exemplo, para exibir o nome do usuário no cabeçalho da aplicação.
*/

const username = "John";

/* 
  Para isso, adicionamos 'atributos' personalizados ao nosso componente, chamados props.
  Podemos adicionar muitos deles como quisermos e dar a eles nomes adequados aos dados que passamos.
Para passar o nome do usuário para o cabeçalho, usamos uma prop que chamamos apropriadamente de 'username'
*/
ReactDOM.render(
  &lt;Header username={username} /&gt;,
  document.getElementById("root")
);
// Chamamos essa prop de 'username', mas podemos usar qualquer identificador válido que daríamos, por exemplo, uma variável JavaScript

// props é o objeto que cada componente recebe como argumento
function Header(props) {
  // as props que criamos no componente (username)
  // se tornam propriedades no objeto props
  return &lt;h1&gt;Hello {props.username}&lt;/h1&gt;;
}</code></pre><p>As props nunca devem ser alteradas diretamente no componente filho.</p><p>Outra maneira de dizer isso é que as props nunca devem sofrer <strong><strong>mutação</strong></strong>, pois são um objeto JavaScript simples.</p><pre><code class="language-js">/* 
  Os componentes devem operar como funções 'puras'.
  Ou seja, para cada entrada, devemos poder esperar o mesmo resultado.
  Isso significa que não podemos alterar o objeto props, apenas ler a partir dele.
*/

// Não podemos modificar o objeto props :
function Header(props) {
  props.username = "Doug";

  return &lt;h1&gt;Hello {props.username}&lt;/h1&gt;;
}
/* 
  O que faríamos se quiséssemos modificar um valor de prop que é passado para o nosso componente?
  É nesse caso que usaríamos o state (consulte a seção useState).
*/</code></pre><p>A prop de <strong><strong>filhos</strong></strong> é útil se quisermos passar elementos/componentes como props para outros componentes.</p><pre><code class="language-js">// Podemos aceitar elementos (ou componentes) React como props?
// Sim, por meio de uma propriedade especial no objeto props chamada 'children'

function Layout(props) {
  return &lt;div className="container"&gt;{props.children}&lt;/div&gt;;
}

// A propriedade children é muito útil para quando você deseja que o mesmo
// componente (como um componente Layout) para envolver todos os outros componentes:
function IndexPage() {
  return (
    &lt;Layout&gt;
      &lt;Header /&gt;
      &lt;Hero /&gt;
      &lt;Footer /&gt;
    &lt;/Layout&gt;
  );
}

// página diferente, mas usa o mesmo componente Layout (graças à prop children)
function AboutPage() {
  return (
    &lt;Layout&gt;
      &lt;About /&gt;
      &lt;Footer /&gt;
    &lt;/Layout&gt;
  );
}</code></pre><p>Mais uma vez, como os componentes são expressões JavaScript, podemos usá-los em combinação com instruções <em>if-else</em> e <em>switch</em> para exibir conteúdo de modo condicional, como neste exemplo:</p><pre><code class="language-js">function Header() {
  const isAuthenticated = checkAuth();
    
  /* se o usuário estiver autenticado, mostrar a aplicação autenticada; caso contrário, a aplicação não autenticado */
  if (isAuthenticated) {
    return &lt;AuthenticatedApp /&gt;   
  } else {
    /* Como alternativa, podemos eliminar a seção else e fornecer um simples retorno, e a condicional funcionará da mesma maneira */
    return &lt;UnAuthenticatedApp /&gt;   
  }
}</code></pre><p>Para usar condições no JSX retornado de um componente, você pode usar o operador ternário ou o curto-circuito (operadores &amp;&amp; e ||).</p><pre><code class="language-js">function Header() {
  const isAuthenticated = checkAuth();

  return (
    &lt;nav&gt;
      {/* Se isAuth for verdadeiro, não mostrará nada. Se for falso, mostre Logo  */}
      {isAuthenticated || &lt;Logo /&gt;}
      {/* Se isAuth for verdadeiro, exibirá AuthenticatedApp. Se for falso, exibirá Login  */}
      {isAuthenticated ? &lt;AuthenticatedApp /&gt; : &lt;LoginScreen /&gt;}
      {/* Se isAuth for verdadeiro, exibirá o Footer. Se for falso, não mostrará nada */}
      {isAuthenticated &amp;&amp; &lt;Footer /&gt;}
    &lt;/nav&gt;
  );
}</code></pre><p><em><strong>F<strong>ragments</strong></strong> </em>são componentes especiais para exibir vários componentes sem adicionar um elemento extra ao DOM. Eles são ideais para a lógica condicional que tem vários componentes ou elementos adjacentes.</p><pre><code class="language-js">/*
  Podemos aprimorar a lógica do exemplo anterior.
  Se isAuthenticated for verdadeiro, como exibimos os componentes AuthenticatedApp e Footer?
*/
function Header() {
  const isAuthenticated = checkAuth();

  return (
    &lt;nav&gt;
      &lt;Logo /&gt;
      {/* 
        Podemos renderizar os dois componentes com um fragment. 
        Fragments são muito concisos: &lt;&gt; &lt;/&gt;
      */}
      {isAuthenticated ? (
        &lt;&gt;
          &lt;AuthenticatedApp /&gt;
          &lt;Footer /&gt;
        &lt;/&gt;
      ) : (
        &lt;Login /&gt;
      )}
    &lt;/nav&gt;
  );
}
/* 
  Observação: uma sintaxe alternativa para fragments é React.Fragment:
  &lt;React.Fragment&gt;
     &lt;AuthenticatedApp /&gt;
     &lt;Footer /&gt;
  &lt;/React.Fragment&gt;
*/</code></pre><h3 id="listas-e-chaves"><strong>Listas e chaves</strong></h3><p>Use a função <strong><strong>.map()</strong></strong> para converter listas de dados (<em>arrays</em>) em listas de elementos.</p><pre><code class="language-js">const people = ["John", "Bob", "Fred"];
const peopleList = people.map(person =&gt; &lt;p&gt;{person}&lt;/p&gt;);
</code></pre><p><code>.map()</code> pode ser usado para componentes, bem como para elementos JSX simples.</p><pre><code class="language-js">function App() {
  const people = ['John', 'Bob', 'Fred'];
  // pode interpolar a lista retornada de elementos em {}
  return (
    &lt;ul&gt;
      {/* estamos passando cada elemento do array como props para Person */}
      {people.map(person =&gt; &lt;Person name={person} /&gt;}
    &lt;/ul&gt;
  );
}

function Person({ name }) {
  // acessamos a propriedade 'name' diretamente usando a desestruturação de objetos
  return &lt;p&gt;This person's name is: {name}&lt;/p&gt;;
}</code></pre><p>Cada elemento do React em uma lista de elementos precisa de uma <strong><strong><em>key prop</em></strong></strong> especial. As <em>keys </em>são essenciais para que o React possa manter o controle de cada elemento que está sendo iterado com a função <code>.map()</code>.</p><p>O React usa <em>keys</em> (em português, chaves) para atualizar com desempenho elementos individuais quando seus dados são alterados (em vez de renderizar novamente a lista inteira).</p><p>As <em>keys </em>precisam ter valores únicos para que seja possível identificar cada uma delas de acordo com o valor da <em>key</em>.</p><pre><code class="language-js">function App() {
  const people = [
    { id: 'Ksy7py', name: 'John' },
    { id: '6eAdl9', name: 'Bob' },
    { id: '6eAdl9', name: 'Fred' },
  ];

  return (
    &lt;ul&gt;
      {/* as chaves precisam ser valores primitivos, de preferência uma string exclusiva, como um ID */}
      {people.map(person =&gt;
         &lt;Person key={person.id} name={person.name} /&gt;
      )}
    &lt;/ul&gt;
  );
}

// Se você não tiver alguns IDs em seu conjunto de dados que sejam valores únicos e primitivos, use o segundo parâmetro de .map() para obter o índice de cada elemento.

function App() {
  const people = ['John', 'Bob', 'Fred'];

  return (
    &lt;ul&gt;
      {/* usar o índice do elemento do array como chave */}
      {people.map((person, i) =&gt; &lt;Person key={i} name={person} /&gt;)}
    &lt;/ul&gt;
  );
}</code></pre><h3 id="ouvintes-de-eventos-e-tratamento-de-eventos">Ouvintes de eventos e tratamento de evento<strong>s</strong></h3><p>A escuta de eventos em elementos JSX em contraste com elementos HTML difere em alguns aspectos importantes.</p><p>Primeiro, você não pode ouvir eventos em componentes do React – somente em elementos JSX. Adicionar uma propriedade chamada <code>onClick</code>, por exemplo, a um componente do React seria apenas outra propriedade adicionada ao objeto <em>props</em>.</p><pre><code class="language-js">/* 
  A convenção para a maioria das funções de manipulador de eventos é prefixá-las com a palavra 'handle' e, em seguida, com a ação que elas executam (por exemplo, handleToggleTheme)
*/
function handleToggleTheme() {
  // código para alternar o tema da aplicação
}

/* Em HTML, onclick está todo em letras minúsculas, e o manipulador de eventos inclui um conjunto de parênteses após ser referenciado */
&lt;button onclick="handleToggleTheme()"&gt;
  Alterar o tema
&lt;/button&gt;

/* 
  Em JSX, onClick é camelcase, como os atributos / props.
  Também passamos uma referência à função com chaves.
*/
&lt;button onClick={handleToggleTheme}&gt;
  Alterar o tema
&lt;/button&gt;</code></pre><p>Os eventos do React mais importantes a serem conhecidos são <code>onClick</code>, <code>onChange</code> e <code>onSubmit</code>.</p><ul><li><code>onClick</code> lida com eventos de clique em elementos JSX (ou seja, em botões)</li><li><code>onChange</code> trata de eventos de teclado (ou seja, um usuário digitando em um campo de input ou textarea)</li><li><code>onSubmit</code> trata os envios de formulários do usuário</li></ul><pre><code class="language-js">function App() {
  function handleInputChange(event) {
    /* Ao passar a função para um manipulador de eventos, como onChange, obtemos acesso aos dados sobre o evento (um objeto) */
    const inputText = event.target.value; // texto digitado no input
    const inputName = event.target.name; // 'email' do atributo name
  }

  function handleClick(event) {
    /* O onClick normalmente não precisa de dados de eventos, mas também recebe dados de eventos que podemos usar */
    console.log('clicked!');
    const eventType = event.type; // "click"
    const eventTarget = event.target; // &lt;button&gt;Enviar&lt;/button&gt;
  }
    
  function handleSubmit(event) {
    /* 
     Quando pressionarmos o botão de retorno, o formulário será enviado, assim como quando um botão com type=“submit” for clicado.
     Chamamos event.preventDefault() para evitar que o comportamento padrão do formulário ocorra, que é enviar uma solicitação HTTP e recarregar a página.
    */
    event.preventDefault();
    const formElements = event.target.elements; // acessar todos os elementos do formulário
    const inputValue = event.target.elements.emailAddress.value; // acessar o valor do elemento de entrada com o id “emailAddress”
  }

  return (
    &lt;form onSubmit={handleSubmit}&gt;
      &lt;input id="emailAddress" type="email" name="email" onChange={handleInputChange} /&gt;
      &lt;button onClick={handleClick}&gt;Enviar&lt;/button&gt;
    &lt;/form&gt;
  );
}
</code></pre><h2 id="hooks-essenciais-do-react-1">Hooks essenciais do React</h2><h3 id="state-e-usestate"><strong><em>State</em> e useState</strong></h3><p>O hook <code>useState</code> nos fornece o <em>state</em> (em português, estado) em um componente de função. <strong><strong>O </strong><em>state</em></strong> nos permite acessar e atualizar determinados valores em nossos componentes ao longo do tempo.</p><p>O <em>state</em> do componente local é gerenciado pelo hook <code>useState</code> do React, que nos fornece uma variável de <em>state</em> e uma função que nos permite atualizá-la.</p><p>Quando chamamos <code>useState</code>, podemos dar ao nosso <em>state</em> um valor padrão, fornecendo-o como o primeiro argumento quando chamamos <code>useState</code>.</p><pre><code class="language-js">import React from 'react';

/* 
  Como você cria uma variável do state?
  Syntax: const [stateVariable] = React.useState(defaultValue);
*/
function App() {
  const [language] = React.useState('JavaScript');
  /* 
    Usamos a desestruturação do array para declarar a variável do state.
    Como qualquer variável, declaramos que podemos dar a ela o nome que quisermos (neste caso, 'language').
  */

  return &lt;div&gt;Estou aprendendo {language}&lt;/div&gt;;
}</code></pre><p>Observação: qualquer <em>hook</em> nesta seção é da biblioteca principal do React e pode ser importado individualmente.</p><pre><code class="language-js">import React, { useState } from "react";

function App() {
  const [language] = useState("javascript");

  return &lt;div&gt;Estou aprendendo {language}&lt;/div&gt;;
}</code></pre><p><code>useState</code> também nos fornece uma função 'setter' para atualizar o <em>state</em> depois que ele é criado.</p><pre><code class="language-js">function App() {
  /* 
   A função setter é sempre o segundo valor desestruturado.
   A convenção de nomenclatura da função setter deve ser prefixada com 'set'.
  */
  const [language, setLanguage] = React.useState("javascript");

  return (
    &lt;div&gt;
      &lt;button onClick={() =&gt; setLanguage("python")}&gt;
        Aprenda Python
      &lt;/button&gt;
      {/*  
        Por que usar uma arrow function em linha aqui em vez de chamá-la imediatamente assim: onClick={setterFn()}? 
        Se fosse assim, setLanguage seria chamado imediatamente e não quando o usuário clicasse no botão.
        */}
      &lt;p&gt;Agora estou aprendendo {language}&lt;/p&gt;
    &lt;/div&gt;
  );
}

/* 
 Observação: sempre que a função setter é chamada, o state é atualizado,
 e o componente da aplicação é renderizado novamente para exibir o novo state.
 Sempre que o state for atualizado, o componente será renderizado novamente.
*/</code></pre><p><code>useState</code> pode ser usado uma ou várias vezes em um único componente. Ele pode aceitar valores primitivos ou objetos para gerenciar o <em>state</em>.</p><pre><code class="language-js">function App() {
  const [language, setLanguage] = React.useState("python");
  const [yearsExperience, setYearsExperience] = React.useState(0);

  return (
    &lt;div&gt;
      &lt;button onClick={() =&gt; setLanguage("javascript")}&gt;
        Alterar a linguagem para JS
      &lt;/button&gt;
      &lt;input
        type="number"
        value={yearsExperience}
        onChange={event =&gt; setYearsExperience(event.target.value)}
      /&gt;
      &lt;p&gt;Agora estou aprendendo {language}&lt;/p&gt;
      &lt;p&gt;Eu tenho {yearsExperience} anos de experiência&lt;/p&gt;
    &lt;/div&gt;
  );
}</code></pre><p>Se o novo <em>state</em> depender do anterior, para garantir que a atualização seja feita de maneira confiável, podemos usar uma função dentro da função <em>setter</em> que nos forneça o <em>state</em> anterior correto.</p><pre><code class="language-js">/* Temos a opção de organizar o state usando o tipo de dado mais adequado, de acordo com os dados que estamos gerenciando */
function App() {
  const [developer, setDeveloper] = React.useState({
    language: "",
    yearsExperience: 0
  });

  function handleChangeYearsExperience(event) {
    const years = event.target.value;
    /* Devemos passar o objeto de state anterior que tínhamos com o operador spread para distribuir todas as suas propriedades */
    setDeveloper({ ...developer, yearsExperience: years });
  }

  return (
    &lt;div&gt;
      {/* Não há necessidade de obter o state anterior aqui; estamos substituindo o objeto inteiro */}
      &lt;button
        onClick={() =&gt;
          setDeveloper({
            language: "javascript",
            yearsExperience: 0
          })
        }
      &gt;
        Alterar a linguagem para JS
      &lt;/button&gt;
      {/* Também podemos passar uma referência para a função */}
      &lt;input
        type="number"
        value={developer.yearsExperience}
        onChange={handleChangeYearsExperience}
      /&gt;
      &lt;p&gt;Agora estou aprendendo {developer.language}&lt;/p&gt;
      &lt;p&gt;Eu tenho {developer.yearsExperience} anos de experiência&lt;/p&gt;
    &lt;/div&gt;
  );
}</code></pre><p>Se você estiver gerenciando vários valores primitivos, usar <code>o useState</code> várias vezes geralmente é melhor do que usá-lo uma vez com um objeto. Você não precisa se preocupar em esquecer de combinar o <em>state</em> antigo com o novo.</p><pre><code class="language-js">function App() {
  const [developer, setDeveloper] = React.useState({
    language: "",
    yearsExperience: 0,
    isEmployed: false
  });

  function handleToggleEmployment(event) {
    /* Obtemos o valor da variável do state anterior nos parâmetros.
       Podemos nomear 'prevState' como quisermos.
    */
    setDeveloper(prevState =&gt; {
      return { ...prevState, isEmployed: !prevState.isEmployed };
      // É essencial retornar o novo estado a partir dessa função
    });
  }

  return (
    &lt;button onClick={handleToggleEmployment}&gt;Alternar status de emprego&lt;/button&gt;
  );
}
</code></pre><h3 id="efeitos-colaterais-e-useeffect">Efeitos colaterais e <strong>useEffect</strong></h3><p><code>useEffect</code> nos permite executar efeitos colaterais em componentes de função. Então, o que são efeitos colaterais?</p><p><strong>E<strong>feitos colaterais</strong></strong> ocorrem quando precisamos entrar em contato com o mundo externo. Por exemplo, buscar dados de uma API ou trabalhar com o DOM.</p><p>São ações que podem alterar o <em>state</em> do nosso componente de modo imprevisível (causando 'efeitos colaterais').</p><p><code>useEffect</code> aceita uma função de <em>callback</em> (chamada de função de 'efeito') que, por padrão, será executada sempre que houver uma nova renderização.</p><p>Ela é executada quando nosso componente é montado, que é o momento certo para executar um efeito colateral no ciclo de vida do componente.</p><pre><code class="language-js">/* O que o nosso código faz? Escolhe uma cor do array de cores e a transforma em cor de fundo */
import React, { useState, useEffect } from 'react';

function App() {
  const [colorIndex, setColorIndex] = useState(0);
  const colors = ["blue", "green", "red", "orange"];

  /* 
    Estamos causando um 'efeito colateral', pois estamos trabalhando com uma API.
    Estamos trabalhando com o DOM, uma API do navegador fora do React.
  */
  useEffect(() =&gt; {
    document.body.style.backgroundColor = colors[colorIndex];
  });
  /* Sempre que o state é atualizado, a aplicação é renderizada novamente e o useEffect é executado */

  function handleChangeColor() {
    /* Esse código pode parecer complexo, mas tudo o que ele faz é ir para a próxima cor no array 'colors' e, se estiver na última cor, voltar ao início */
    const nextIndex = colorIndex + 1 === colors.length ? 0 : colorIndex + 1;
    setColorIndex(nextIndex);
  }

  return (
    &lt;button onClick={handleChangeColor}&gt;
      Alterar a cor do fundo
    &lt;/button&gt;
  );
}</code></pre><p>Para evitar a execução da chamada da <em>callback</em> do efeito após cada renderização, fornecemos um segundo argumento, um <em>array</em> vazio.</p><pre><code class="language-js">function App() {
  ...
  /* 
    Com um array vazio, nosso botão não funciona, não importa quantas vezes clicarmos nele... 
    A cor de fundo é definida apenas uma vez, quando o componente é montado pela primeira vez.
  */
  useEffect(() =&gt; {
    document.body.style.backgroundColor = colors[colorIndex];
  }, []);

  /* 
    Como evitar que a função de efeito seja executada a cada atualização de estado e, ainda assim, fazer com que ela funcione sempre que o botão for clicado?
  */

  return (
    &lt;button onClick={handleChangeIndex}&gt;
      Alterar a cor do fundo
    &lt;/button&gt;
  );
}</code></pre><p><code>useEffect</code> nos permite executar efeitos condicionalmente com o <em>array </em>de dependências.</p><p>Um <strong><em>array</em> <strong>de dependências</strong></strong> é o segundo argumento e, se qualquer um dos valores do <em>array </em>for alterado, a função de efeito será executada novamente.</p><pre><code class="language-js">function App() {
  const [colorIndex, setColorIndex] = React.useState(0);
  const colors = ["blue", "green", "red", "orange"];

  /* 
    Vamos adicionar colorIndex ao nosso array de dependências
    Quando o colorIndex for alterado, o useEffect executará a função de efeito novamente
  */
  useEffect(() =&gt; {
    document.body.style.backgroundColor = colors[colorIndex];
    /* 
      Quando usamos o useEffect, precisamos pensar em quais valores de state
      queremos que nosso efeito colateral seja sincronizado
    */
  }, [colorIndex]);

  function handleChangeIndex() {
    const next = colorIndex + 1 === colors.length ? 0 : colorIndex + 1;
    setColorIndex(next);
  }

  return (
    &lt;button onClick={handleChangeIndex}&gt;
      Alterar a cor do fundo
    &lt;/button&gt;
  );
}</code></pre><p><code>useEffect</code> nos permite cancelar a assinatura de determinados efeitos retornando uma função no final.</p><pre><code class="language-js">function MouseTracker() {
  const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });

  React.useEffect(() =&gt; {
    // .addEventListener() configura um ouvinte ativo...
    window.addEventListener("mousemove", handleMouseMove);

    /* ...Portanto, quando saímos desta página, ele precisa ser
       removido para parar de ouvir. Caso contrário, ele tentará definir o
       state em um componente que não existe (causando um erro)

     Cancelamos a inscrição de todas as inscrições/ouvintes com essa “função de limpeza”)
     */
    return () =&gt; {
      window.removeEventListener("mousemove", handleMouseMove);
    };
  }, []);

function handleMouseMove(event) {
   setMousePosition({
     x: event.pageX,
     y: event.pageY
   });
}

  return (
    &lt;div&gt;
      &lt;h1&gt;A posição atual do mouse é:&lt;/h1&gt;
      &lt;p&gt;
        X: {mousePosition.x}, Y: {mousePosition.y}
      &lt;/p&gt;
    &lt;/div&gt;
  );
}</code></pre><p><code>useEffect</code> é o <em>hook </em>a ser usado quando você quiser fazer uma solicitação HTTP (ou seja, uma solicitação GET quando o componente for montado).</p><p>Observe que o tratamento de <em>promises</em> com a sintaxe mais concisa async/await exige a criação de uma função separada. (Por quê? Porque a função de <em>callback</em> do efeito não pode ser assíncrona).</p><pre><code class="language-js">const endpoint = "https://api.github.com/users/reedbarger";

// Usando funções de callback .then() para resolver a promise
function App() {
  const [user, setUser] = React.useState(null);

  React.useEffect(() =&gt; {
    fetch(endpoint)
      .then(response =&gt; response.json())
      .then(data =&gt; setUser(data));
  }, []);
}

// Usando a sintaxe async/ await para resolver a promise:
function App() {
  const [user, setUser] = React.useState(null);
  // não é possível tornar assíncrona a função de callback useEffect
  React.useEffect(() =&gt; {
    getUser();
  }, []);

  // Devemos aplicar a palavra-chave async a uma função separada
  async function getUser() {
    const response = await fetch(endpoint);
    const data = await response.json();
    setUser(data);
  }
}
</code></pre><h3 id="refs-e-useref"><strong>Refs e useRef</strong></h3><p><strong><strong>Refs</strong></strong> são um atributo especial que está disponível em todos os componentes do React. Eles nos permitem criar uma referência a um determinado elemento/componente quando o componente é montado.</p><p>O <code>useRef</code> nos permite usar facilmente as <code>refs</code> do React. Chamamos useRef (na parte superior do componente) e anexamos o valor retornado ao atributo <code>ref</code> do elemento para fazer referência a ele.</p><p>Depois de criarmos uma referência, usamos a propriedade <code>current</code> para modificar (silenciar) as propriedades do elemento ou podemos chamar quaisquer métodos disponíveis nesse elemento (como <code>.focus()</code> para focalizar uma entrada).</p><pre><code class="language-js">function App() {
  const [query, setQuery] = React.useState("react hooks");
  /* Podemos passar um valor padrão para useRef.
     Não precisamos dele aqui, então passamos null para fazer referência a um objeto vazio
  */
  const searchInput = useRef(null);

  function handleClearSearch() {
    /* 
      .current faz referência ao elemento de entrada na montagem
      useRef pode armazenar basicamente qualquer valor em sua propriedade .current
    */
    searchInput.current.value = "";
    searchInput.current.focus();
  }

  return (
    &lt;form&gt;
      &lt;input
        type="text"
        onChange={event =&gt; setQuery(event.target.value)}
        ref={searchInput}
      /&gt;
      &lt;button type="submit"&gt;Buscar&lt;/button&gt;
      &lt;button type="button" onClick={handleClearSearch}&gt;
        Limpar
      &lt;/button&gt;
    &lt;/form&gt;
  );
}
</code></pre><h2 id="hooks-e-desempenho-1"><strong>Hooks e desempenho</strong></h2><h3 id="preven-o-de-novas-renderiza-es-e-react-memo"><strong>Prevenção de novas renderizações e React.memo</strong></h3><p><code>React.memo</code> é uma função que nos permite otimizar o modo como nossos componentes são renderizados.</p><p>Em particular, ela executa um processo chamado <strong><strong>memoização </strong></strong>que nos ajuda a evitar que nossos componentes sejam renderizados novamente quando não for necessário (consulte React.useMemo para obter uma definição mais completa de memoização).</p><p><code>O React.memo</code> ajuda mais a evitar que listas de componentes sejam renderizadas novamente quando seus componentes pai são renderizados novamente.</p><pre><code class="language-js">/* 
  Na aplicação a seguir, estamos mantendo o controle de nossas habilidades de programação. Podemos criar novas habilidades usando uma entrada, e elas são adicionadas à lista (mostrada no componente SkillList). Se clicarmos em uma habilidade, ela será excluída.
*/

function App() {
  const [skill, setSkill] = React.useState('')
  const [skills, setSkills] = React.useState([
    'HTML', 'CSS', 'JavaScript'
  ])

  function handleChangeInput(event) {
    setSkill(event.target.value);
  }

  function handleAddSkill() {
    setSkills(skills.concat(skill))
  }

  return (
    &lt;&gt;
      &lt;input onChange={handleChangeInput} /&gt;
      &lt;button onClick={handleAddSkill}&gt;Adicionar habilidade&lt;/button&gt;
      &lt;SkillList skills={skills} /&gt;
    &lt;/&gt;
  );
}

/* O problema, se você mesmo executar esse código, é que, quando digitamos no input, como o componente pai da SkillList (App) é renderizado novamente, devido à atualização do state a cada pressionamento de tecla, a SkillList é renderizada constantemente (conforme indicado pelo console.log) */

/* No entanto, quando envolvemos o componente SkillList no React.memo (que é uma função de ordem superior, o que significa que ele aceita uma função como argumento), ele não será mais renderizado desnecessariamente quando nosso componente pai o fizer. */
const SkillList = React.memo(({ skills }) =&gt; {
  console.log('renderizando novamente');
  return (
    &lt;ul&gt;
    {skills.map((skill, i) =&gt; &lt;li key={i}&gt;{skill}&lt;/li&gt;)}
    &lt;/ul&gt;
  )
})

export default App</code></pre><h3 id="fun-es-de-callback-e-usecallback"><strong>Funções de <em>callback</em> e useCallback</strong></h3><p><code>useCallback</code> é um <em>hook </em>usado para melhorar o desempenho do nosso componente. <strong>F<strong>un</strong>ções de</strong> <strong><em>c<strong>allback</strong></em><strong> </strong></strong>são os nomes das funções que são "chamadas de volta" em um componente pai.</p><p>O uso mais comum é ter um componente pai com uma variável de <em>state</em>, mas você deseja atualizar esse estado em um componente filho. O que você faz? Você passa uma função de <em>callback</em> para o filho a partir do pai. Isso nos permite atualizar o <em>state</em> no componente pai.</p><p><code>useCallback</code> funciona de maneira semelhante ao <code>React.memo</code>. Ele memoriza as funções de <em>callback</em>, para que não sejam recriadas a cada nova renderização. O uso correto do <code>useCallback</code> pode melhorar o desempenho da nossa aplicação.</p><pre><code class="language-js">/* Vamos manter exatamente a mesma aplicação acima com o React.memo, mas adicionar uma pequena funcionalidade. Vamos permitir a exclusão de uma habilidade quando clicarmos nela. Para fazer isso, precisamos filtrar o array de habilidades de acordo com a habilidade em que clicamos. Para isso, criamos a função handleRemoveSkill no App */

function App() {
  const [skill, setSkill] = React.useState('')
  const [skills, setSkills] = React.useState([
    'HTML', 'CSS', 'JavaScript'
  ])

  function handleChangeInput(event) {
    setSkill(event.target.value);
  }

  function handleAddSkill() {
    setSkills(skills.concat(skill))
  }

  function handleRemoveSkill(skill) {
    setSkills(skills.filter(s =&gt; s !== skill))
  }
    
  /* Em seguida, passamos handleRemoveSkill como uma prop ou, como se trata de uma função, como uma função de callback a ser usada na SkillList */
  return (
    &lt;&gt;
      &lt;input onChange={handleChangeInput} /&gt;
      &lt;button onClick={handleAddSkill}&gt;Adicionar habilidade&lt;/button&gt;
      &lt;SkillList skills={skills} handleRemoveSkill={handleRemoveSkill} /&gt;
    &lt;/&gt;
  );
}

/* Quando tentamos digitar a entrada novamente, vemos uma nova renderização no console toda vez que digitamos. Nossa memoização do React.memo está quebrada! 

O que está acontecendo é que a função de callback handleRemoveSkill está sendo recriada toda vez que a aplicação é renderizada, fazendo com que todos os filhos também sejam renderizados. Precisamos envolver handleRemoveSkill em useCallback e fazer com que ela seja recriada somente quando o valor da habilidade for alterado.

Para corrigir nossa aplicação, substitua handleRemoveSkill por:

const handleRemoveSkill = React.useCallback((skill) =&gt; {
  setSkills(skills.filter(s =&gt; s !== skill))
}, [skills])

Experimente você mesmo!
*/
const SkillList = React.memo(({ skills, handleRemoveSkill }) =&gt; {
  console.log('renderizando novamente');
  return (
    &lt;ul&gt;
    {skills.map(skill =&gt; &lt;li key={skill} onClick={() =&gt; handleRemoveSkill(skill)}&gt;{skill}&lt;/li&gt;)}
    &lt;/ul&gt;
  )
})


export default App</code></pre><h3 id="memoiza-o-e-usememo">Memoização e useMemo</h3><p><code>useMemo</code> é muito semelhante ao <code>useCallback</code> e serve para melhorar o desempenho. Em vez de ser para <em>callbacks</em>, no entanto, ele serve para armazenar os resultados de cálculos custosos.</p><p><code>useMemo</code> nos permite <strong><strong>memoizar</strong></strong> ou lembrar o resultado de cálculos custosos quando eles já foram feitos para determinadas entradas.</p><p>Memoização significa que, se um cálculo já foi feito antes com uma determinada entrada, não há necessidade de fazê-lo novamente, pois já temos o resultado armazenado dessa operação.</p><p><code>useMemo</code> retorna um valor do cálculo, que é então armazenado em uma variável.</p><pre><code class="language-js">/* Com base em nossa aplicação de habilidades, vamos adicionar um recurso para pesquisar nossas habilidades disponíveis por meio de uma entrada de pesquisa adicional. Podemos adicionar isso em um componente chamado SearchSkills (mostrado acima da nossa SkillList).
*/

function App() {
  const [skill, setSkill] = React.useState('')
  const [skills, setSkills] = React.useState([
    'HTML', 'CSS', 'JavaScript', ...milhares de outros itens
  ])

  function handleChangeInput(event) {
    setSkill(event.target.value);
  }

  function handleAddSkill() {
    setSkills(skills.concat(skill))
  }

  const handleRemoveSkill = React.useCallback((skill) =&gt; {
    setSkills(skills.filter(s =&gt; s !== skill))
  }, [skills])
   
  return (
    &lt;&gt;
      &lt;SearchSkills skills={skills} /&gt;
      &lt;input onChange={handleChangeInput} /&gt;
      &lt;button onClick={handleAddSkill}&gt;Adicionar habilidade&lt;/button&gt;
      &lt;SkillList skills={skills} handleRemoveSkill={handleRemoveSkill} /&gt;
    &lt;/&gt;
  );
}

/* Vamos imaginar que temos uma lista de milhares de habilidades que queremos pesquisar. Como podemos encontrar e mostrar de modo eficiente as habilidades que correspondem ao nosso termo de pesquisa à medida que o usuário digita? */
function SearchSkills() {
  const [searchTerm, setSearchTerm] = React.useState('');  
      
  /* Usamos o React.useMemo para memorizar (lembrar) o valor retornado de nossa operação de pesquisa e executá-lo somente quando o searchTerm for alterado */
  const searchResults = React.useMemo(() =&gt; {
    return skills.filter((s) =&gt; s.includes(searchTerm);
  }), [searchTerm]);
    
  function handleSearchInput(event) {
    setSearchTerm(event.target.value);
  }
    
  return (
    &lt;&gt;
    &lt;input onChange={handleSearchInput} /&gt;
    &lt;ul&gt;
      {searchResults.map((result, i) =&gt; &lt;li key={i}&gt;{result}&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/&gt;
  );
}


export default App</code></pre><h2 id="hooks-avan-ados-no-react"><strong>Hooks </strong>avançados no<strong> React </strong></h2><h3 id="contexto-e-usecontext"><strong>Contexto e useContext</strong></h3><p>No React, queremos evitar o seguinte problema de criar várias <em>props</em> para passar dados para dois ou mais níveis abaixo de um componente principal.</p><pre><code class="language-js">/* 
  O React Context nos ajuda a evitar a criação de várias props duplicadas.
  Esse padrão também é chamado de perfuração de props.
*/

/* Nesta aplicação, queremos passar os dados do usuário para o componente Header, mas primeiro eles precisam passar por um componente Main que não os utiliza */
function App() {
  const [user] = React.useState({ name: "Fred" });

  return (
    // Primeira prop 'user'
    &lt;Main user={user} /&gt;
  );
}

const Main = ({ user }) =&gt; (
  &lt;&gt;
    {/* Segunda prop 'user' */}
    &lt;Header user={user} /&gt;
    &lt;div&gt;Conteúdo do Main...&lt;/div&gt;
  &lt;/&gt;
);

const Header = ({ user }) =&gt; &lt;header&gt;Bem vindo, {user.name}!&lt;/header&gt;;</code></pre><p>O contexto é útil para transmitir <em>props </em>em vários níveis de componentes filhos a partir de um componente pai.</p><pre><code class="language-js">/* 
  Aqui está o exemplo anterior reescrito com o Context.
  Primeiro, criamos o contexto, no qual podemos passar os valores padrão.
  Chamamos isso de "UserContext" porque estamos transmitindo dados do usuário
*/
const UserContext = React.createContext();

function App() {
  const [user] = React.useState({ name: "Fred" });

  return (
    {/* 
      Envolvemos o componente pai com a propriedade Provider.
      Passamos os dados pela árvore de componentes na propriedade value.
     */}
    &lt;UserContext.Provider value={user}&gt;
      &lt;Main /&gt;
    &lt;/UserContext.Provider&gt;
  );
}

const Main = () =&gt; (
  &lt;&gt;
    &lt;Header /&gt;
    &lt;div&gt;Conteúdo do app Main&lt;/div&gt;
  &lt;/&gt;
);

/* 
  Não podemos remover as duas propriedades 'user'. Em vez disso, podemos simplesmente usar a propriedade Consumer para consumir os dados onde precisamos deles
*/
const Header = () =&gt; (
    {/* Usamos um padrão chamado render props para obter acesso aos dados */}
    &lt;UserContext.Consumer&gt;
      {user =&gt; &lt;header&gt;Bem vindo, {user.name}!&lt;/header&gt;}
    &lt;/UserContext.Consumer&gt;
);</code></pre><p>O hook <code>useContext</code> nos permite consumir o contexto em qualquer componente de função que seja filho do provedor, em vez de usar o padrão de renderização das <em>props</em>.</p><pre><code class="language-js">function Header() {
  /* Passamos o objeto de contexto inteiro para consumi-lo e podemos remover as tags de Consumer */
  const user = React.useContext(UserContext);
    
  return &lt;header&gt;Bem vindo, {user.name}!&lt;/header&gt;;
};
</code></pre><h3 id="redutores-e-usereducer"><strong>Redutores e useReducer</strong></h3><p>Os redutores são funções simples e previsíveis (puras) que recebem um objeto de <em>state</em> anterior e um objeto de ação e retornam um novo objeto de <em>state</em>.</p><pre><code class="language-js">/* Esse redutor gerencia o state do usuário em nossa aplicação: */

function userReducer(state, action) {
  /* Os redutores geralmente usam um comando switch para atualizar o state de uma maneira ou de outra com base na propriedade de tipo da ação */
    
  switch (action.type) {
    /* Se action.type tiver a string 'LOGIN', obteremos dados do objeto payload na ação */
    case "LOGIN":
      return { 
        username: action.payload.username, 
        email: action.payload.email
        isAuth: true 
      };
    case "SIGNOUT":
      return { 
        username: "",
        email: "",
        isAuth: false 
      };
    default:
      /* Se nenhum caso corresponder à ação recebida, retorne ao state anterior */
      return state;
  }
}</code></pre><p>Redutores são um padrão poderoso para gerenciar <em>states</em>, usado na popular biblioteca de gerenciamento de state do Redux (comumente usada com o React).</p><p>Os redutores podem ser usados no React com o <em>hook</em> <code>useReducer</code> para gerenciar o <em>state</em> em toda a aplicação, em comparação com o useState (que é para o <em>state</em> do componente local).</p><p>O <code>useReducer</code> pode ser combinado com o <code>useContext</code> para gerenciar dados e transmiti-los facilmente entre os componentes.</p><p>Assim, <code>useReducer</code> + <code>useContext</code> pode ser um sistema completo de gerenciamento de <em>state</em> para nossas aplicações.</p><pre><code class="language-js">const initialState = { username: "", isAuth: false };

function reducer(state, action) {
  switch (action.type) {
    case "LOGIN":
      return { username: action.payload.username, isAuth: true };
    case "SIGNOUT":
      // também poderia se espalhar no initialState aqui
      return { username: "", isAuth: false };
    default:
      return state;
  }
}

function App() {
  // useReducer requer uma função redutora para ser usada e um initialState
  const [state, dispatch] = useReducer(reducer, initialState);
  // Obtemos o resultado atual do redutor em 'state'

  // usamos o dispatch para 'despachar' ações, para executar nosso redutor
  // com os dados de que ele precisa (o objeto de ação)
  function handleLogin() {
    dispatch({ type: "LOGIN", payload: { username: "Ted" } });
  }

  function handleSignout() {
    dispatch({ type: "SIGNOUT" });
  }

  return (
    &lt;&gt;
      Usuário atual: {state.username}, isAuthenticated: {state.isAuth}
      &lt;button onClick={handleLogin}&gt;Login&lt;/button&gt;
      &lt;button onClick={handleSignout}&gt;Signout&lt;/button&gt;
    &lt;/&gt;
  );
}</code></pre><h3 id="escrevendo-hooks-personalizados">Escrevendo <em>hooks </em>personalizados</h3><p>Os <em>hooks </em>foram criados para reutilizar facilmente um comportamento entre componentes, da mesma forma que os componentes foram criados para reutilizar a estrutura em nossa aplicação.</p><p>Os <em>hooks </em>nos permitem adicionar funcionalidades personalizadas às nossas aplicações que atendam às nossas necessidades e podem ser combinados com todos os <em>hooks </em>existentes que abordamos.</p><p>Os <em>hooks </em>também podem ser incluídos em bibliotecas de terceiros para o bem de todos os desenvolvedores do React. Há muitas bibliotecas React excelentes que fornecem <em>hooks </em>personalizados, como <code>@apollo/client</code>, <code>react-query</code>, <code>swr</code> e outras.</p><pre><code class="language-js">/* Aqui está um hook personalizado do React chamado useWindowSize que escrevi para calcular o tamanho da janela (largura e altura) de qualquer componente no qual ele é usado */

import React from "react";

export default function useWindowSize() {
  const isSSR = typeof window !== "undefined";
  const [windowSize, setWindowSize] = React.useState({
    width: isSSR ? 1200 : window.innerWidth,
    height: isSSR ? 800 : window.innerHeight,
  });

  function changeWindowSize() {
    setWindowSize({ width: window.innerWidth, height: window.innerHeight });
  }

  React.useEffect(() =&gt; {
    window.addEventListener("resize", changeWindowSize);

    return () =&gt; {
      window.removeEventListener("resize", changeWindowSize);
    };
  }, []);

  return windowSize;
}

/* Para usar o hook, basta importá-lo para onde for necessário, chamá-lo e usar a largura sempre que quisermos ocultar ou mostrar determinados elementos, como em um componente Header. */

// components/Header.js

import React from "react";
import useWindowSize from "../utils/useWindowSize";

function Header() {
  const { width } = useWindowSize();

  return (
    &lt;div&gt;
      {/* visível somente quando a janela for maior que 500px */}
      {width &gt; 500 &amp;&amp; (
        &lt;&gt;
         Maior que 500px!
        &lt;/&gt;
      )}
      {/* visível em qualquer tamanho de janela */}
	  &lt;p&gt;Estou sempre visível&lt;/p&gt;
    &lt;/div&gt;
  );
}</code></pre><h3 id="regras-dos-hooks"><strong>Regras dos hooks</strong></h3><p>Há duas regras essenciais para o uso de <em>hooks </em>do React que não podem ser violadas para que funcionem corretamente:</p><ul><li>Os <em>hooks </em>só podem ser usados em componentes de função (não em funções JavaScript simples ou componentes de classe)</li><li>Os <em>hooks </em>só podem ser chamados na parte superior dos componentes (não podem estar em condicionais, laços ou funções aninhadas)</li></ul><h2 id="conclus-o"><strong><strong><strong>Conclusão</strong></strong></strong></h2><p>Há outros conceitos interessantes que você pode aprender, mas se você se comprometer a aprender os conceitos abordados nesta ficha informativa, terá uma ótima compreensão das partes mais importantes e poderosas da biblioteca do React.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Ep. 47 Cynthia Zanoni - Construindo Carreira com Tecnologia ]]>
                </title>
                <description>
                    <![CDATA[  Neste episódio conversei com Cynthia Zanoni, uma engenheira de software,  fundadora do WoMakersCode e Global Cloud Advocate na Microsoft. Ela compartilha sua jornada na tecnologia, desde os primeiros passos com HTML até se tornar uma líder em cloud computing. Ela fala sobre como seu trabalho impacta a formação de ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/podcast-ep47/</link>
                <guid isPermaLink="false">6797e19a27c9db04432d762f</guid>
                
                    <category>
                        <![CDATA[ podcast ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Nielda Karla ]]>
                </dc:creator>
                <pubDate>Thu, 06 Mar 2025 23:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2025/01/podcast-cover-test--16-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p></p><p>Neste episódio conversei com Cynthia Zanoni, uma engenheira de software, &nbsp;fundadora do <em>WoMakersCode</em> e Global Cloud Advocate na Microsoft. Ela compartilha sua jornada na tecnologia, desde os primeiros passos com HTML até se tornar uma líder em cloud computing. Ela fala sobre como seu trabalho impacta a formação de novos desenvolvedores, a importância da comunidade e seu papel na criação de soluções inovadoras. Além disso, Cynthia compartilha insights sobre a integração de ferramentas como GitHub e Visual Studio Code e como elas podem transformar carreiras na área de tecnologia.</p><p>Boa escuta!</p><hr><p>Obrigada por escutar ao podcast freeCodeCamp em português! Se você achar nosso conteúdo útil, compartilhe-o com seus amigos para ajudar mais pessoas a descobri-lo. Além disso, agradeceríamos muito se puder deixar uma avaliação 5 estrelas na plataforma que você usa para nos ouvir.</p><p>Se quiser nos apoiar ainda mais, você pode fazer isso visitando em <a href="https://www.freecodecamp.org/portuguese/news/podcast-ep09/freeCodeCamp.org/portuguese/donate">freeCodeCamp.org/portuguese/donate</a>.</p><p>Seu apoio é muito importante e nos ajuda a continuar a fornecer recursos educacionais de programação gratuitos.</p><h2 id="-links-de-chyntia"><strong><strong><strong>⭐️<strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Links</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong> de Chyntia </strong></h2><p>🔗 LinkedIn: <a href="https://www.linkedin.com/in/cynthiazanoni/">https://www.linkedin.com/in/cynthiazanoni/</a></p><p>LinkedIn Womakers: <a href="https://www.linkedin.com/company/womakerscode/">https://www.linkedin.com/company/womakerscode/</a></p><p>Womakerscode: <a href="http://maismulheres.tech">maismulheres.tech</a> <a href="https://womakerscode.org/">https://womakerscode.org/</a></p><p>Formação C#: <a href="https://www.freecodecamp.org/portuguese/learn/foundational-c-sharp-with-microsoft/">https://www.freecodecamp.org/portuguese/learn/foundational-c-sharp-with-microsoft/</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Ep: 46 Gustavo Rodarte - Nomadismo e Teoria das bandeiras ]]>
                </title>
                <description>
                    <![CDATA[ No primeiro episódio da quarta temporada tive o prazer de conversar com Gustavo Rodarte, engenheiro de software sênior e fundador do Passaporte Tech. Gustavo compartilha sua jornada no mundo da tecnologia, desde seus primeiros passos até sua transição para o nomadismo digital. Ele fala sobre como equilibrar carreira e vida ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/podcast-ep46-2/</link>
                <guid isPermaLink="false">6797c43c27c9db04432d75fe</guid>
                
                    <category>
                        <![CDATA[ podcast ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Nielda Karla ]]>
                </dc:creator>
                <pubDate>Thu, 06 Feb 2025 23:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2025/01/podcast-cover-test--12--3.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>No primeiro episódio da quarta temporada tive o prazer de conversar com Gustavo Rodarte, engenheiro de software sênior e fundador do <em>Passaporte Tech</em>. Gustavo compartilha sua jornada no mundo da tecnologia, desde seus primeiros passos até sua transição para o nomadismo digital. Ele fala sobre como equilibrar carreira e vida pessoal, a importância de dominar o inglês para oportunidades internacionais, e como a teoria das bandeiras pode ajudar profissionais a otimizar suas escolhas fiscais e de residência. Além de dá dicas sobre como se planejar para trabalhar remotamente enquanto explora o mundo. </p><p>Boa escuta!</p><hr><p>Obrigada por escutar ao podcast freeCodeCamp em português! Se você achar nosso conteúdo útil, compartilhe-o com seus amigos para ajudar mais pessoas a descobri-lo. Além disso, agradeceríamos muito se puder deixar uma avaliação 5 estrelas na plataforma que você usa para nos ouvir.</p><p>Se quiser nos apoiar ainda mais, você pode fazer isso visitando em <a href="https://www.freecodecamp.org/portuguese/news/podcast-ep09/freeCodeCamp.org/portuguese/donate">freeCodeCamp.org/portuguese/donate</a>.</p><p>Seu apoio é muito importante e nos ajuda a continuar a fornecer recursos educacionais de programação gratuitos.</p><h2 id="-links-de-gustavo"><strong><strong><strong>⭐️<strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Links</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong> de Gustavo </strong></h2><p>🔗 LinkedIn: <a href="https://www.linkedin.com/in/gustavorodarte/">⁠https://www.linkedin.com/in/gustavorodarte/⁠</a></p><p>🔗 X: <a href="https://x.com/gustavorodarte_">⁠https://x.com/gustavorodarte_⁠</a></p><h2 id="refer-ncias-">Referências:</h2><p> 🔗Nomad list: <a href="https://nomads.com/">⁠https://nomads.com/⁠</a></p><p>🔗Settee: <a href="https://www.settee.io/">⁠https://www.settee.io/</a></p><p></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Ep. 45 Ícaro Torres - Afinal o que é Quality Assurance? ]]>
                </title>
                <description>
                    <![CDATA[ Nesse episódio recebi o profissional de Quality Assurance (QA) Ícaro Torres, que mora no Reino Unido e atua na área há mais de 17 anos. Ícaro fala sobre o mundo da programação, o que ele vê como essencial em QA, e aborda desde os fundamentos até as técnicas mais avançadas ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/podcast-ep45/</link>
                <guid isPermaLink="false">6734e17603c8da04c615d5fb</guid>
                
                <dc:creator>
                    <![CDATA[ Nielda Karla ]]>
                </dc:creator>
                <pubDate>Thu, 12 Dec 2024 23:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/11/podcast-cover-test--7-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <iframe width="100%" height="180" frameborder="no" scrolling="no" seamless="" src="https://share.transistor.fm/e/8ab6c47e" title="Conteúdo incorporado" loading="lazy"></iframe><!--kg-card-end: html--><p>Nesse episódio recebi o profissional de Quality Assurance (QA) Ícaro Torres, que mora no Reino Unido e atua na área há mais de 17 anos. Ícaro fala sobre o mundo da programação, o que ele vê como essencial em QA, e aborda desde os fundamentos até as técnicas mais avançadas para garantir a qualidade em projetos de software. Também fala sobre a importância dos testes de software, os principais tipos de teste (como exploratório, de regressão e end-to-end), e a relação entre QA e UX. Ícaro também traz insights sobre a cultura de trabalho entre o Brasil e o Reino Unido, o impacto do Brexit no mercado de tecnologia, e nos dá uma visão de como é a rotina de um QA. </p><p>Boa escuta!</p><hr><p>Obrigada por escutar ao podcast freeCodeCamp em português! Se você achar nosso conteúdo útil, compartilhe-o com seus amigos para ajudar mais pessoas a descobri-lo. Além disso, agradeceríamos muito se puder deixar uma avaliação 5 estrelas na plataforma que você usa para nos ouvir.</p><p>Se quiser nos apoiar ainda mais, você pode fazer isso visitando em <a href="https://www.freecodecamp.org/portuguese/news/podcast-ep09/freeCodeCamp.org/portuguese/donate">freeCodeCamp.org/portuguese/donate</a>.</p><p>Seu apoio é muito importante e nos ajuda a continuar a fornecer recursos educacionais de programação gratuitos.</p><h2 id="-links-de-caro"><strong><strong><strong>⭐️<strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Links</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong> de Ícaro </strong></h2><p></p><p>🔗 LinkedIn: <a href="https://www.linkedin.com/in/icarotorres/" rel="noopener noreferrer">https://www.linkedin.com/in/icarotorres/</a></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
